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


161

たとえば、次のようなURIを定義したいとします。

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

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

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


回答:


215

これは非常に可能です。<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を開くことができるようになります(気の利いた機能)。


11
「android:path」変数がプロトコルの後のすべてを指定する必要がある特定のパスにリンクするには、つまり、「youtube.com/myvideo」の形式である必要があります
Casebash、

2
うまくいきますが、MyUriActivityのURLで指定されたGETパラメーター "d"の値をどのように読み取ることができますか?
Timo

私にとってはうまくいきません。同じアクティビティに複数のインテントフィルターがあります。メインランチャー用。上記のように特定のファイルを開くための2番目3番目の2つは完全に動作していますが、3番目は正常に動作していません。
mohitum 14

あなたはここに質問を見てくださいすることができstackoverflow.com/q/29116574/3828908
Salmaan

1
上記のリンクの英語版は、誰かが必要な場合に備えて。
Zensaburou 2015年

67

@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");
}

リンクが次のような場合はどうなりhttp://www.host.com/directory/valueますか?どうすれば入手できvalueますか?
バグは2015年

3
気にしないで、ここで SOの答えを得ました
バグは2015年

メタデータを使用せずにコードでAndroidManifest.xmlのデータタグを読み取る方法 oauth呼び出しでも、正確なスキーム、パス、およびホストをサーバーに送信する必要があります。コールバック宣言を複製したくない!
Pradeep Chakravarti Gudipati 2017年

@BugsHappen最後のURIパスセグメントです。使用uri.getLastPathSegment();
Martin

25

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

自分のアプリへのリンクを用意したいだけの場合は、ここで説明した方法に従うことをお勧めします。

Android OSのブラウザーでURLを呼び出してプログラムにアクセスするためのURL名前空間(myapp://app.start/)を登録するにはどうすればよいですか?


2
お礼を申し上げますが、私はこれを閉じた環境でコンセプトを証明するためにのみ使用します。この実験がテスト段階を離れた場合、私は間違いなく契約全体を承認することを検討します。
punnie

5
わかりました...しかし、なぜ正しいことをしないのですか?それ以上の重要な作業ではありません。
ハックボット、2010年

2
ユーチューブは@hackbodが示唆されて何をすべきか、しかし、 FacebookのからYouTubeのリンクを開くと、ブラウザではなくYouTubeのアプリを開きます。このメカニズムは「デリケート」すぎますか?
AlikElzin-kilaka

19
同じWebロジックを使用してiOSアプリまたはAndroidアプリを起動できるように、独自のスキームを定義することに傾倒しています。ちょうど私の2セント
チコヴィッツ2013年

1
@hackbod彼らがそのrfcを書いたとき、私は彼らがアンドロイドを念頭に置いていたとは思いません。新しいスキームを作成する必要がないことは100%ですが、その理由はまさにこれだと思います。つまり、目標を達成する必要さえないのです。そして今..あなたがfacebook、whatsapp、または他の大きな確立されたtecツールのようになっているとき-「新しいURI-Schemeを作成しないでください」-ルールはもちろんあなたにはもう適用されません。あなたの名前がす​​でに世界規模で会社に関連付けられている場合、スキーム名の衝突はありません。
icyerasor 2018年

6

Diegoの別の代替アプローチは、ライブラリを使用することです。

https://github.com/airbnb/DeepLinkDispatch

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

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

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


1

質問が何年も前に行われるように、AndroidはこのURIスキームで多くの進化を遂げています。
元のURIスキームからディープリンク、そして現在はAndroidアプリリンクに。

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

これで、Android Studioオプションを使用して、URIスキームを簡単に追加できます:ツール>アプリリンクアシスタント。詳細については、Androidドキュメントを参照してください:https : //developer.android.com/studio/write/app-link-indexing.html

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