การสกัดกั้นลิงก์จากเบราว์เซอร์เพื่อเปิดแอป Android ของฉัน


107

ฉันต้องการแจ้งให้แอปของฉันเปิดลิงก์เมื่อผู้ใช้คลิก URL ของรูปแบบที่กำหนดแทนที่จะอนุญาตให้เบราว์เซอร์เปิด อาจเกิดขึ้นเมื่อผู้ใช้อยู่บนหน้าเว็บในเบราว์เซอร์หรือในโปรแกรมรับส่งเมลหรือภายใน WebView ในแอปที่เพิ่งสร้างใหม่

ตัวอย่างเช่นคลิกลิงก์ YouTube จากที่ใดก็ได้ในโทรศัพท์คุณจะมีโอกาสเปิดแอป YouTube

ฉันจะบรรลุสิ่งนี้สำหรับแอปของตัวเองได้อย่างไร


ดูยังstackoverflow.com/questions/5065982/...
CoolMind

คำตอบ:


141

ใช้ android.intent.action.VIEW ของหมวดหมู่android.intent.category.BROWSABLE

จาก Romain ผู้ชายPhotostreamของแอปAndroidManifest.xml ,

    <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>

เมื่อคุณอยู่ในกิจกรรมคุณต้องมองหาการกระทำจากนั้นทำอะไรบางอย่างกับ URL ที่คุณได้รับมอบมา Intent.getData()วิธีช่วยให้คุณยูริ

    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);
        }
    }

อย่างไรก็ตามควรสังเกตว่าแอปนี้ล้าสมัยไปเล็กน้อย (1.2) ดังนั้นคุณอาจพบว่ามีวิธีที่ดีกว่าในการบรรลุสิ่งนี้


8
สิ่งหนึ่งที่ต้องระวัง - ผู้ใช้ของคุณจะได้รับตัวเลือกในการใช้แอพที่เหมาะสมเนื่องจากคุณเพียงแค่ลงทะเบียนแอพของคุณเป็นตัวจัดการ โดยส่วนตัว (ในฐานะผู้ใช้) ฉันรู้สึกรำคาญกับสิ่งนั้นแม้ว่าฉันจะรู้ว่าฉันสามารถเลือกใช้ "default action" ได้
Bostone

1
สิ่งนี้ใช้ไม่ได้กับโทรศัพท์ HTC ฉันจะทำให้มันทำงานบนโทรศัพท์ HTC ได้อย่างไร?
user484691

57
คุณอาจต้องการใช้ Intent.getDataString () แทน getData () หากคุณสนใจเกี่ยวกับ URL แบบเต็มรวมทั้ง querystring ความคิดเห็นนี้จะช่วยให้คุณประหยัดเวลาเพียงแค่เสียค่าใช้จ่าย ..... :-(
ราคา Kenton

สิ่งนี้จะถูกเรียกสำหรับทุก URL ที่ผู้ใช้ไปมาจากแอพใด ๆ หรือเพียงแค่เบราว์เซอร์ในระบบ?
gonzobrains

1
จากแอปใดก็ได้ (ที่ใช้เจตนาเจตนา ACTION_VIEW)
jamesh

2

มีไลบรารีบางตัวแยกวิเคราะห์พารามิเตอร์จาก url โดยอัตโนมัติ

เช่น

https://github.com/airbnb/DeepLinkDispatch

&&

https://github.com/mzule/ActivityRouter

อันหลังเขียนโดยฉัน ซึ่งสามารถแยกวิเคราะห์พารามิเตอร์เป็นประเภทที่กำหนดไม่ใช่ String เสมอไป

ตัวอย่าง

@Router(value = "main/:id" intExtra = "id")
...
int id = getIntent().getInt("id", 0);

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
ขอบคุณ. สิ่งนี้มีประโยชน์ในบริบทที่คุณเป็นเจ้าของ Webview คำถามที่ฉันถามคือฉันจะให้แอปสกัดกั้นการคลิกลิงก์ในแอปใดก็ได้ (เช่นเบราว์เซอร์) ได้อย่างไร
jamesh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.