web-dev-qa-db-ja.com

Androidに独自のURIスキームを実装する方法

次のようなURIを定義するとします。

myapp://path/to/what/i/want?d=This%20is%20a%20test

自分のアプリケーションまたはサービスで処理する必要があります。スキームは"myapp"であり、"http""ftp"ではありません。それがまさに私が意図していることです:Android OSに対して独自のURIスキーマをグローバルに定義することです。これは可能ですか?

これは、Skype(skype://)やトレントダウンローダープログラム(torrent://)などのWindowsシステムなど、一部のプログラムが既に実行していることと多少似ています。

155
punnie

これは非常に可能です。 <data> 要素を使用して、AndroidManifest.xmlでURIスキームを定義します。 <data>要素を入力してインテントフィルターをセットアップすると、独自のスキームを作成できます。 ( インテントフィルターとインテント解決の詳細はこちら 。)

以下に簡単な例を示します。

<activity Android:name=".MyUriActivity">
    <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="myapp" Android:Host="path" />
    </intent-filter>
</activity>

暗黙的なインテントがどのように機能するかによって、少なくとも1つのアクションと1つのカテゴリも定義する必要があります。ここでは、アクションとしてVIEWを選択し(何でも可能ですが)、DEFAULTカテゴリを追加するようにしました(これはすべての暗黙的なインテントに必要です)。カテゴリBROWSABLEを追加した方法にも注意してください。これは必須ではありませんが、ブラウザからURIを開くことができます(気の利いた機能)。

209
Daniel Lew

@ DanielLew 回答を補完して、パラメーターの値を取得するには、これを行う必要があります。

URIの例:myapp://path/to/what/i/want?keyOne=valueOne&keyTwo=valueTwo

あなたの活動で:

Intent intent = getIntent();
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
  Uri uri = intent.getData();
  String valueOne = uri.getQueryParameter("keyOne");
  String valueTwo = uri.getQueryParameter("keyTwo");
}
64
Diego Palomar

独自のスキームを定義しないことを強くお勧めします。これはURIスキームのWeb標準に反します。URIスキームは、異なるエンティティ間の名前の競合を避けるために、正当な理由でそれらの名前を厳密に制御しようとします。 Webサイトにスキームへのリンクを配置すると、その小さな名前がインターネットの名前空間全体に挿入され、それらの標準に従う必要があります。

独自のアプリへのリンクだけが必要な場合は、ここで説明したアプローチに従うことをお勧めします。

Android OSのブラウザーでURLを呼び出してプログラムにアクセスするためのURL名前空間(myapp://app.start/)を登録する方法

25
hackbod

ディエゴの別の代替アプローチは、ライブラリを使用することです:

https://github.com/airbnb/DeepLinkDispatch

次のように、処理するURIと、アクティビティの注釈を通じて抽出するパラメーターを簡単に宣言できます。

@DeepLink("path/to/what/i/want")
public class SomeActivity extends Activity {
  ...
}

さらに、クエリパラメータもアクティビティに渡されます。

6
Christian

質問は何年も前に尋ねられているように、AndroidはこのURIスキームで大きく進化しています。
元のURIスキームからディープリンクまで、そして今Androidアプリリンク。

Androidは、独自のURIスキームを定義するのではなく、HTTP URLを使用することを推奨しています。 Androidアプリリンクは、所有するWebサイトドメインにリンクするHTTP URLを使用するため、他のアプリはリンクを使用できません。ディープリンクとAndroidアプリリンクの比較は here から確認できます

Android St​​udioオプション:[ツール]> [アプリリンクアシスタント]を使用して、URIスキームを簡単に追加できるようになりました。詳細はAndroidドキュメントを参照してください: https://developer.Android.com/studio/write/app-link-indexing.html

0
Weidian Huang