web-dev-qa-db-ja.com

ディープリンクインテントが機能しない

https://developer.Android.com/training/app-indexing/deep-linking.html の説明に従いましたが、adbを使用してインテントをトリガーしたい場合:

adb Shell am start
           -W -a Android.intent.action.BROWSEABLE
           -d "http://example.com/gizmos" com.myapp.Android

私はちょうど得る

Error: Activity not started, unable to resolve Intent { act=Android.intent.action.VIEW dat=example://gizmos flg=0x10000000 pkg=com.myapp.Android }

<activity
        Android:name=".activities.DeepLinkActivity"
        Android:label="@string/title_activity_deep_link">
        <meta-data
            Android:name="Android.app.searchable"
            Android:resource="@xml/searchable" />

        <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="http"
                Android:Host="example.com"
                Android:pathPrefix="/gizmos" />
        </intent-filter>
    </activity>

明らかな間違いを犯しましたか?

49
Mahoni

編集:

まず、パッケージがadbで到達可能であることを確認します。

adb Shell am start -n com.example.simon.test/.activities.MainActivity

次に、複数のデータタグを受け入れるには、異なるインテントフィルターが必要です(これは、ネットで見た他のすべての例とは異なり、それが私にとって機能する方法です)。例えば。:

<intent-filter>
    ...
    <data Android:scheme="http"
          Android:Host="example.com"/>
</intent-filter>
<intent-filter>
    ...
    <data Android:scheme="http"
          Android:Host="example.com"
          Android:pathPrefix="/gizmos"/>
</intent-filter>

[〜#〜] note [〜#〜]上記の例では、pathPrefixはフォワードスラッシュで始まります。

Googleのドキュメントがなぜ誤解を招くのか、あるいはそれがadbのいくつかの異なるバージョンにあったのかはわかりませんが、上記の変更は完全に機能しました。これは助けました: ソース


これは、Chromeブラウザが特定のリンクをアプリにルーティングする方法です。

<activity
    Android:name=".activities.DeepLinkActivity"
    Android:label="@string/app_name">
    <!-- Accept chrome links -->
    <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="http"
              Android:Host="example.com"
            Android:pathPrefix="/"/>
    </intent-filter>
    <!-- Accept adb data flag -->
    <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="http"
              Android:Host="example.com"/>
    </intent-filter>
</activity>

[〜#〜] note [〜#〜]1番目のフィルタはGoogleで動作しますChrome 2番目のフィルタは動作しますADBで。

NOTE2ブラウザのアドレスバーにリンクが入力された場合、アプリ選択メニューは表示されません。 Ithas<a href="http://example.com"></a>サイドページのリンク。

私の意見では、ここのすべてはかなりぼやけており、実際にすべてが機能することを期待した方法ではありません。しかし、それは私のデバイスでどのように機能するかです。これがあなたにも役立つことを願っています。

107
Simas

いくつかのテストの後、これは私のために働いたものです:

    <activity Android:name=".activities.MainActivity">
        <intent-filter Android:label="@string/app_name">
            <action Android:name="Android.intent.action.VIEW" />
            <category Android:name="Android.intent.category.DEFAULT" />
            <category Android:name="Android.intent.category.BROWSABLE" />
            <data Android:scheme="http"
                  Android:Host="www.example.com"
                  Android:pathPrefix=""
                />
            <data Android:scheme="myschema"
                  Android:Host="example"
                  Android:pathPrefix=""
                />
        </intent-filter>
    </activity>

これは、ブラウザで「 http://www.example.com 」、「 http://www.example.com/ 」などのリンクをクリックすると機能します。 " http://www.example.com/whatever "。 「myschema:// example/whatever」でも同じです。

このコマンドを使用してadbでも動作します(これらのURLのいずれかを使用):

adb Shell am start -W -a Android.intent.action.VIEW -d "http://www.example.com" com.example

始めるのに役立つことを願っています。

すべてが機能している場合は、おそらく、さまざまなアクティビティに対して異なるpathPrefixを設定する必要があります。

14
Ferran Maylinch

私の場合、メインランチャーでもあるMainActivityにディープリンクインテントフィルターを配置していました。それが問題を引き起こしました。

別のアクティビティを作成し、そこにインテントフィルターを配置すると、問題は解決しました。これが同じ問題に直面している他の人を助けることができることを願っています。

2
Harry Aung

URLが次の形式になっていることを確認してください(大文字を独自の文字に置き換えます)。

Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams

Adbツールはこの形式を必要としません。上記を使用して、次のようにsrcまたはhrefに配置できます。

<iframe src="Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams"> </iframe> 
<a href="Android-app://COM.YOUR.APP.IDENTIFIER/SCHEME/HOST?somegetparams">LINK</a>
2
Kelsey

まず、このページの@ user3249477の回答を読んでください。

私は彼が書いたものの代わりにそれを追加したかった、あなたはpathPatternを使用してそれを凝縮することができます:

<activity
    Android:name=".activities.DeepLinkActivity"
    Android:label="@string/app_name">
    <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="http"
              Android:Host="example.com"
            Android:pathPattern=".*"/>
    </intent-filter>
</activity>

「。*」は空の文字列と「/」の両方に一致するため、両方のケースがカバーされます。複数のスキームとホストを処理しようとする場合、これは特に重要になるため、{http、https} X {""、 "/"} X {"foo"、 "bar"のパワーセットをスパムする必要はありません。など}

2
jdowdell

./adb Shell am start -n packagename/.splash.SplashActivity -d "schemeName:// content"

1
manmohan

Adb Shell am start -W -a Android.intent.action.VIEW -d " http://example.com/gizmos " com.myapp.Androidを使用します。

それが動作します。

1
user2600802

私の場合、URLにポート8075があり、それを削除して機能しました

1
amorenew

許可の問題がない場合は、おそらくAPIレベルに関連しています

0

あなたの応答にSimasに感謝します。いくつかの説明を追加したいと思います。

  • このコマンドでアクティビティをテストした後:

    adb Shell am start -n com.example.simon.test/.activities.MainActivity

  • インテントフィルターをAndroidManifest.xmlファイルに追加した後、ディープリンクをテストする必要があります(以下の行を参照)。

    ... ...

したがって、これはテストできるadbコマンドです。

adb Shell am start -W -a Android.intent.action.VIEW -d "http://example.com/gizmos" com.example.packageid

そして

adb Shell am start -W -a Android.intent.action.VIEW -d "http://example.com" com.example.pakageid