วิธีการนำ URI ของฉันไปใช้บน Android


161

ว่าฉันต้องการกำหนดว่า URI เช่น:

myapp://path/to/what/i/want?d=This%20is%20a%20test

ต้องได้รับการจัดการโดยแอปพลิเคชันหรือบริการของฉันเอง ขอให้สังเกตว่าโครงการที่เป็น"myapp"และไม่ได้หรือ"http" "ftp"นั่นคือสิ่งที่ฉันตั้งใจอย่างแน่นอน: เพื่อกำหนดสคีมา URI ของฉันเองทั่วโลกสำหรับระบบปฏิบัติการ Android เป็นไปได้ไหม

สิ่งนี้คล้ายกับสิ่งที่บางโปรแกรมทำอยู่แล้วเช่นระบบ Windows เช่น Skype ( skype://) หรือโปรแกรมดาวน์โหลดฝนตกหนัก ( torrent://)


คำตอบ:


215

นี่เป็นไปได้มาก คุณกำหนดแบบแผน URI ใน AndroidManifest.xml ของคุณโดยใช้<data>องค์ประกอบ คุณตั้งค่าตัวกรองความตั้งใจโดย<data>กรอกองค์ประกอบแล้วคุณจะสามารถสร้างโครงร่างของคุณเอง ( เพิ่มเติมเกี่ยวกับตัวกรองเจตนาและการแก้ไขเจตนาที่นี่ )

นี่เป็นตัวอย่างสั้น ๆ :

<activity android:name=".MyUriActivity">
    <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="myapp" android:host="path" />
    </intent-filter>
</activity>

ตามการทำงานของนัยโดยปริยายคุณต้องกำหนดอย่างน้อยหนึ่งการกระทำและหนึ่งหมวดหมู่ด้วย ที่นี่ฉันเลือก VIEW เป็นการกระทำ (แม้ว่ามันจะเป็นอะไรก็ได้) และตรวจสอบให้แน่ใจว่าได้เพิ่มหมวดหมู่เริ่มต้น โปรดสังเกตว่าฉันได้เพิ่มหมวดหมู่ BROWSABLE - ไม่จำเป็น แต่จะช่วยให้ URIs ของคุณสามารถเปิดได้จากเบราว์เซอร์ (คุณลักษณะที่ดี)


11
ฉันใช้เวลาสักครู่เพื่อคิดว่าการเชื่อมโยงไปยังเส้นทางที่ระบุว่าตัวแปร "android: path" ต้องระบุทุกอย่างหลังจากโปรโตคอลเช่น มันจะต้องอยู่ในรูปแบบ "youtube.com/myvideo"
Casebash

2
ใช้งานได้ดี แต่ฉันจะอ่านค่าของพารามิเตอร์ GET "d" ที่กำหนดใน url จาก MyUriActivity ได้อย่างไร
Timo

ไม่ทำงานสำหรับฉันฉันมีตัวกรองเจตนาหลายรายการสำหรับกิจกรรมเดียวกัน หนึ่งตัวสำหรับตัวเรียกใช้งานหลัก ที่สองสำหรับการเปิดไฟล์ที่สามตามข้างต้นสองคนแรกทำงานได้อย่างสมบูรณ์แบบ แต่ไม่ใช่ไฟล์ที่สาม
mohitum

คุณช่วยกรุณาดูคำถามได้ที่นี่stackoverflow.com/q/29116574/3828908
Salmaan

1
ลิงก์ข้างบนเป็นภาษาอังกฤษในกรณีที่มีคนต้องการมัน
Zensaburou

68

การตอบกลับ @DanielLewคำตอบเพื่อรับค่าของพารามิเตอร์ที่คุณต้องทำ:

ตัวอย่าง URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

ในกิจกรรมของคุณ:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}

เกิดอะไรขึ้นถ้าลิงค์เป็นhttp://www.host.com/directory/valueอย่างไร เราจะได้สิ่งนี้ได้valueอย่างไร
บั๊กเกิดขึ้น

3
ใจไม่เคยมีคำตอบ SO ที่นี่
บั๊กเกิดขึ้น

วิธีอ่านแท็กข้อมูลใน AndroidManifest.xml เป็นโค้ดโดยไม่ต้องใช้ข้อมูลเมตา ฉันต้องการที่จะส่งรูปแบบที่แน่นอนเส้นทางและโฮสต์ไปยังเซิร์ฟเวอร์ในการโทร oauth ฉันไม่ต้องการทำซ้ำการประกาศโทรกลับ!
Pradeep Chakravarti Gudipati

@BugsHappen เป็นส่วนของเส้นทาง URI ล่าสุด ใช้uri.getLastPathSegment();
Martin

25

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

หากคุณต้องการมีลิงก์ไปยังแอพของคุณเองฉันขอแนะนำให้คุณทำตามวิธีที่อธิบายไว้ที่นี่:

วิธีลงทะเบียน URL เนมสเปซ (myapp: //app.start/) เพื่อเข้าถึงโปรแกรมของคุณโดยการเรียก URL ในเบราว์เซอร์ใน Android OS


2
ขอบคุณสำหรับหัวขึ้น แต่ฉันจะใช้เพียงเพื่อพยายามพิสูจน์แนวคิดในสภาพแวดล้อมที่ปิด หากการทดลองนี้เคยออกจากขั้นตอนการทดสอบของฉันฉันจะพิจารณาให้สัตยาบันข้อตกลงทั้งหมด
punnie

5
โอเค ... แต่ทำไมไม่ทำในสิ่งที่ถูกต้องล่ะ? มันไม่ได้มีความหมายอะไรเลย
hackbod

2
Youtube ทำสิ่งที่ @hackbod แนะนำแต่เปิดลิงก์ Youtube จาก facebook เปิดเบราว์เซอร์ไม่ใช่แอป Youtube กลไกนี้เกินไป "ละเอียดอ่อน" หรือไม่?
AlikElzin-kilaka

19
ฉันกำลังโน้มน้าวต่อการกำหนดรูปแบบของตัวเองเพื่อที่ฉันจะสามารถใช้ตรรกะเว็บเดียวกันเพื่อเปิดแอป iOS หรือแอพ Android ของฉัน เพียง 2 เซ็นต์ของฉัน
Chicowitz

1
@hackbod ฉันไม่คิดว่าพวกเขามี Android ในใจเมื่อพวกเขาเขียน rfc นั้น แม้ว่าฉันจะอยู่กับคุณ 100% แต่ก็ไม่จำเป็นที่จะต้องสร้างรูปแบบใหม่ แต่ฉันคิดว่าเหตุผลก็คือ: มันไม่จำเป็นที่จะต้องบรรลุเป้าหมาย และตอนนี้ .. เมื่อคุณเป็นเช่น Facebook, whatsapp หรือเครื่องมือเทคขนาดใหญ่อื่น ๆ ที่จัดตั้งขึ้น - "ไม่ได้สร้าง URI-Scheme ใหม่" - กฎไม่ได้ใช้กับคุณอีกต่อไปแน่นอน จะไม่มีการชนกันของชื่อแบบแผนเมื่อชื่อของคุณเชื่อมโยงกับ บริษัท ในระดับโลกแล้ว
icyerasor

6

อีกวิธีหนึ่งในการดิเอโกคือการใช้ห้องสมุด:

https://github.com/airbnb/DeepLinkDispatch

คุณสามารถประกาศ URIs ที่คุณต้องการจัดการได้อย่างง่ายดายและพารามิเตอร์ที่คุณต้องการแยกผ่านคำอธิบายประกอบในกิจกรรมเช่น:

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

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


1

เป็นคำถามที่ถามเมื่อหลายปีก่อนและ Android มีการพัฒนามากในรูปแบบ URI นี้
จากแบบแผน URI ดั้งเดิมไปจนถึงลิงก์ลึกและตอนนี้ลิงก์แอป Android

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

ตอนนี้คุณสามารถเพิ่มรูปแบบ URI ได้อย่างง่ายดายโดยใช้ตัวเลือก Android Studio: เครื่องมือ> ตัวช่วยลิงค์แอป โปรดดูรายละเอียดเอกสาร Android: https://developer.android.com/studio/write/app-link-indexing.html

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