AndroidブラウザーからカスタムAndroidアプリケーションを起動する


回答:


616

要素<intent-filter>とともに使用し<data>ます。たとえば、twitter.comへのすべてのリンクを処理するに<activity>は、これをyour内に配置しますAndroidManifest.xml

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

次に、ユーザーがブラウザーでTwitterへのリンクをクリックすると、アクションを完了するために使用するアプリケーション(ブラウザーまたはアプリケーション)が尋ねられます。

もちろん、ウェブサイトとアプリを緊密に統合したい場合は、独自のスキームを定義できます。

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

次に、Webアプリに次のようなリンクを配置できます。

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

ユーザーがクリックすると、アプリが自動的に起動されます(おそらくmy.special.scheme://、URIのタイプを処理できる唯一のアプリになるためです)。これの唯一の欠点は、ユーザーがアプリをインストールしていない場合、厄介なエラーが発生することです。また、確認する方法があるかどうかはわかりません。


編集:質問に答えるためにgetIntent().getData()Uriオブジェクトを返すwhich を使用できます。その後、Uri.*メソッドを使用して、必要なデータを抽出できます。たとえば、ユーザーが次のリンクをクリックしたとします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"

上記のことはのどこでも行うことができますがActivity、おそらくで行いたいと思うでしょうonCreate()。を使用params.size()して、のパスセグメントの数を取得することもできUriます。Uri特定の部分を抽出するために使用できる他の方法については、javadocまたはAndroid開発者のWebサイトを参照してください。


6
早速の返信ありがとうございます。しかし、 "my.special.scheme://"の後にパラメーターにアクセスする方法を教えてください。
Parimal Modi

4
答えを編集して、Uriからデータを抽出する方法の説明を含めました。考えられる場合は、横にあるチェックマークをクリックして、この回答を承認済み(のみ)としてマークしてください。
Felix

9
ターゲットのAndroidアプリケーションがインストールされていない場合はどうなりますか?これを処理する方法。
Nemo

13
私のように、このスキームを機能させることができない人は、マニフェストに追加android:exported="true"する必要がありますActivity。この回答を確認してください。stackoverflow.com
a / 13044911/1276636

4
これが全世界でどのように機能しているかはわかりません。単にchromeでは機能せず、 "android:pathPrefix"要素を配置するまで常にブラウザでリンクを開きます。とにかく、ドキュメントで言及されているように、回答にはカテゴリ値がありません。それでもだめな場合は、こちらを参照してください 。
Rajat Sharma

70

上記のすべての回答がCHROME2014年1月28日の時点で機能しませんでした

私のアプリは、ハングアウトやGmailなどのアプリからのhttp://example.com/someresource/リンクから適切に起動しましたが、Chromeブラウザ内からは起動していません。

これを解決するには、CHROMEから適切に起動するように、このようにインテントフィルターを設定する必要があります。

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

pathPrefix要素に注意してください

ユーザーがGoogle検索結果や他のウェブサイトのリンクをクリックしてChromeブラウザからhttp://example.com/someresource/パターンをリクエストすると、アプリがアクティビティピッカー内に表示されるようになります


これはとても役に立ちました。どうもありがとう!賞金を授与できるように、ここに回答を投稿してください!stackoverflow.com/questions/21663001/...
ヴラドSchnakovszki

これは何語?
2014

こんにちは、私はそれが古すぎることを知っています。私も同じシナリオで打たれています。pathPrefix、scheme、およびhostを指定しましたが、機能しません。私はスキームだけで試しましたが、うまくいきました。しかし、ホストを追加すると、機能しなくなりました。何が問題になる可能性がありますか?
シーマ

私がこの答えに到達するまで、それを何日も過ごしました。pathPrefix要素がない場合、それが全世界でどのように機能するかはわかりません。ドキュメントに従ってすべてを行っているにもかかわらず、Chromeで私のために働いたことはありません。どうもありがとうございます。
Rajat Sharma

66

ここに私のコメントを参照してください:Androidブラウザーでリンクを作成してアプリを起動しますか?

新しい世界規模のインターネットスキームを定義していない限り、ユーザーが独自のスキームを使用しないように強くお勧めします。


10
Hackbodは、Androidプラットフォームの背後にあるGoogleエンジニアの1人です。このアドバイスに従うことはおそらく良い考えです。実際、Honeycombでこのようなカスタムスキームのサポートが機能しなくなったようです。
nmr

23
iOSによって開発者に課された制限について責任を負うことはできません。;)
ハックボックス

12
責任がある?番号。しかし、あなたがそれが好きかどうかに関わらず、それらの制限は多くの開発者に課されているので、それを考慮に入れることができます
ByteMe

6
hackbodはAndroid専用の質問に答えています。iOSについては触れられていないため、考慮に入れる必要はありません。
nilskp

4
@hackbodは、スキーム(つまり、href = "com.ourdomain.myapp // whatever")の名前空間を別のWebサイトで見つけることができると想定して、良い方法です。
JulienBérubé2012

48

私の場合、2つのカテゴリを設定する必要が<intent-filter>あり、それが機能しました。

<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
同じですが、追加のカテゴリを追加するために必要です。
KPK

これを実行する実際のプロセスは何ですか?正確な実装、前提条件へのリンクは役に立ちます。ありがとう
Ankit Garg 2013

開発セットアップでテスト。実際、私は間違ったドメイン名を与えていました。私の悪い。
Ankit Garg 2013

最高評価の答えは私にはうまくいきませんでしたが、これはうまくいきました。ありがとうございました。
EL45 2014年

25

たとえば、次のものがあります。

アプリを開くためのリンク:http : //example.com

アプリのパッケージ名:com.example.mypackage

次に、次のことを行う必要があります。

1)アクティビティにインテントフィルターを追加します(任意のアクティビティを使用できます。詳細については、ドキュメントを確認してください)。

        <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)HTMLファイルを作成してリンクをテストするか、このメソッドを使用します。

<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)モバイルChromeを使用してテストする

4)以上です。

そして、ディープリンクをテストするためにアプリを市場に公開する必要はありません=)

また、詳細については、ドキュメントと役立つプレゼンテーションを確認してください。


動作させるために、htmlファイルを作成してアップロードする必要がありました。特に、2番目のブラウザがブラウザ(クロム)から直接機能しないのはなぜですか。
マカレル2017年

18

また<category android:name="android.intent.category.BROWSABLE"/>、リンクからアクティビティが適切に認識されるように、インテントフィルターに追加する必要があります。


4
参考までに、CATEGORY_BROWSABLEを追加すると、「ターゲットアクティビティをブラウザで安全に呼び出して、リンクで参照されているデータ(画像や電子メールメッセージなど)を表示できます。」
greg7gkb 2012

これは既存のカテゴリですか、それとも新しいカテゴリを提案していますか?
アニッシュ

それが存在します。どうやら、別のインテントフィルタータグに別のWebサイトホストがあるはずです。そうしないと、問題が発生します。
NoBugs 2012年

2
BROWSABLEだけでなく、android.intent.category.DEFAULT-Eメール(ブラウザーだけでなく)などの他のアプリで開始されたときにリンクを開くことができます
AlikElzin-kilaka


7

この機能を実装するときにアイコンがAndroidランチャーに表示されない場合は、インテントフィルターを分割する必要があることに注意してください。

    <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

Felixの回答のXamarinポート

にこれMainActivityを追加します(docs:Android.App.IntentFilterAttribute Class):

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

Xamarinは以下を追加AndroidManifest.xmlします:

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

そして、パラメータを取得するために(私はMainActivityのOnCreateでテストしました):

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

私の知る限り、上記はMainActivityだけでなく任意のアクティビティに追加できます

ノート:

  1. ユーザーがリンクをクリックすると、Android OSがアプリを再起動します(存在する場合は前のインスタンスを強制終了し、新しいインスタンスを実行します)。これは、OnCreateアプリのイベントがMainLauncher Activity再度発生することを意味します。
  2. このリンク:を使用する<a href="my.special.scheme://host/arg1/arg2">と、上記の最後のコードスニペットの値は次のようになります。
scheme: my.special.scheme
host: host
args: ["arg1", "arg2"]
first: arg1
second: arg2

更新: Androidがアプリの新しいインスタンスを作成する場合は、追加する必要android:launchMode="singleTask"もあります。


3

ディープリンクを処理するためのFelixのアプローチは、ディープリンクを処理するための典型的なアプローチです。また、このライブラリをチェックして、ディープリンクのルーティングと解析を処理することをお勧めします。

https://github.com/airbnb/DeepLinkDispatch

アノテーションを使用して、特定のディープリンクURIのアクティビティを登録できます。これにより、パスセグメントの取得やマッチングなどの通常の厳密な処理を行わなくても、パラメータが抽出されます。このようなアクティビティに注釈を付けるだけで、 :

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

0

ねえ、私は解決策を得ました。カテゴリを「デフォルト」に設定していません。また、インテントデータのメインアクティビティを使用していました。現在、インテントデータに別のアクティビティを使用しています。助けてくれてありがとう。:)


サウンドは低いから(私はこれが古い質問です、多分物事が変更されている。ことを認識している)developer.android.com/guide/components/intents-filters.html#ifs意図はカテゴリー試験に合格するためには、」内のすべてのカテゴリインテントオブジェクトフィルタのカテゴリと一致する必要があります。フィルタは追加のカテゴリをリストできますが、インテントにあるものは省略できません。」
Noach Magedman 2013


0

example.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
これにより、ディープリンクと通常のリンクの2つの非表示のiframeが作成されます。アプリがインストールされている場合、ディープリンクiframeが起動します。そうでない場合は、通常のリンクが表示されます。いくつかの追加作業を行うと、アプリのインストール後にディープリンクが呼び出される場合に、遅延ディープリンクを実装できます。
Dominic Cerisano 2017

0

こちらで @JRunsの回答をご覧ください。アイデアは、カスタムスキームでhtmlを作成し、どこかにアップロードすることです。次に、htmlファイルのカスタムリンクをクリックすると、アプリにリダイレクトされます。私はこの記事をAndroidで使用しました。ただしName = "MyApp.Mobile.Droid.MainActivity"、ターゲットアクティビティにフルネーム属性を設定することを忘れないでください。


0

2019年6月15日現在

私がやったことは、URLを開くための4つの可能性すべてを含めることです。

つまり、接頭辞付きhttp/ httpsあり2 wwwとなし2www

これを使用すると、ブラウザーやその他のオプションを選択するように求められることなく、アプリが自動的に起動します。

<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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.