Cách triển khai lược đồ URI của riêng tôi trên Android


161

Nói rằng tôi muốn xác định rằng một URI như:

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

phải được xử lý bởi ứng dụng hoặc dịch vụ của riêng tôi. Lưu ý rằng chương trình này là "myapp"và không "http", hoặc "ftp". Đó chính xác là những gì tôi dự định: xác định lược đồ URI của riêng tôi trên toàn cầu cho HĐH Android. Điều này có thể không?

Điều này hơi giống với những gì một số chương trình đã làm, ví dụ, các hệ thống Windows, chẳng hạn như Skype ( skype://) hoặc bất kỳ chương trình tải xuống torrent nào ( torrent://).


Câu trả lời:


215

Điều này là rất có thể; bạn xác định lược đồ URI trong AndroidManifest.xml bằng cách sử dụng <data>phần tử. Bạn thiết lập bộ lọc ý định với <data>phần tử được điền và bạn sẽ có thể tạo sơ đồ của riêng mình. ( Thêm về bộ lọc ý định và giải quyết ý định ở đây .)

Đây là một ví dụ ngắn:

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

Theo cách các ý định ngầm hoạt động, bạn cần xác định ít nhất một hành động và một danh mục; Ở đây tôi đã chọn XEM như là hành động (mặc dù nó có thể là bất cứ điều gì) và đảm bảo thêm danh mục DEFAULT (vì điều này là bắt buộc đối với tất cả các ý định ngầm). Cũng lưu ý cách tôi đã thêm danh mục BROWSABLE - điều này không cần thiết, nhưng nó sẽ cho phép các URI của bạn có thể mở được từ trình duyệt (một tính năng tiện lợi).


11
Phải mất một thời gian tôi mới nhận ra rằng để liên kết đến một đường dẫn cụ thể mà biến "android: path" phải chỉ định mọi thứ sau giao thức, tức là. nó phải ở dạng "youtube.com/myvideo"
Casebash

2
Hoạt động rất tốt nhưng làm cách nào tôi có thể đọc giá trị của tham số GET "d" được cung cấp trong url từ MyUriActivity?
Timo

không hoạt động với tôi Tôi có nhiều bộ lọc Intent cho cùng một hoạt động. Một cho launcher chính. thứ hai để mở một tập tin cụ thể thứ ba như trên Đầu tiên hai là hoạt động hoàn hảo nhưng không phải là thứ ba.
mohitum

bạn có thể vui lòng xem câu hỏi ở đây stackoverflow.com/q/29116574/3828908
Salmaan

1
Phiên bản tiếng Anh của liên kết trên chỉ trong trường hợp ai đó cần nó.
Zensaburou

67

Bổ sung cho câu trả lời @DanielLew , để có được các giá trị của các tham số bạn phải làm điều này:

Ví dụ về URI: myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

trong hoạt động của bạn:

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

Nếu liên kết là như thế http://www.host.com/directory/valuenào? Làm thế nào chúng ta có thể có được điều này value?
Lỗi xảy ra vào

3
Đừng bận tâm, có câu trả lời SO ở đây .
Lỗi xảy ra vào

Cách đọc các thẻ dữ liệu trong mã AndroidManifest.xml mà không cần sử dụng dữ liệu meta. Tôi cần điều đó để gửi chính xác lược đồ, đường dẫn & máy chủ đến máy chủ trong cuộc gọi oauth. Tôi không muốn sao chép khai báo lại cuộc gọi!
Pradeep Chakravarti Gudipati

@BugsHappen đó là đoạn đường dẫn URI cuối cùng. Sử dụnguri.getLastPathSegment();
Martin

25

Tôi thực sự khuyên bạn không nên xác định sơ đồ của riêng bạn. Điều này đi ngược lại các tiêu chuẩn web cho các lược đồ URI, cố gắng kiểm soát chặt chẽ các tên đó vì lý do chính đáng - để tránh xung đột tên giữa các thực thể khác nhau. Khi bạn đặt một liên kết đến lược đồ của mình trên một trang web, bạn đã đặt tên nhỏ đó vào toàn bộ không gian tên của Internet và phải tuân theo các tiêu chuẩn đó.

Nếu bạn chỉ muốn có thể có một liên kết đến ứng dụng của riêng bạn, tôi khuyên bạn nên làm theo cách tiếp cận tôi đã mô tả ở đây:

Làm cách nào để đăng ký một số không gian tên URL (myapp: //app.start/) để truy cập chương trình của bạn bằng cách gọi một URL trong trình duyệt trong HĐH Android?


2
Cảm ơn những người đứng đầu, nhưng tôi sẽ chỉ sử dụng điều này để cố gắng chứng minh một khái niệm, trong một môi trường khép kín. Nếu thử nghiệm này bao giờ rời khỏi giai đoạn thử nghiệm, tôi chắc chắn sẽ xem xét phê chuẩn toàn bộ thỏa thuận.
Punnie

5
Được rồi ... nhưng tại sao không làm điều đúng? Đó không phải là bất kỳ công việc quan trọng hơn.
hackbod

2
Youtube làm những gì @hackbod đang đề xuất, nhưng mở các liên kết Youtube từ facebook sẽ mở trình duyệt chứ không phải ứng dụng Youtube. Có phải cơ chế này quá "tế nhị"?
AlikElzin-kilaka

19
Tôi đang nghiêng về việc xác định sơ đồ của riêng mình để tôi có thể sử dụng cùng logic web để khởi chạy ứng dụng iOS HOẶC ứng dụng Android của tôi. Chỉ 2 xu của tôi
Chicowitz

1
@hackbod Tôi không nghĩ họ có Android trong đầu khi họ viết rfc đó. Mặc dù tôi 100% với bạn rằng không cần thiết phải tạo một sơ đồ mới, tôi nghĩ lý do chính xác là thế này: rằng thậm chí không cần thiết để hoàn thành mục tiêu. Và bây giờ .. khi bạn thích facebook, whatsapp hoặc các công cụ tec lớn, đã được thiết lập khác - "không tạo ra một URI-Scheme mới" -Rule không áp dụng cho bạn nữa. Sẽ không có xung đột về tên chương trình khi tên của bạn đã được gắn với một công ty trên phạm vi toàn cầu.
băng giá

6

Một cách tiếp cận khác của Diego là sử dụng thư viện:

https://github.com/airbnb/DeepLinkDispatch

Bạn có thể dễ dàng khai báo các URI mà bạn muốn xử lý và các tham số bạn muốn trích xuất thông qua các chú thích trên Hoạt động, như:

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

Ngoài ra, các tham số truy vấn cũng sẽ được chuyển đến Hoạt động.


1

Như câu hỏi đã được hỏi nhiều năm trước và Android được phát triển rất nhiều trên sơ đồ URI này.
Từ lược đồ URI ban đầu, đến liên kết sâu và giờ là Liên kết ứng dụng Android.

Android hiện khuyên bạn nên sử dụng URL HTTP, không xác định lược đồ URI của riêng bạn. Vì Liên kết ứng dụng Android sử dụng URL HTTP liên kết đến tên miền trang web mà bạn sở hữu, do đó, không có ứng dụng nào khác có thể sử dụng liên kết của bạn. Bạn có thể kiểm tra so sánh liên kết sâu và liên kết Ứng dụng Android từ đây

Giờ đây, bạn có thể dễ dàng thêm sơ đồ URI bằng cách sử dụng tùy chọn Android Studio: Công cụ> Trợ lý liên kết ứng dụng. Vui lòng tham khảo chi tiết về tài liệu Android: https://developer.android.com/studio/write/app-link-indexing.html

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.