สร้างลิงก์ในเบราว์เซอร์ Android เพื่อเริ่มแอพของฉันหรือไม่


229

เป็นไปได้ไหมที่จะสร้างลิงค์เช่น:

<a href="anton://useful_info_for_anton_app">click me!</a>

ทำให้แอป Anton ของฉันเริ่มทำงานหรือไม่

ฉันรู้ว่าสิ่งนี้ใช้ได้กับแอพ Android Market ด้วยโปรโตคอลการตลาด แต่สามารถทำสิ่งที่คล้ายกันกับแอปอื่นได้หรือไม่

นี่คือตัวอย่างของลิงค์ที่จะเริ่มขึ้นใน Android Market:

<a href="market://search?q=pname:com.nytimes.android">click me!</a>

อัปเดต: คำตอบที่ฉันได้รับจาก eldarerathis นั้นใช้งานได้ดี แต่ฉันแค่อยากพูดถึงว่าฉันมีปัญหากับคำสั่งขององค์ประกอบย่อยของ<intent-filter>แท็ก ฉันขอแนะนำให้คุณสร้าง<intent-filter>องค์ประกอบย่อยใหม่ในแท็กนั้นเพื่อหลีกเลี่ยงปัญหาที่ฉันมี ตัวอย่างเช่นAndroidManifest.xmlหน้าตาของฉัน:

<activity android:name=".AntonWorld"
          android:label="@string/app_name">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <data android:scheme="anton" />
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

วิธีนี้แก้ไขปัญหาของฉันเมื่อฉันไม่สามารถเปิดแอปพลิเคชันในมือถือได้
Unomono

9
+1 สำหรับการกล่าวถึงการสั่งซื้อแท็ก xml มันไม่มีเหตุผลอย่างแน่นอนและไม่มีการบันทึกไว้ที่ใด แต่ฉันพบว่าเมื่อฉันมีแท็กข้อมูลด้านล่างแท็กการกระทำและหมวดหมู่มันจะไม่ธรรมดา
อดัม

การเปลี่ยนเส้นทางไปยังแอปและถอยกลับอย่างถูกต้องหากแอปไม่ปรากฏขึ้นอาจเป็นฝันร้ายเช่นกันเนื่องจากความซับซ้อนของเบราว์เซอร์ Android ที่แตกต่างกันทั้งหมด (Chrome, ค่าเริ่มต้น, Webviews, Firefox ฯลฯ ) branch.ioบริการจะช่วยให้ทำเช่นนี้และเป็นอิสระ
Alex Austin

@Anton .... สวัสดีท่าน ... โดยรหัสข้างต้นของฉันฉันเข้าใจที่จะจัดการข้อมูลจากลิงค์ ... คุณช่วยบอกฉันว่าฉันจะสร้างลิงค์ที่มีข้อมูลของฉัน ... โปรดช่วย ฉัน ... ฉันต้องการสร้างลิงก์ที่มีข้อมูลเหตุการณ์การคลิกปุ่ม ..
Ravindra Kushwaha

1
⚠️ฉันสะดุดข้ามการดีบักที่คนอื่นอาจต้องการทราบเช่นกัน: ลิงก์ทำงานจาก <a href=""> ลิงก์ในหน้าเว็บและเมื่อเปิดตัวด้วย adb แต่ตอนนี้เมื่อคุณเพิ่งพิมพ์ URL ในอุปกรณ์เคลื่อนที่ แถบที่อยู่ของเบราว์เซอร์.
โยฮันเนส Brodwall

คำตอบ:


96

ฉันคิดว่าคุณจะต้องการดู<intent-filter>องค์ประกอบของไฟล์ Mainfest ของคุณ ให้ดูที่เอกสารประกอบสำหรับ<data>องค์ประกอบย่อย

โดยทั่วไปสิ่งที่คุณต้องทำคือกำหนดรูปแบบของคุณเอง บางสิ่งบางอย่างตาม:

<intent-filter>
    <data android:scheme="anton" />
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" /> <--Not positive if this one is needed
    ...
</intent-filter>

จากนั้นคุณควรจะสามารถเปิดแอปของคุณด้วยลิงก์ที่ขึ้นต้นด้วยanton:แบบแผน URI


3
ลองดูที่กระทู้นี้ มีตัวอย่างที่ดี: stackoverflow.com/questions/2958701/…
eldarerathis

3
สำหรับการอ้างอิงการเพิ่ม CATEGORY_BROWSABLE หมายความว่า "เบราว์เซอร์สามารถเรียกใช้กิจกรรมเป้าหมายได้อย่างปลอดภัยเพื่อแสดงข้อมูลที่อ้างอิงโดยลิงก์ - ตัวอย่างเช่นรูปภาพหรือข้อความอีเมล"
greg7gkb

3
มันทำงานได้อย่างสมบูรณ์แบบบน Android รุ่นก่อนหน้า แต่ไม่เหมาะสำหรับอมยิ้มวิธีแก้ปัญหาใด ๆ
Salmaan

1
@eldarathathis นี้ใช้งานได้หากแอปพลิเคชันปิดอยู่ แต่หากแอปพลิเคชันทำงานบนพื้นหลังและกิจกรรมนั้นแตกต่างจากตัวกรองเจตนาที่แนบมาฉันไม่สามารถจัดการได้ คุณจัดการสิ่งนี้ให้ทำงานในทุกกิจกรรมได้อย่างไร คุณใส่ตัวกรองเจตนาลงในทั้งหมดหรือไม่
Mustafa Güven

5
คำตอบนี้เป็น outdated..this จะไม่ทำงานโพสต์โครเมี่ยม 40 โครงการที่กำหนดเองได้รับการปิดใช้งานในโครเมี่ยมเนื่องจากปัญหาด้านความปลอดภัย
Utsav Gupta

280

โปรดอย่าใช้รูปแบบที่คุณกำหนดเองเช่นนั้น !!! โครงร่าง URI เป็นเนมสเปซส่วนกลางของเครือข่าย คุณเป็นเจ้าของโครงการ "anton:" ทั่วโลกหรือไม่ ไม่มี? จากนั้นไม่ควรใช้

ทางเลือกหนึ่งคือการมีเว็บไซต์และมีตัวกรองเจตนาสำหรับ URI เฉพาะบนเว็บไซต์นั้น ตัวอย่างเช่นนี่คือสิ่งที่ Market ทำเพื่อสกัดกั้น URIs บนเว็บไซต์:

        <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="market.android.com"
                android:path="/search" />
        </intent-filter>

อีกวิธีหนึ่งคือ "ความตั้งใจ:" โครงการ วิธีนี้ช่วยให้คุณสามารถอธิบายได้ถึงเจตนาใด ๆ ว่าเป็น URI ซึ่งเบราว์เซอร์จะพยายามเปิดใช้งานเมื่อคลิก ในการสร้างรูปแบบดังกล่าววิธีที่ดีที่สุดคือเพียงแค่เขียนโค้ดเพื่อสร้าง Intent ที่คุณต้องการเปิดใช้แล้วพิมพ์ผลลัพธ์ของเจตนาไปยัง URI (Intent.URI_INTENT_SCHEME)

คุณสามารถใช้การกระทำที่มีเจตนานี้เพื่อค้นหากิจกรรมที่สนับสนุนการกระทำนั้น เบราว์เซอร์จะเพิ่มหมวดหมู่ของ BROWSABLE โดยอัตโนมัติก่อนที่จะเปิดใช้งานเพื่อเหตุผลด้านความปลอดภัย นอกจากนี้ยังจะตัดส่วนประกอบที่ชัดเจนใด ๆ ที่คุณระบุด้วยเหตุผลเดียวกัน

วิธีที่ดีที่สุดในการใช้สิ่งนี้หากคุณต้องการให้แน่ใจว่าแอปเปิดตัวเฉพาะแอปของคุณก็คือการกระทำที่กำหนดขอบเขตของคุณเองและใช้ Intent.setPackage () เพื่อบอกว่า Intent จะจับคู่แอปของคุณเท่านั้น

การแลกเปลี่ยนระหว่างสอง:

  • http URIs ต้องการให้คุณมีโดเมนที่คุณเป็นเจ้าของ ผู้ใช้จะได้รับตัวเลือกให้แสดง URI ในเบราว์เซอร์เสมอ มันมีคุณสมบัติย้อนกลับที่ดีมากหากไม่ได้ติดตั้งแอปของคุณพวกเขาจะลงจอดบนเว็บไซต์ของคุณ

  • เจตนา URIs ต้องการให้ติดตั้งแอปของคุณแล้วและบนโทรศัพท์ Android เท่านั้น อนุญาตเกือบเจตนาใด ๆ (แต่มักจะรวมหมวดหมู่ BROWSABLE และไม่สนับสนุนองค์ประกอบที่ชัดเจน) พวกเขาอนุญาตให้คุณควบคุมการเปิดตัวไปยังแอปของคุณโดยที่ผู้ใช้ไม่มีตัวเลือกแทนที่จะไปที่เบราว์เซอร์หรือแอปอื่น ๆ


32
บนมืออื่น ๆ , app ตลาดยังจัดการmarket://การเชื่อมโยง :)
เฟลิกซ์

38
มันเป็นความผิดพลาดที่จะใช้ตลาด: และนี่กำลังถูกลบออก
hackbod

82
เหตุผลที่ผู้คนใช้ชุดรูปแบบที่กำหนดเองใน Android เป็นเพราะส่วนใหญ่ของโครงการได้รับการพัฒนาใน paralel กับ (หรือหลังจาก) รุ่น iPhone และนี่เป็นวิธีเดียวที่จะทำให้มันทำงานที่นั่น ...
LambergaR

12
เห็นด้วยกับ @LambergaR ตอนนี้เราจำเป็นต้องหาวิธีในการสร้างลิงก์ในงานอีเมลใน 3 แพลตฟอร์ม (BB, iphone, Android)
Maragues

7
URI ใด ๆ ที่คุณใส่ไว้ในเว็บเพจของคุณด้วยรูปแบบที่กำหนดเองจะไม่ทำงานบนเว็บเบราว์เซอร์ใด ๆ ที่ไม่ได้ติดตั้งแอปพลิเคชันของคุณไว้ด้วย นั่นดูเหมือนจะไม่หักกับคุณหรือ
hackbod

13

ฉันขอโทษที่โปรโมตตัวเอง แต่ฉันมีปลั๊กอิน jQuery เพื่อเปิดใช้แอพพื้นฐานจากเว็บลิงค์https://github.com/eusonlito/jquery.applink

คุณสามารถใช้งานได้ง่าย:

<script>
$('a[data-applink]').applink();
</script>

<a href="https://facebook.com/me" data-applink="fb://profile">My Facebook Profile</a>

12

ฉันยังประสบปัญหานี้และดูหน้าไร้สาระจำนวนมาก ฉันได้เรียนรู้ว่าการทำให้แอปของคุณสามารถเรียกดูได้เปลี่ยนลำดับขององค์ประกอบ XML สิ่งนี้:

<activity
    android:name="com.example.MianActivityName"
    android:label="@string/title_activity_launcher">

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <intent-filter>                
        <data android:scheme="http" />     
        <!-- or you can use deep linking like  -->               

        <data android:scheme="http" android:host="xyz.abc.com"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <category android:name="android.intent.category.DEFAULT"/>

    </intent-filter>
</activity>

สิ่งนี้ใช้ได้กับฉันและอาจช่วยคุณได้


ฉันเขียนแท็ก XML ในลำดับเดียวกัน แต่ไม่สามารถเปิดกล่องโต้ตอบตัวเลือกเมื่อฉันเขียน URL ของฉันในเบราว์เซอร์ Android
Sunit Kumar Gupta

ฉันไม่เห็นความแตกต่างมากและถ้าฉันใช้อันนี้มันทำงานได้อย่างสมบูรณ์แบบ .. ขอบคุณ :)
Muthu S

6

นี่คือสูตรของฉัน:

สร้าง HTML แบบคงที่ที่เปลี่ยนเส้นทางไปยัง URL แอพที่คุณร้องขอวางหน้านั้นไว้บนเว็บ

ด้วยวิธีนี้ลิงก์ที่คุณแบ่งปันคือลิงก์ 'ของจริง' ที่เกี่ยวข้องกับ Android (ลิงก์เหล่านั้นจะเป็น 'คลิกได้')

คุณแชร์ลิงก์ HTTP ปกติ www.your.server.com/foo/bar.html URL นี้จะส่งคืน HTML บรรทัด 8 บรรทัดแบบง่ายที่เปลี่ยนเส้นทางไปยัง URI ของแอปของคุณ (window.location = "blah: // kuku") ( โปรดทราบว่า 'blah' ไม่จำเป็นต้องเป็น HTTP หรือ HTTPS อีกต่อไป)

เมื่อคุณเริ่มใช้งานได้แล้วคุณสามารถเพิ่ม HTML ด้วยความสามารถที่เป็นแฟนซีตามที่แนะนำไว้ข้างต้น

ใช้งานได้กับเบราว์เซอร์ในตัว Opera และ Firefox (ยังไม่ได้ทดสอบเบราว์เซอร์อื่น) Firefox ถามว่า 'ต้องเปิดลิงก์นี้พร้อมกับแอปพลิเคชัน' (ตกลง, ยกเลิก) เห็นได้ชัดว่าเบราว์เซอร์อื่น ๆ ไม่ต้องกังวลเกี่ยวกับความปลอดภัยมากนักพวกเขาเพียงแค่เปิดแอปไม่มีคำถาม


ที่ดี! มันใช้งานได้สำหรับฉัน ดังนั้นเราจึงเพิ่มหน้า html พร้อมลิงก์ไปยังชุดรูปแบบที่กำหนดเองซึ่งเปลี่ยนเส้นทางไปยังแอปของฉัน ลิงก์ของฉันคือ<a href="iamnearby://register_activate">Activate</a>
S. Koshelnyk

4

เมื่อคุณมีเจตนาและรูปแบบ URL ที่กำหนดเองสำหรับการตั้งค่าแอพของคุณโค้ดจาวาสคริปต์นี้ที่ด้านบนของหน้ารับจะทำงานให้ฉันทั้งใน iOS และ Android:

<script type="text/javascript">
// if iPod / iPhone, display install app prompt
if (navigator.userAgent.match(/(iPhone|iPod|iPad);?/i) ||
    navigator.userAgent.match(/android/i)) {
  var store_loc = "itms://itunes.com/apps/raditaz";
  var href = "/iphone/";
  var is_android = false;
  if (navigator.userAgent.match(/android/i)) {
    store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";
    href = "/android/";
    is_android = true;
  }
  if (location.hash) {
    var app_loc = "raditaz://" + location.hash.substring(2);
    if (is_android) {
      var w = null;
      try {
        w = window.open(app_loc, '_blank');
      } catch (e) {
        // no exception
      }
      if (w) { window.close(); }
      else { window.location = store_loc; }
    } else {
      var loadDateTime = new Date();
      window.setTimeout(function() {
        var timeOutDateTime = new Date();
        if (timeOutDateTime - loadDateTime < 5000) {
          window.location = store_loc;
        } else { window.close(); }
      },
      25);
      window.location = app_loc;
    }
  } else {
    location.href = href;
  }
}
</script>

สิ่งนี้ได้รับการทดสอบบนเบราว์เซอร์ Android เท่านั้น ฉันไม่แน่ใจเกี่ยวกับ Firefox หรือ Opera ที่สำคัญคือแม้ว่าเบราว์เซอร์ Android จะไม่ส่งข้อยกเว้นที่ดีสำหรับคุณในwindow.open(custom_url, '_blank')มันจะล้มเหลวและกลับมาnullซึ่งคุณสามารถทดสอบในภายหลัง

อัปเดต: ใช้store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";เพื่อลิงก์ไปยัง Google Play บน Android


1
จุดของ loadDateTime / timeOutDateTime คืออะไร? สิ่งนี้ได้รับรอบป๊อปอัปอัพหรืออะไร?
Matt Wolfe

ดูเหมือนว่านี่จะไม่ทำงานในการทดสอบของฉัน window.open (... ) จะเปิดหน้าต่างใหม่เสมอแม้ว่ารูปแบบจะไม่ได้รับการจัดการ
jtomson

@ MattWolfe ขอโทษที่ตอบกลับช้า บน iPhone (Safari) จะไม่มีข้อยกเว้นเกิดขึ้น หมดเวลาใช้งานเพื่อปิดหน้าต่างเก่าใน Safari ที่เหลือหลังจากหน้าเปลี่ยนเส้นทางไปยังแอป ฉันไม่พบวิธีที่จะเปิด URL โดยไม่ต้องผ่าน Safari และแอปอื่น ๆ ส่วนใหญ่ที่รู้จัก URL เช่นนี้จะทำสิ่งเดียวกัน นั่นเป็นหนึ่งในข้อดีของ "การเชื่อมโยงลึก" จาก Facebook: คุณไม่ได้รับหน้าต่างที่เหลือค้างจากการไปผ่าน Safari บนมือถือ
Pete

@jtomson: น่าสนใจ ฉันทดสอบกับ Emulator และอุปกรณ์ต่าง ๆ จาก Android 2.1 ถึง 3 (ในเวลานั้น) คุณกำลังทดสอบอุปกรณ์รุ่นใดและ Android
Pete

4

คุณอาจต้องการพิจารณาไลบรารี่เพื่อจัดการลิงค์ลึกสู่แอพของคุณ:

https://github.com/airbnb/DeepLinkDispatch

คุณสามารถเพิ่มตัวกรองเจตนาในกิจกรรมที่มีคำอธิบายประกอบเช่นเดียวกับคนที่แนะนำข้างต้น มันจะจัดการเส้นทางและการแยกพารามิเตอร์สำหรับการเชื่อมโยงลึกทั้งหมดของคุณ ตัวอย่างเช่น MainActivity ของคุณอาจมีลักษณะเช่นนี้:

@DeepLink("somePath/{useful_info_for_anton_app}")
public class MainActivity extends Activity {
   ...
}

นอกจากนี้ยังสามารถจัดการพารามิเตอร์การสืบค้นได้เช่นกัน


1

ลองเคล็ดลับง่ายๆของฉัน:

        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if(url.startsWith("classRegister:")) {                  
                Intent MnRegister = new Intent(getApplicationContext(), register.class); startActivity(MnRegister);
            }               
            view.loadUrl(url);
            return true;
        }

และลิงค์ html ของฉัน:

<a href="classRegister:true">Go to register.java</a>

หรือคุณสามารถทำให้ <a href = "classRegister: จริง "> <- ค่า "ความจริง" สำหรับชื่อไฟล์ระดับ

อย่างไรก็ตามสคริปต์นี้ใช้สำหรับลิงก์ mailto :)

        if (url.startsWith("mailto:")) {
            String[] blah_email = url.split(":");
            Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
            emailIntent.setType("text/plain");
            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{blah_email[1]});
            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, what_ever_you_want_the_subject_to_be)");
            Log.v("NOTICE", "Sending Email to: " + blah_email[1] + " with subject: " + what_ever_you_want_the_subject_to_be);
            startActivity(emailIntent);
        }

นี่คือการเรียกไปที่ a JavascriptInterfaceด้วยวิธีแก้ปัญหานี่เป็นวิธีแก้ปัญหาที่ถูกต้องหากคุณต้องการสนับสนุน 2.3 ที่ JavascriptInterface ถูก bugged
EpicPandaForce

1

วิธีนี้ไม่ได้เรียกกล่องโต้ตอบแก้ความกำกวมที่ขอให้คุณเปิดแอพหรือเบราว์เซอร์ของคุณ

หากคุณลงทะเบียนสิ่งต่อไปนี้ในรายการของคุณ

<manifest package="com.myApp" .. >
  <application ...>
    <activity ...>
      <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:host="gallery"
          android:scheme="myApp" />
      </intent-filter>
    </activity>
    ..

และคลิก URL นี้จากอีเมลบนโทรศัพท์ของคุณเช่น

<a href="intent://gallery?directLink=true#Intent;scheme=myApp;package=com.myApp;end"> 
  Click me 
</a>

จากนั้น Android จะพยายามหาแอพที่มีแพ็คเกจcom.myAppที่ตอบสนองต่อแกลเลอรีของคุณและมีรูปแบบmyApp ในกรณีที่ไม่สามารถใช้งานได้มันจะนำคุณไปยังร้านค้าเพื่อค้นหาcom.myAppซึ่งควรเป็นแอปของคุณ


จะไปกิจกรรม Android ได้อย่างไร
Mohsen Emami
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.