web-dev-qa-db-ja.com

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

Androidブラウザから自分のAndroidアプリケーションを起動する方法について、誰かが私を案内してくれる?

394
Parimal Modi

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

<intent-filter>
    <data Android:scheme="http" Android:Host="Twitter.com"/>
    <action Android:name="Android.intent.action.VIEW" />
</intent-filter>

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

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

<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://タイプのurisを処理できる唯一のアプリになるでしょう)。唯一の欠点は、ユーザーがアプリをインストールしていないと、厄介なエラーが発生することです。そして、私は確認する方法があるかどうかわからない。


編集: あなたの質問に答えるために、 Uri オブジェクトを返すgetIntent().getData()を使うことができます。その後、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サイトを参照してください。

600
Felix

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

彼らが新しい世界規模のインターネット計画を定義していない限り、私たちは人々が彼ら自身の計画を使うことを強くお勧めします。

66
hackbod

2014年1月28日現在、上記のすべての回答がCHROMEでうまく機能しませんでした

私のアプリは、ハングアウト、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の検索結果または他のWebサイトからのリンクをクリックしてクロムブラウザから http://example.com/someresource/ patternと要求すると、アプリはアクティビティピッカー内に表示されるようになります。

66
AndroidGecko

私の場合は<intent-filter>に2つのカテゴリを設定しなければなりませんでした、そしてそれはうまくいきました:

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

たとえば、次のようなことがあります。

アプリを開くためのリンク: 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)Mobile Chromeを使ってテストする

4)以上です。

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

また、より多くの情報のために、 ドキュメンテーション そして有用な プレゼンテーション をチェックしてください。

リンクからアクティビティを正しく認識させるために、意図フィルタに<category Android:name="Android.intent.category.BROWSABLE"/>を追加する必要があります。

18
georgij

次のリンクは、ブラウザから直接アプリを起動する方法(インストールされている場合)を示しています。それ以外の場合は、Playストアで直接アプリを開くので、ユーザーはシームレスにダウンロードできます。

https://developer.chrome.com/multidevice/Android/intents

8
Varun Bhatia

ええ、Chromeはスキームを探す代わりに検索します。あなたがURIスキームを介してあなたのアプリを起動したい場合は、Playストアでこのクールなユーティリティアプリを使用してください。それは私の日を救った:) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender

6
RRK

この機能を実装したときに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>
6
Zoltan

Xamarin port = Felix の回答

あなたの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="blahblahblah.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>

そしてparams(私は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はアプリを再起動します(存在する場合は前のインスタンスを削除し、新しいインスタンスを実行します)、アプリのMainLauncher ActivityOnCreateイベントが再度発生します。
  2. このリンクで:<a href="my.special.scheme://Host/arg1/arg2">、上記のlast codeスニペット値は次のようになります。
scheme: my.special.scheme
Host: Host
args: ["arg1", "arg2"]
first: arg1
second: arg2
4
Mehdi Dehghani

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

https://github.com/airbnb/DeepLinkDispatch

アノテーションを使用して特定のディープリンクURIにアクティビティを登録することができます。パスセグメントを取得したりそれに一致させるなどの通常の方法を実行する必要なしに、パラメータを抽出できます。 :

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

ちょっと私は解決策を得た。カテゴリを「デフォルト」に設定しませんでした。また、インテントデータにMainアクティビティを使用していました。今私は意図データのために別のアクティビティを使っています。助けてくれてありがとう。 :)

0
Parimal Modi

CALLBACK_URLの 'app://'に擬似ホスト名を追加する必要があります。URLとしては意味がなく、解析できません。

0
Paul Lindner

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 
}
0
T.Todua

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

0
S. Koshelnyk

2019年6月15日現在

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

つまり、http/httpsがあり、接頭辞にwwwがあり、wwwがない場合は2

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

<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>
0
Vicky Salunkhe