回答:
要素<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サイトを参照してください。
android:exported="true"
する必要がありますActivity
。この回答を確認してください。stackoverflow.com
上記のすべての回答がCHROME
2014年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/パターンをリクエストすると、アプリがアクティビティピッカー内に表示されるようになります
ここに私のコメントを参照してください:Androidブラウザーでリンクを作成してアプリを起動しますか?
新しい世界規模のインターネットスキームを定義していない限り、ユーザーが独自のスキームを使用しないように強くお勧めします。
私の場合、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>
たとえば、次のものがあります。
アプリを開くためのリンク: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)以上です。
そして、ディープリンクをテストするためにアプリを市場に公開する必要はありません=)
また、詳細については、ドキュメントと役立つプレゼンテーションを確認してください。
また<category android:name="android.intent.category.BROWSABLE"/>
、リンクからアクティビティが適切に認識されるように、インテントフィルターに追加する必要があります。
次のリンクは、ブラウザーから直接(インストールされている場合)アプリを起動する方法を示しています。それ以外の場合は、Playストアでアプリを直接開き、ユーザーがシームレスにダウンロードできるようにします。
この機能を実装するときにアイコンが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>
ええ、Chromeはスキームを探すのではなく検索します。URIスキームを使用してアプリを起動する場合は、Playストアでこの便利なユーティリティアプリを使用してください。それは私の日を救った:) https://play.google.com/store/apps/details?id=com.naosim.urlschemesender
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だけでなく任意のアクティビティに追加できます
ノート:
OnCreate
アプリのイベントがMainLauncher Activity
再度発生することを意味します。<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"
もあります。
ディープリンクを処理するためのFelixのアプローチは、ディープリンクを処理するための典型的なアプローチです。また、このライブラリをチェックして、ディープリンクのルーティングと解析を処理することをお勧めします。
https://github.com/airbnb/DeepLinkDispatch
アノテーションを使用して、特定のディープリンクURIのアクティビティを登録できます。これにより、パスセグメントの取得やマッチングなどの通常の厳密な処理を行わなくても、パラメータが抽出されます。このようなアクティビティに注釈を付けるだけで、 :
@DeepLink("somePath/{someParameter1}/{someParameter2}")
public class MainActivity extends Activity {
...
}
ねえ、私は解決策を得ました。カテゴリを「デフォルト」に設定していません。また、インテントデータのメインアクティビティを使用していました。現在、インテントデータに別のアクティビティを使用しています。助けてくれてありがとう。:)
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
あり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>