Tạo một liên kết trong trình duyệt Android khởi động ứng dụng của tôi?


229

Có thể tạo một liên kết như:

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

khiến ứng dụng Anton của tôi khởi động?

Tôi biết rằng điều này hoạt động cho ứng dụng Android Market với giao thức thị trường, nhưng có thể làm điều gì đó tương tự với các ứng dụng khác không?

Dưới đây là một ví dụ về liên kết sẽ khởi động Android Market:

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

Cập nhật: Câu trả lời tôi chấp nhận được cung cấp bởi eldarerathis hoạt động rất tốt, nhưng tôi chỉ muốn đề cập rằng tôi đã gặp một số rắc rối với thứ tự của các phần phụ của <intent-filter>thẻ. Tôi đề nghị bạn chỉ cần tạo một cái khác <intent-filter>với các phần phụ mới trong thẻ đó để tránh những vấn đề tôi gặp phải. Ví dụ, AndroidManifest.xmlngoại hình của tôi như thế này:

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

Điều này đã giải quyết vấn đề của tôi khi tôi không thể mở ứng dụng trong điện thoại di động của mình.
Unomono

9
+1 để đề cập đến thứ tự của các thẻ xml. Nó hoàn toàn không có ý nghĩa và không được ghi lại ở bất cứ đâu, nhưng tôi thấy rằng khi tôi có thẻ dữ liệu bên dưới thẻ hành động và thẻ danh mục, nó sẽ không hoạt động.
Adam

Chuyển hướng đến ứng dụng và quay lại chính xác nếu ứng dụng không có mặt cũng có thể là một cơn ác mộng, do sự phức tạp của tất cả các trình duyệt Android khác nhau (Chrome, Mặc định, Webview, Firefox, v.v.). Các branch.io dịch vụ giúp làm điều này và là miễn phí.
Alex Austin

@Anton .... xin chào ngài ... bởi mã trên của bạn, tôi chỉ hiểu để xử lý dữ liệu từ liên kết ... Bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể tạo một liên kết có chứa dữ liệu của tôi không ... vui lòng giúp đỡ tôi ... tôi muốn tạo liên kết với dữ liệu về sự kiện nhấn nút ..
Ravindra Kushwaha

1
Tôi vấp phải một rào cản gỡ lỗi mà những người khác cũng có thể muốn biết: Các liên kết hoạt động từ <a href=""> liên kết trong các trang web và khi được khởi chạy bằng adb, nhưng bây giờ khi bạn chỉ cần nhập URL trong điện thoại di động thanh địa chỉ trình duyệt.⚠️
Julian Brodwall

Câu trả lời:


96

Tôi nghĩ bạn sẽ muốn xem xét <intent-filter>yếu tố của tệp Mainfest của bạn. Cụ thể, hãy xem tài liệu cho <data>yếu tố phụ.

Về cơ bản, những gì bạn cần làm là xác định sơ đồ của riêng bạn. Một cái gì đó dọc theo dòng:

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

Sau đó, bạn sẽ có thể khởi chạy ứng dụng của mình với các liên kết bắt đầu bằng anton:sơ đồ URI.


3
Hãy thử xem chủ đề này. Nó có một ví dụ khá hay: stackoverflow.com/questions/2958701/ từ
eldarerathis

3
Để tham khảo, 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

3
Điều này hoạt động hoàn hảo trên các phiên bản Android trước đây, nhưng không phải trên kẹo mút, giải pháp nào?
Salmaan

1
@eldarerathis điều này hoạt động nếu ứng dụng gần nhưng nếu ứng dụng đang chạy trên nền và hoạt động khác với hoạt động mà bộ lọc có ý định kèm theo thì tôi không thể xử lý được. Làm thế nào để bạn quản lý này để làm việc trong tất cả các hoạt động? Bạn có đặt bộ lọc ý định vào tất cả chúng?
Mustafa Güven

5
Câu trả lời này đã lỗi thời..đây sẽ không hoạt động với chrome 40. Lược đồ tùy chỉnh đã bị vô hiệu hóa trong chrome do vấn đề bảo mật
Utsav Gupta

280

Vui lòng KHÔNG sử dụng lược đồ tùy chỉnh của riêng bạn như thế !!! Các lược đồ URI là một mạng toàn cầu không gian tên . Bạn có sở hữu sơ đồ "anton:" trên toàn thế giới không? Không? Sau đó, đừng sử dụng nó.

Một tùy chọn là có một trang web và có bộ lọc ý định cho một URI cụ thể trên trang web đó. Ví dụ: đây là những gì Market làm để chặn các URI trên trang web của mình:

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

Ngoài ra, có chương trình "ý định:". Điều này cho phép bạn mô tả gần như bất kỳ Mục đích nào dưới dạng URI mà trình duyệt sẽ cố gắng khởi chạy khi nhấp vào. Để xây dựng một sơ đồ như vậy, cách tốt nhất là chỉ cần viết mã để xây dựng Ý định mà bạn muốn khởi chạy, sau đó in kết quả của ý định.toUri (Intent.URI_INTENT_SCHEME).

Bạn có thể sử dụng một hành động với mục đích này để tìm bất kỳ hoạt động nào hỗ trợ hành động đó. Trình duyệt sẽ tự động thêm danh mục BROWSABLE vào mục đích trước khi khởi chạy nó, vì lý do bảo mật; nó cũng sẽ loại bỏ bất kỳ thành phần rõ ràng nào bạn đã cung cấp cho cùng một lý do.

Cách tốt nhất để sử dụng điều này, nếu bạn muốn đảm bảo nó chỉ khởi chạy ứng dụng của bạn, là với hành động có phạm vi của riêng bạn và sử dụng Intent.setPackage () để nói rằng Intent sẽ chỉ khớp với gói ứng dụng của bạn.

Sự đánh đổi giữa hai người:

  • http URI yêu cầu bạn có một tên miền bạn sở hữu. Người dùng sẽ luôn có tùy chọn hiển thị URI trong trình duyệt. Nó có các thuộc tính dự phòng rất đẹp trong đó nếu ứng dụng của bạn chưa được cài đặt, chúng sẽ chỉ đơn giản là truy cập vào trang web của bạn.

  • URI có ý định yêu cầu ứng dụng của bạn đã được cài đặt và chỉ trên điện thoại Android. Cho phép gần như bất kỳ ý định nào (nhưng luôn có danh mục BROWSABLE đi kèm và không hỗ trợ các thành phần rõ ràng). Chúng cho phép bạn chỉ đạo khởi chạy cho ứng dụng của bạn mà không cần người dùng có tùy chọn thay vào đó để đi tới trình duyệt hoặc bất kỳ ứng dụng nào khác.


32
Mặt khác, ứng dụng Market cũng xử lý market://các liên kết :)
Felix

38
Đó là một sai lầm cho nó để sử dụng thị trường:, và điều này đang được gỡ bỏ.
hackbod

82
Lý do tại sao mọi người sử dụng các lược đồ tùy chỉnh trong Android là vì hầu hết các dự án được phát triển song song với (hoặc sau) phiên bản iPhone và đây là cách duy nhất để làm cho nó hoạt động ở đó ...
LambergaR

12
đồng ý với @LambergaR. Bây giờ chúng ta cần tìm ra cách để tạo liên kết trong một email hoạt động ở 3 nền tảng (BB, iphone, Android)
Maragues

7
Bất kỳ URI nào bạn đặt trong trang web của bạn với sơ đồ tùy chỉnh sẽ không hoạt động trên bất kỳ trình duyệt web nào không cài đặt ứng dụng của bạn. Điều đó dường như không bị phá vỡ đối với bạn?
hackbod

13

Tôi xin lỗi vì đã quảng bá bản thân, nhưng tôi có một plugin jQuery để khởi chạy các ứng dụng gốc từ các liên kết web https://github.com/eusonlito/jquery.applink

Bạn có thể sử dụng nó dễ dàng:

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

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

12

Tôi cũng phải đối mặt với vấn đề này và thấy nhiều trang vô lý. Tôi đã học được rằng để làm cho ứng dụng của bạn có thể duyệt được, hãy thay đổi thứ tự của các phần tử XML, điều này:

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

Điều này làm việc cho tôi và có thể giúp bạn.


Tôi viết thẻ XML theo cùng một trình tự nhưng không thể mở hộp thoại chọn khi tôi viết url của mình trong trình duyệt Android.
Sunit Kumar Gupta

Tôi không thấy nhiều sự khác biệt, và nếu tôi sử dụng cái này thì nó hoạt động hoàn hảo .. Cảm ơn bạn :)
Muthu S

6

Đây là công thức của tôi:

Tạo một HTML tĩnh chuyển hướng đến URL ứng dụng bạn yêu cầu, đưa trang đó lên web.

Bằng cách đó, các liên kết bạn chia sẻ là các liên kết 'thực' theo như Android có liên quan (chúng sẽ là 'có thể nhấp').

Bạn 'chia sẻ' một liên kết HTTP thông thường, www.your.server.com/foo/bar.html URL này trả về một HTML 8 dòng đơn giản chuyển hướng đến URI của ứng dụng của bạn (window.location = "blah: // kuku") ( lưu ý rằng 'blah' không phải là HTTP hoặc HTTPS nữa).

Khi bạn cài đặt và chạy nó, bạn có thể tăng HTML với tất cả các khả năng ưa thích như được đề xuất ở trên.

Điều này hoạt động với trình duyệt tích hợp, Opera và Firefox (chưa thử nghiệm bất kỳ trình duyệt nào khác). Firefox yêu cầu 'Liên kết này cần được mở bằng một ứng dụng' (ok, hủy). Các trình duyệt khác dường như không lo lắng về bảo mật nhiều, họ chỉ mở ứng dụng, không có câu hỏi nào.


Tuyệt quá! Nó làm việc cho tôi. Vì vậy, chúng tôi đã thêm trang html với một liên kết đến lược đồ tùy chỉnh chuyển hướng đến ứng dụng của tôi. Liên kết của tôi là<a href="iamnearby://register_activate">Activate</a>
S. Koshelnyk

4

Khi bạn đã có ý định và lược đồ url tùy chỉnh cho ứng dụng của mình được thiết lập, mã javascript này ở đầu trang nhận đã hoạt động với tôi trên cả iOS và 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>

Điều này chỉ được thử nghiệm trên trình duyệt Android. Tôi không chắc chắn về Firefox hay Opera. Điều quan trọng là mặc dù trình duyệt Android sẽ không đưa ra một ngoại lệ hay cho bạn window.open(custom_url, '_blank'), nhưng nó sẽ thất bại và trả về nullmà bạn có thể kiểm tra sau này.

Cập nhật: sử dụng store_loc = "https://play.google.com/store/apps/details?id=com.raditaz";để liên kết với Google Play trên Android.


1
điểm của loadDateTime / timeOutDateTime là gì? Điều này bằng cách nào đó có được xung quanh trình chặn cửa sổ bật lên hoặc một cái gì đó?
Matt Wolfe

điều này dường như không hoạt động trong các thử nghiệm của tôi, window.open (...) sẽ luôn mở một cửa sổ mới, ngay cả khi lược đồ không được xử lý.
jtomson

@MattWolfe xin lỗi vì đã trả lời trễ. Trên iPhone (Safari) không có ngoại lệ được ném. Thời gian chờ là để đóng cửa sổ cũ trong Safari còn sót lại sau khi trang đã được chuyển hướng đến ứng dụng. Tôi chưa tìm được cách mở url mà không cần thông qua Safari và hầu hết các ứng dụng khác nhận ra các url như thế này đều làm điều tương tự. Đó là một trong những lợi thế của "liên kết sâu" từ Facebook: bạn không nhận được cửa sổ còn sót lại cũ kỹ đó thông qua Safari di động.
Pete

@jtomson: Thú vị. Tôi đã thử nghiệm trên Trình giả lập và các thiết bị khác nhau từ Android 2.1 đến 3 (tại thời điểm đó). Bạn đang thử nghiệm thiết bị và phiên bản Android nào?
Pete

4

Bạn có thể muốn xem xét một thư viện để xử lý liên kết sâu đến ứng dụng của bạn:

https://github.com/airbnb/DeepLinkDispatch

Bạn có thể thêm bộ lọc ý định vào Hoạt động được chú thích như những người được đề xuất ở trên. Nó sẽ xử lý việc định tuyến và phân tích các tham số cho tất cả các liên kết sâu của bạn. Ví dụ: MainActivity của bạn có thể có một cái gì đó như thế này:

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

Nó cũng có thể xử lý các tham số truy vấn là tốt.


1

Hãy thử mẹo đơn giản của tôi:

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

và liên kết html của tôi:

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

hoặc bạn có thể làm cho <a href = "classRegister: đúng "> <- "true" giá trị cho lớp filename

tuy nhiên tập lệnh này hoạt động cho liên kết 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);
        }

Đây thực chất là một cuộc gọi đến một JavascriptInterfacecách giải quyết, đây là cách giải quyết phù hợp nếu bạn cần hỗ trợ 2.3 trong đó JavascriptInterface bị lỗi.
EpicPandaForce 13/03/2015

1

Phương pháp này không gọi hộp thoại định hướng yêu cầu bạn mở ứng dụng hoặc trình duyệt.

Nếu bạn đăng ký như sau trong Bản kê khai của bạn

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

và nhấp vào url này từ một email trên điện thoại của bạn chẳng hạn

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

sau đó android sẽ cố gắng tìm một ứng dụng với gói com.myApp đáp ứng mục đích thư viện của bạn và có sơ đồ myApp . Trong trường hợp không thể, nó sẽ đưa bạn đến cửa hàng, tìm kiếm com.myApp , ứng dụng nên là ứng dụng của bạn.


Làm thế nào để đi đến một hoạt động Android?
Mohsen Emami
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.