Chặn các liên kết từ trình duyệt để mở ứng dụng Android của tôi


107

Tôi muốn có thể nhắc ứng dụng của mình mở liên kết khi người dùng nhấp vào URL của một mẫu nhất định thay vì cho phép trình duyệt mở liên kết đó. Điều này có thể là khi người dùng đang ở trên một trang web trong trình duyệt hoặc trong ứng dụng email hoặc trong WebView trong một ứng dụng mới được đúc.

Ví dụ: nhấp vào liên kết YouTube từ bất kỳ đâu trong điện thoại và bạn sẽ có cơ hội mở ứng dụng YouTube.

Làm cách nào để đạt được điều này cho ứng dụng của riêng tôi?


Câu trả lời:


141

Sử dụng android.intent.action.VIEW của danh mục android.intent.category.BROWSABLE .

Từ AndroidManifest.xml của ứng dụng Photostream của Romain Guy ,

    <activity
        android:name=".PhotostreamActivity"
        android:label="@string/application_name">

        <!-- ... -->            

        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="http"
                  android:host="flickr.com"
                  android:pathPrefix="/photos/" />
            <data android:scheme="http"
                  android:host="www.flickr.com"
                  android:pathPrefix="/photos/" />
        </intent-filter>
    </activity>

Khi bạn đang ở bên trong hoạt động , bạn cần phải tìm hành động và sau đó làm điều gì đó với URL bạn đã được cung cấp. Các Intent.getData()phương pháp mang đến cho bạn một Uri.

    final Intent intent = getIntent();
    final String action = intent.getAction();

    if (Intent.ACTION_VIEW.equals(action)) {
        final List<String> segments = intent.getData().getPathSegments();
        if (segments.size() > 1) {
            mUsername = segments.get(1);
        }
    }

Tuy nhiên, cần lưu ý rằng ứng dụng này đang lỗi thời một chút (1.2), vì vậy bạn có thể thấy có nhiều cách tốt hơn để đạt được điều này.


8
Một điều cần lưu ý - người dùng của bạn sẽ được lựa chọn sử dụng ứng dụng phù hợp vì tất cả những gì bạn làm là đăng ký ứng dụng của bạn làm trình xử lý. Cá nhân (như người dùng) Tôi đang khó chịu với điều đó mặc dù tôi nhận ra rằng tôi có thể lựa chọn cho "hành động mặc định"
Bostone

1
Điều này không hoạt động đối với Điện thoại HTC. Làm thế nào tôi có thể làm cho nó hoạt động trên điện thoại HTC?
user484691

57
Bạn có thể sẽ muốn sử dụng ý định.getDataString () hơn là getData () nếu bạn quan tâm đến URL đầy đủ bao gồm cả chuỗi truy vấn. Nhận xét này sẽ giúp bạn tiết kiệm giờ nó chỉ chi phí cho tôi ..... :-(
Kenton Giá

Điều này sẽ được gọi cho mọi URL mà người dùng điều hướng đến từ bất kỳ ứng dụng nào hay chỉ trình duyệt gốc?
gonzobrains

1
Từ bất kỳ ứng dụng nào (sử dụng ý định Intent.ACTION_VIEW)
jamesh


0
private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        setUrlparams(url);

        if (url.indexOf("pattern") != -1) {
            // do something
            return false;
        } else {
            view.loadUrl(url);
        }

        return true;
    }

}

4
Cảm ơn. Điều này hữu ích trong bối cảnh bạn sở hữu chế độ xem web. Câu hỏi tôi đặt ra là làm cách nào để ứng dụng của tôi chặn được một cú nhấp chuột vào một liên kết trong bất kỳ ứng dụng nào (ví dụ: trình duyệt).
jamesh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.