Khởi chạy ứng dụng Android tùy chỉnh từ trình duyệt Android


Câu trả lời:


616

Sử dụng một <intent-filter>với một <data>yếu tố. Ví dụ: để xử lý tất cả các liên kết đến twitter.com, bạn sẽ đặt liên kết này vào <activity>trong AndroidManifest.xml:

<intent-filter>
    <data android:scheme="http" android:host="twitter.com"/>
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Sau đó, khi người dùng nhấp vào liên kết tới twitter trong trình duyệt, họ sẽ được hỏi nên sử dụng ứng dụng nào để hoàn thành hành động: trình duyệt hoặc ứng dụng của bạn.

Tất nhiên, nếu bạn muốn cung cấp tích hợp chặt chẽ giữa trang web và ứng dụng của mình, bạn có thể xác định sơ đồ của riêng mình:

<intent-filter>
    <data android:scheme="my.special.scheme" />
    <action android:name="android.intent.action.VIEW" />
</intent-filter>

Sau đó, trong ứng dụng web của bạn, bạn có thể đặt các liên kết như:

<a href="my.special.scheme://other/parameters/here">

Và khi người dùng nhấp vào nó, ứng dụng của bạn sẽ được khởi chạy tự động (bởi vì nó có thể sẽ là ứng dụng duy nhất có thể xử lý my.special.scheme://loại uris). Nhược điểm duy nhất của việc này là nếu người dùng không cài đặt ứng dụng, họ sẽ gặp phải một lỗi khó chịu. Và tôi không chắc có cách nào để kiểm tra.


Chỉnh sửa: Để trả lời câu hỏi của bạn, bạn có thể sử dụng getIntent().getData()trả về một Uriđối tượng. Sau đó, bạn có thể sử dụng Uri.*các phương pháp để trích xuất dữ liệu bạn cần. Ví dụ: giả sử người dùng nhấp vào liên kết đến http://twitter.com/status/1234:

Uri data = getIntent().getData();
String scheme = data.getScheme(); // "http"
String host = data.getHost(); // "twitter.com"
List<String> params = data.getPathSegments();
String first = params.get(0); // "status"
String second = params.get(1); // "1234"

Bạn có thể làm những điều trên ở bất cứ đâu trong bạn Activity, nhưng có lẽ bạn sẽ muốn làm điều đó onCreate(). Bạn cũng có thể sử dụng params.size()để lấy số lượng các đoạn đường dẫn trong Uri. Hãy tìm đến javadoc hoặc trang web của nhà phát triển Android để biết các Uriphương pháp khác mà bạn có thể sử dụng để trích xuất các phần cụ thể.


6
Cảm ơn rất nhiều cho câu trả lời nhanh chóng của bạn. Nhưng bạn có thể vui lòng cho tôi biết cách truy cập các tham số sau "my.special.scheme: //".
Parimal Modi

4
Tôi đã chỉnh sửa câu trả lời của mình để bao gồm các hướng dẫn về cách trích xuất dữ liệu từ Uri. Vui lòng đánh dấu câu trả lời này là được chấp nhận (chỉ) nếu bạn xem xét nó bằng cách nhấp vào dấu chọn bên cạnh nó.
Felix

9
Nếu ứng dụng Android được nhắm mục tiêu không được cài đặt thì sao? Làm thế nào để xử lý việc này.
Nemo

13
Bất cứ ai, giống như tôi, không thể làm cho chương trình này hoạt động, cần phải thêm android:exported="true"vào bảng Activitykê khai của họ . Kiểm tra câu trả lời này stackoverflow.com/a/13044911/1276636
Sufian

4
Không chắc làm thế nào điều này đang làm việc cho toàn bộ thế giới. Chỉ không hoạt động trên chrome và nó luôn mở liên kết trong trình duyệt cho đến khi bạn đặt phần tử "android: pathPrefix". Dù sao câu trả lời không có các giá trị thể loại như được đề cập trong tài liệu. Nếu nó vẫn không hoạt động cho ai đó, hãy tham khảo điều này: stackoverflow.com/a/21727055/2695276 PS: vật lộn trong nhiều ngày vì điều này.
Rajat Sharma

70

Tất cả các câu trả lời trên không hoạt động với tôi CHROMEvào ngày 28 tháng 1 năm 2014

Ứng dụng của tôi đã khởi chạy đúng cách từ http://example.com/someresource/ các liên kết từ các ứng dụng như hangouts, gmail, v.v. nhưng không phải từ trong trình duyệt chrome.

để giải quyết vấn đề này, để nó khởi chạy đúng từ CHROME, bạn phải đặt bộ lọc ý định như thế này

<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="example.com"
        android:pathPrefix="/someresource/"
        android:scheme="http" />
    <data
        android:host="www.example.com"
        android:pathPrefix="/someresource/"
        android:scheme="http" />
</intent-filter>

lưu ý các pathPrefixyếu tố

ứng dụng của bạn bây giờ sẽ xuất hiện bên trong bộ chọn hoạt động bất cứ khi nào người dùng yêu cầu http://example.com/someresource/ mẫu từ trình duyệt chrome bằng cách nhấp vào liên kết từ kết quả tìm kiếm của google hoặc bất kỳ trang web nào khác


Điều này đã giúp tôi rất nhiều. Cảm ơn rất nhiều! Xin vui lòng gửi câu trả lời của bạn ở đây để tôi có thể thưởng cho bạn tiền thưởng! stackoverflow.com/questions/21663001/
Mạnh

Ngôn ngữ này là gì?
Dims

Xin chào, tôi biết nó quá cũ. Tôi cũng bị đánh trong kịch bản tương tự. Tôi đã chỉ định pathPrefix, lược đồ và máy chủ lưu trữ nhưng nó không hoạt động. Tôi đã thử với chương trình chỉ, sau đó nó làm việc. Nhưng khi tôi thêm máy chủ, nó ngừng hoạt động. Bất kỳ ý tưởng những gì có thể là vấn đề?
seema

Đã dành nhiều ngày cho đến khi tôi đi đến câu trả lời này. Không chắc chắn làm thế nào nó hoạt động cho toàn bộ thế giới mà không có yếu tố pathPrefix. Không bao giờ làm việc cho tôi trên chrome mặc dù làm mọi thứ theo tài liệu. Cảm ơn bạn rất nhiều.
Rajat Sharma

66

Vui lòng xem nhận xét của tôi ở đây: Tạo liên kết trong trình duyệt Android khởi động ứng dụng của tôi?

Chúng tôi đặc biệt không khuyến khích mọi người sử dụng các chương trình của riêng họ, trừ khi họ đang xác định một chương trình internet mới trên toàn thế giới.


10
Hackbod là một trong những kỹ sư của Google đứng sau nền tảng Android. Có lẽ nên làm theo lời khuyên này. Trong thực tế, có vẻ như hỗ trợ chương trình tùy chỉnh như thế này đã phá vỡ trong Honeycomb.
nmr

23
Tôi không thể chịu trách nhiệm về những hạn chế đối với các nhà phát triển bởi iOS. ;)
hackbod

12
chịu trách nhiệm? Không. Nhưng bạn có thể tính đến nó, bất kể bạn có thích hay không, những hạn chế đó được áp dụng cho nhiều nhà phát triển của bạn
ByteMe

6
hackbod đang trả lời một câu hỏi dành riêng cho Android. Không có đề cập đến iOS, vì vậy không cần phải tính đến nó.
nilskp

4
@hackbod sẽ đặt tên cho một lược đồ (ví dụ: href = "com.ourdomain.myapp // sao cũng được), giả sử rằng một liên kết như thế có thể được tìm thấy trên các trang web khác nhau?
Julien Bérubé

48

Trong trường hợp của tôi, tôi đã phải đặt hai loại cho <intent-filter>và sau đó nó hoạt động:

<intent-filter>
<data android:scheme="my.special.scheme" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>

2
Tương tự ở đây, cần thiết để thêm các thể loại bổ sung.
KPK

Ai đó có thể giải thích quá trình thực sự của việc này được thực hiện là gì? Bất kỳ liên kết để thực hiện chính xác, điều kiện tiên quyết sẽ hữu ích. Cảm ơn
Ankit Garg

Đã thử nghiệm trên thiết lập dev. Thật ra tôi đã cho một tên miền sai. Lỗi của tôi.
Ankit Garg

Câu trả lời được đánh giá hàng đầu đã không làm việc cho tôi, nhưng điều này đã làm. Cảm ơn bạn.
EL45

25

Ví dụ: Bạn có những thứ tiếp theo:

Liên kết để mở ứng dụng của bạn: http://example.com

Tên gói của ứng dụng của bạn: com.example.mypackage

Sau đó, bạn cần làm tiếp theo:

1) Thêm bộ lọc ý định vào Hoạt động của bạn (Có thể là bất kỳ hoạt động nào bạn muốn. Để biết thêm thông tin, hãy kiểm tra tài liệu ).

        <activity
        android:name=".MainActivity">

        <intent-filter android:label="@string/filter_title_view_app_from_web">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <!-- Accepts URIs that begin with "http://example.com" -->

            <data
                android:host="example.com"
                android:scheme="http" />
        </intent-filter>

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

    </activity> 

2) Tạo tệp HTML để kiểm tra liên kết hoặc sử dụng phương pháp này.

<a href="intent://example.com#Intent;scheme=http;package=com.example.mypackage;end">Open your Activity directly (just open your Activity, without a choosing dialog). </a>

<a href="http://example.com">Open this link with browser or your programm (by choosing dialog).</a>

3) Sử dụng Chrome di động để kiểm tra

4) Đó là nó.

Và không cần thiết phải xuất bản ứng dụng trên thị trường để kiểm tra liên kết sâu =)

Ngoài ra, để biết thêm thông tin, kiểm tra tài liệutrình bày hữu ích .


Tôi đã phải tạo tập tin html và tải nó lên để nó hoạt động. Tôi tự hỏi tại sao, đặc biệt là cái thứ hai, không hoạt động trực tiếp từ trình duyệt (chrome).
Makalele

18

Cũng cần được <category android:name="android.intent.category.BROWSABLE"/>thêm vào bộ lọc ý định để làm cho hoạt động được nhận dạng đúng từ liên kết.


4
Để tham khảo, việc thêm CATEGORY_BROWSABLE có nghĩa là "Hoạt động đích có thể được trình duyệt gọi một cách an toàn để hiển thị dữ liệu được tham chiếu bởi một liên kết - ví dụ: hình ảnh hoặc thông điệp email."
greg7gkb

Đây có phải là một thể loại hiện có hoặc bạn đang đề xuất một cái mới?
Anish

Nó có tồn tại. Rõ ràng bạn nên có máy chủ trang web riêng biệt trong các thẻ lọc ý định khác nhau hoặc nó gây ra vấn đề.
NoBugs

2
Không chỉ BROWSABLE, mà cả android.intent.c Category.DEFAULT - vì vậy liên kết có thể được mở khi được bắt đầu trong các ứng dụng khác, như email (không chỉ trình duyệt)
AlikElzin-kilaka 30/12/13


7

Xin lưu ý nếu biểu tượng của bạn biến mất khỏi trình khởi chạy Android khi bạn triển khai tính năng này, hơn là bạn phải phân tách bộ lọc ý định.

    <activity
        android:name=".MainActivity"
        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>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="your-own-uri" />
        </intent-filter>
    </activity>


5

Cảng Xamarin của câu trả lời của Felix

Trong của bạn MainActivity, hãy thêm cái này ( docs: Android.App.IntentFilterAttribution Class ):

....
[IntentFilter(new[] { 
    Intent.ActionView }, 
    Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable }, 
    DataScheme = "my.special.scheme")
]
public class MainActivity : Activity
{
    ....

Xamarin sẽ thêm sau đây AndroidManifest.xmlcho bạn:

<activity
    android:label="Something"
    android:screenOrientation="portrait"
    android:theme="@style/MyTheme"
    android:name="blah.MainActivity">
    <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="my.special.scheme" />
    </intent-filter>
</activity>

Và để có được thông số ( tôi đã thử nghiệm trong OnCreate of MainActivity ):

var data = Intent.Data;
if (data != null)
{
    var scheme = data.Scheme;
    var host = data.Host;
    var args = data.PathSegments;

    if (args.Count > 0)
    {
        var first = args[0];
        var second = args[1];
        ...
    }
}

Theo tôi biết, ở trên có thể được thêm vào trong bất kỳ hoạt động nào, không chỉ MainActivity

Ghi chú:

  1. Khi người dùng nhấp vào liên kết, HĐH Android sẽ khởi chạy lại ứng dụng của bạn (hủy phiên bản trước, nếu có và chạy ứng dụng mới) , có nghĩa là OnCreatesự kiện của ứng dụng MainLauncher Activitysẽ được kích hoạt lại.
  2. Với liên kết này : <a href="my.special.scheme://host/arg1/arg2">, ở trên, các giá trị đoạn mã cuối cùng sẽ là:
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

Cập nhật: nếu Android tạo phiên bản mới của ứng dụng của bạn, bạn cũng nên thêm android:launchMode="singleTask".


3

Cách tiếp cận của Felix để xử lý các liên kết sâu là cách tiếp cận điển hình để xử lý các liên kết sâu. Tôi cũng sẽ đề nghị kiểm tra thư viện này để xử lý việc định tuyến và phân tích cú pháp các liên kết sâu của bạn:

https://github.com/airbnb/DeepLinkDispatch

Bạn có thể sử dụng các chú thích để đăng ký Hoạt động của mình cho một URI liên kết sâu cụ thể và nó sẽ trích xuất các tham số cho bạn mà không cần phải thực hiện các quy tắc thông thường để nhận các phân đoạn đường dẫn, khớp với nó, v.v. Bạn có thể chỉ cần chú thích và hoạt động như thế này :

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

0

Này, tôi đã có giải pháp. Tôi không đặt danh mục là "Mặc định". Ngoài ra tôi đã sử dụng hoạt động chính cho mục đích Dữ liệu. Bây giờ tôi đang sử dụng một hoạt động khác nhau cho dữ liệu mục đích. Cảm ơn đã giúp đỡ. :)


Nghe có vẻ không ổn (mặc dù tôi nhận ra rằng đây là một câu hỏi cũ và có thể mọi thứ đã thay đổi.) Từ developer.android.com/guide/components/intents-filters.html#ifs "Để có ý định vượt qua bài kiểm tra danh mục, mọi danh mục trong đối tượng Intent phải khớp với một danh mục trong bộ lọc . Bộ lọc có thể liệt kê các danh mục bổ sung, nhưng nó không thể bỏ qua bất kỳ mục đích nào trong ý định. "
Noach Magedman

0

Bạn cần thêm tên máy chủ giả vào ứng dụng CALLBACK_URL ': //' không có ý nghĩa như một URL và không thể được phân tích cú pháp.


0

ví dụ.php:

<?php
if(!isset($_GET['app_link'])){  ?>   
    <iframe src="example.php?app_link=YourApp://blabla" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <iframe src="example.php?full_link=http://play.google.com/xyz" style="display:none;" scrolling="no" frameborder="0"></iframe>
    <?php 
}
else { ?>
    <script type="text/javascript">
    self.window.location        = '<?php echo $_GET['app_link'];?>';
    window.parent.location.href = '<?php echo $_GET['full_link'];?>';
    </script>
<?php 
}

1
Điều này tạo ra hai iframe vô hình: liên kết sâu và liên kết bình thường. Nếu ứng dụng được cài đặt, iframe liên kết sâu sẽ khởi chạy nó. Nếu không, liên kết bình thường được hiển thị. Với một số công việc bổ sung, liên kết sâu hoãn lại có thể được thực hiện trong đó liên kết sâu được gọi sau khi ứng dụng được cài đặt.
Đaminh Cerisano

0

Hãy xem @JRun trả lời ở đây . Ý tưởng là tạo html với lược đồ tùy chỉnh của bạn và tải nó lên đâu đó. Sau đó, nếu bạn nhấp vào liên kết tùy chỉnh trên tệp html của mình, bạn sẽ được chuyển hướng đến ứng dụng của mình. Tôi đã từng này bài viết cho Android. Nhưng đừng quên đặt Name = "MyApp.Mobile.Droid.MainActivity"thuộc tính tên đầy đủ cho hoạt động mục tiêu của bạn.


0

Kể từ ngày 15/06/2019

những gì tôi đã làm là bao gồm tất cả bốn khả năng để mở url.

tức là, với http/ httpsvà 2 có wwwtiền tố và 2 không có tiền tốwww

và bằng cách sử dụng ứng dụng này, ứng dụng của tôi sẽ tự động khởi chạy ngay bây giờ mà không yêu cầu tôi chọn trình duyệt và tùy chọn khác.

<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data android:scheme="https" android:host="example.in" />
    <data android:scheme="https" android:host="www.example.in" />
    <data android:scheme="http" android:host="example.in" />
    <data android:scheme="http" android:host="www.example.in" />

</intent-filter>
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.