Androidブラウザから自分のAndroidアプリケーションを起動する方法について、誰かが私を案内してくれる?
<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サイトを参照してください。
ここに私のコメントを参照してください: Androidブラウザでリンクを張って私のアプリを起動しますか?
彼らが新しい世界規模のインターネット計画を定義していない限り、私たちは人々が彼ら自身の計画を使うことを強くお勧めします。
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と要求すると、アプリはアクティビティピッカー内に表示されるようになります。
私の場合は<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>
たとえば、次のようなことがあります。
アプリを開くためのリンク: 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"/>
を追加する必要があります。
次のリンクは、ブラウザから直接アプリを起動する方法(インストールされている場合)を示しています。それ以外の場合は、Playストアで直接アプリを開くので、ユーザーはシームレスにダウンロードできます。
ええ、Chromeはスキームを探す代わりに検索します。あなたがURIスキームを介してあなたのアプリを起動したい場合は、Playストアでこのクールなユーティリティアプリを使用してください。それは私の日を救った:) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
この機能を実装したときに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>
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だけでなくあらゆる活動に追加することができます
ノート:
MainLauncher Activity
のOnCreate
イベントが再度発生します。<a href="my.special.scheme://Host/arg1/arg2">
、上記のlast codeスニペット値は次のようになります。scheme: my.special.scheme
Host: Host
args: ["arg1", "arg2"]
first: arg1
second: arg2
ディープリンクを処理するためのFelixのアプローチは、ディープリンクを処理するための典型的なアプローチです。私はまたあなたのディープリンクのルーティングと解析を処理するためにこのライブラリをチェックアウトすることをお勧めします:
https://github.com/airbnb/DeepLinkDispatch
アノテーションを使用して特定のディープリンクURIにアクティビティを登録することができます。パスセグメントを取得したりそれに一致させるなどの通常の方法を実行する必要なしに、パラメータを抽出できます。 :
@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
...
}
ちょっと私は解決策を得た。カテゴリを「デフォルト」に設定しませんでした。また、インテントデータにMainアクティビティを使用していました。今私は意図データのために別のアクティビティを使っています。助けてくれてありがとう。 :)
CALLBACK_URLの 'app://'に擬似ホスト名を追加する必要があります。URLとしては意味がなく、解析できません。
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
}
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>