Androidブラウザーでリンクを作成してアプリを起動しますか?


229

次のようなリンクを作成することは可能ですか?

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

アントンアプリを起動しますか?

これはマーケットプロトコルを備えたAndroidマーケットアプリで機能することを知っていますが、他のアプリでも同様のことができますか?

Androidマーケットを起動するリンクの例を次に示します。

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

9
+1は、xmlタグの順序について言及します。これはまったく意味がなく、どこにも文書化されていませんが、アクションタグとカテゴリタグの下にデータタグがあると、まったく機能しないことがわかりました。
アダム

アプリにリダイレクトし、アプリが存在しない場合に正しくフォールバックすることも、さまざまなAndroidブラウザー(Chrome、デフォルト、Webビュー、Firefoxなど)の複雑さを考えると、少し悪夢になる可能性があります。branch.ioのサービスは、これを行うことができますし、無料です。
Alex Austin、

@Anton .... hello sir ...上記のコードでは、リンクからのデータを処理することしか理解できません...データを含むリンクを作成する方法を教えてください...助けてください私...私はボタンのクリックイベントのデータとのリンクを作成したい...
ラビンドラKushwaha

1
others️私は他の人が同様に認識したいと思うかもしれないデバッグのハードルを越えました:リンクはWebページの<a href="">リンクから機能し、adbで起動されたときですが、今度はモバイルにURLを入力するだけですブラウザのアドレスbar.⚠️
ヨハネス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 2012

3
これは以前のAndroidバージョンでは完全に機能しますが、ロリポップでは機能しませんか?
サルマーン2015年

1
@eldarerathisこれはアプリケーションが閉じている場合に機能しますが、アプリケーションがバックグラウンドで実行されていて、アクティビティがインテントフィルターが接続されているものと異なる場合は処理できませんでした。これをどのように管理して、すべての活動に取り組んでいますか?それらすべてにインテントフィルターを挿入しますか?
MustafaGüven

5
この回答は古くなっています。これは
Chrome

280

そのような独自のカスタムスキームを使用しないでください!!! URIスキームはネットワークのグローバル名前空間です。「anton:」スキームを世界中で所有していますか?番号?その後、それを使用しないでください。

1つのオプションは、Webサイトを用意し、そのWebサイトの特定のURIのインテントフィルターを用意することです。たとえば、これはマーケットがWebサイトのURIをインターセプトするために行うことです。

        <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.toUri(Intent.URI_INTENT_SCHEME)の結果を出力するのが最善の方法です。

このインテントのアクションを使用して、そのアクションをサポートするアクティビティを見つけることができます。セキュリティ上の理由から、ブラウザは起動する前にBROWSABLEカテゴリをインテントに自動的に追加します。また、同じ理由で指定した明示的なコンポーネントも削除されます。

これを使用する最良の方法は、アプリのみを確実に起動する場合、独自のスコープアクションを使用し、Intent.setPackage()を使用して、インテントがアプリパッケージのみに一致することを示すことです。

2つの間のトレードオフ:

  • http URIには、所有するドメインが必要です。ユーザーは常に、ブラウザーにURIを表示するオプションを取得します。これは、アプリがインストールされていない場合にWebサイトに表示される、非常に優れたフォールバックプロパティを備えています。

  • インテントURIを使用するには、アプリがすでにインストールされており、Androidフォンにのみインストールされている必要があります。ほぼすべての意図を許可します(ただし、常に参照可能なカテゴリが含まれ、明示的なコンポーネントはサポートされません)。これらを使用すると、ユーザーがブラウザや他のアプリに移動するオプションを使用せずに、アプリのみに起動を指示できます。


32
一方、Marketアプリはmarket://リンクも処理します:)
Felix

38
Marketを使用するのは誤りでした。これは削除されます。
ハックボット

82
人々は、Androidのカスタムスキームを使用する理由は、プロジェクトのほとんどはiPhone版と(または後)paralelで開発されているので、これは...それはそこに動作させるための唯一の方法である
LambergaR

12
@LambergaRに同意します。3つのプラットフォーム(BB、iphone、Android)でメールのリンクを機能させる方法を見つける必要があります
Maragues

7
カスタムスキームを使用してWebページに入力したURIは、アプリケーションもインストールされていないWebブラウザでは機能しません。それはあなたにとって壊れているようではありませんか?
ハックボッド

13

自分自身を宣伝したことをお詫びしますが、Webリンクからネイティブアプリを起動するための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タグを書き込みますが、AndroidブラウザーでURLを書き込むと、選択ダイアログを開くことができません。
Sunit Kumar Gupta 2014

あまり違いは見られませんでした。これを使用すると、完全に機能します。ありがとうございます。:
Muthu S

6

これが私のレシピです:

リクエストされたアプリのURLにリダイレクトする静的HTMLを作成し、そのページをWebに配置します。

そうすることで、Androidに関する限り、共有するリンクは「実際の」リンクになります(「クリック可能」になります)。

通常のHTTPリンクを「共有」します。www.your.server.com/ foo / bar.htmlこのURLは、アプリのURI(window.location = "blah:// kuku")にリダイレクトする単純な8行のHTMLを返します( 「何とか」はHTTPやHTTPSである必要はありません)。

これを起動して実行したら、上で提案したように、すべての高度な機能をHTMLに追加できます。

これは、組み込みのブラウザ、Opera、Firefoxで動作します(他のブラウザはテストしていません)。Firefoxは「このリンクはアプリケーションで開く必要があります」(OK、キャンセル)と尋ねます。他のブラウザは明らかにセキュリティについてそれほど心配していません。彼らはアプリを開くだけで、質問はされません。


すごい!それは私のために働いた。そこで、アプリにリダイレクトするカスタムスキームへのリンクを含むhtmlページを追加しました。私のリンクは<a href="iamnearby://register_activate">Activate</a>
S. Koshelnyk

4

アプリのインテントとカスタムURLスキームを設定すると、iOSとAndroidの両方で、受信ページの上部にあるこのJavaScriptコードが機能します。

<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";AndroidでGoogle Playにリンクするために使用します。


1
loadDateTime / timeOutDateTimeのポイントは何ですか?これはどういうわけかポップアップブロッカーか何かを回避しますか?
Matt Wolfe、2012年

これは私のテストでは機能しないようです。window.open(...)は、スキームが処理されない場合でも、常に新しいウィンドウを開きます。
jtomson 2012年

@MattWolfe返信が遅くなってすみません。iPhone(Safari)では、例外はスローされません。ページがアプリにリダイレクトされた後に残っているSafariの古いウィンドウを閉じるためのタイムアウトがあります。私はSafariを経由せずにURLを開く方法を見つけていません。このようなURLを認識する他のほとんどのアプリも同じことを行います。これがFacebookの「ディープリンク」の利点の1つでした。モバイルSafariを使用して、古い残りのウィンドウが表示されることはありません。
Pete

@jtomson:面白い。エミュレーターと、Android 2.1から3(当時)までのさまざまなデバイスでテストしました。どのデバイスとAndroidバージョンをテストしましたか?
ピート

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>

またはあなたが作ることができます<の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);
        }

これは本質的にJavascriptInterface回避策を伴うaの呼び出しです。これは、JavascriptInterfaceにバグがある2.3をサポートする必要がある場合の適切な回避策です。
EpicPandaForce 2015年

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は、ギャラリーインテントに応答し、myAppスキームを持つcom.myAppパッケージのアプリを見つけようとします。それができない場合は、ストアに移動し、アプリであるcom.myAppを探します。


Androidアクティビティに移動する方法は?
Mohsen Emami
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.