Подтвердить что ты не робот

Умывка с глубокой связью не работает

Я следил за инструкциями 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>

Я сделал какие-либо очевидные ошибки?

4b9b3361

Ответ 1

EDIT:

Хорошо сначала убедитесь, что ваш пакет доступен через 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>

ПРИМЕЧАНИЕ, что в приведенном выше примере 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>

ПРИМЕЧАНИЕ Первый фильтр работает в Google Chrome, а второй - в ADB.

ПРИМЕЧАНИЕ2 Меню выбора приложения не будет отображаться, если ссылка введена в адресную строку браузера. Он имеет как ссылку <a href="http://example.com"></a> в стороне на некоторой странице.

На мой взгляд, все здесь довольно размыто и действительно не так, как я ожидал, что все это сработает. Но как это работает на моем устройстве. Надеюсь, что это поможет (и работает) для вас тоже.

Ответ 2

После некоторых тестов это то, что сработало для меня:

    <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 для разных действий.

Ответ 3

Сначала прочитайте @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", и т.д.}

Ответ 4

В моем случае я помещал фильтр основной привязки в MainActivity, который также является основным средством запуска. Это вызвало проблему.

После того, как я создал другое отдельное действие и разместил фильтр намерений, он решил проблему. Надеюсь, это поможет другим, которые сталкиваются с одной и той же проблемой.

Ответ 5

Убедитесь, что ваш 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>

Ответ 6

Вместо этого используйте этот фильтр,

<intent-filter>
<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 "example://gizmos" -->
<data
   android:host="gizmos"
   android:scheme="example" />
</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" />

<!-- Accepts URIs that begin with "http://www.example.com/gizmos" -->
<data 
    android:host="www.example.com"
    android:pathPrefix="gizmos"
    android:scheme="http" />
</intent-filter>

Ответ 7

Спасибо 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

Ответ 8

Использовать оболочку adb am start          -W -a android.intent.action.VIEW          -d " http://example.com/gizmos" com.myapp.android

он будет работать.

Ответ 9

В моем случае у меня есть порт 8075 в URL, который я удалил, и он работал