Android Deep Linking с пользовательским URI


В моем манифесте определено следующее:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.package">
...
    <activity
        android:name="app.myActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <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="www.example.com"
                android:pathPrefix="/gizmos"
                android:scheme="http" />
            <!-- note that the leading "/" is required for pathPrefix-->
            <!-- Accepts URIs that begin with "example://gizmos”-->
            <data
                android:host="gizmos"
                android:scheme="example" />
        </intent-filter>
    </activity>
 ...

И я определил мой onCreate () как таковой:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    Uri data = intent.getData();
    if (data != null) {
        Log.d("URI",data.toString());            
    }
}

Это в соответствии с документацией Android: Android Deep Linking

Итак, вопрос таков:

Как проверить глубокую привязку URI? Согласно документации я запускаю что-то вроде

Adb shell am start -Ч-андроид.намерение.действие.ВИД - д "пример: / / вещицы" ком.апп.пакет

Но это производит:

Ошибка: активность не запущена, не удается разрешить намерение { act=android.намерение.действие.Посмотреть dat=пример: / / gizmos flg=0x10000000 pkg=com.апп.пакет }

Я также попробовал оболочку с именем и ссылкой на активность, активность запуска и оставил пакет пустым. Единственный, кого я могу заставить работать, это:

Adb shell am start-W-A android.намерение.действие.Вид-d "http://www.example.com/gizmos "

Но даже если я это сделаю, это не значит, что это будет работать в других приложениях. Пользовательские URI (например, пример: / / gizmos) недоступны для других приложений, таких как Gmail и WhatsApp, поэтому тестирование в экосистеме Android также проблематично.

Ответ на этот вопрос переполнения стека не приемлем, так как он не отвечает на вопрос, а скорее просто поощряет использование http: / / version, I want the пример: / / схема работы.

2 7

2 ответа:

ADB отправляет намерение, просто ваше приложение должно иметь отдельные фильтры намерения, когда вы хотите несколько типов ссылок:

    <activity
        android:name="app.myActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <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" />
            <data
                android:host="www.example.com"
                android:pathPrefix="/gizmos"
                android:scheme="http" />
            <!-- note that the leading "/" is required for pathPrefix-->                
        </intent-filter>
    </activity>

Тогда работают следующие команды ADB:

Adb shell am start-W-A android.намерение.действие.VIEW-d "пример: / / вещицы"
adb shell am start-W-A android.намерение.действие.Вид-d "http://www.example.com/gizmos "

Однако я столкнулся с проблемами при добавлении большего количества элементов в пользовательский URI (например, пример: / / вещицы?data1= 'hello'&data2= 'world' - ' & ' отсекается)

И, очевидно, это не исправляет тот факт, что эти ссылки не являются кликабельными в других приложениях, таких как WhatsApp и Gmail... и все же они кликабельны на других платформах.

Как упоминалось в другом ответе, платформа android требует, чтобы вы объявляли отдельные фильтры намерений для каждой глубокой ссылки, которую вы включаете в своем приложении. Вот почему вы получаете ошибку.

Кроме того, вместо использования adb, вы можете проверить deep links непосредственно на android с помощью приложения deep link tester:

Https://play.google.com/store/apps/details?id=com.manoj.dlt

Нет необходимости упоминать имя пакета или имя компонента. Просто введите фактическим прямым ссылкам и огонь.

Я работал с глубокими ссылками и лично обнаружил, что тестирование через adb отнимает много времени. Поэтому я создал это приложение для тестирования глубоких ссылок напрямую и разместил его в play store.