Получение нулевого значения из намерения в глубокой ссылке - PullRequest
0 голосов
/ 07 февраля 2019

Я добавил глубокую ссылку на свое приложение, которая отображает действие на определенную веб-страницу на моем веб-сайте (Ссылка относится: https://developer.android.com/training/app-links/deep-linking).При обработке глубокой ссылки в моем Java-коде методы getAction() и getData() дают мне нулевое значение.Я попытался протестировать его здесь: https://firebase.google.com/docs/app-indexing/android/test (Это дало мне идеальный результат), но при нажатии та же ссылка открывается в веб-браузере, а не в моем приложении.

Код манифеста Android:

<activity
    android:name=".MainActivity"
    android:screenOrientation="portrait"
    android:launchMode="singleTask"
    android:exported="true">

    <tools:validation testUrl="https://www.mywebsite.com/xyz" />
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:scheme="https"
            android:host="www.mywebsite.com"
            android:pathPrefix="/xyz" />
    </intent-filter>
</activity>

Java-код:

    Intent intent = getIntent();
    String action = intent.getAction(); // getting null value here
    Uri data = intent.getData(); // getting null value here

Я хочу, чтобы, если приложение присутствовало, оно открывалось при нажатии на ссылку, иначе ссылка откроет веб-страницу.Где и что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Вы можете столкнуться с этой проблемой, поскольку используете singleTask.В этом случае вы должны использовать onNewIntent для «обновления» намерения, потому что onCreate и onResume не будут его обрабатывать.

Это вызывается для действий, которые устанавливают для launchMode значение"singleTop" в своем пакете, или если клиент использовал флаг Intent # FLAG_ACTIVITY_SINGLE_TOP при вызове startActivity (Intent).В любом случае, когда действие перезапускается в верхней части стека действий вместо нового экземпляра запускаемого действия, onNewIntent () будет вызываться для существующего экземпляра с Intent, который использовался для перезапускаит.

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)

    //TODO: do something with new intent
}
0 голосов
/ 07 февраля 2019

вместо того, чтобы получать данные о намерениях в onCreate, войдите в onResume

   @Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    if (intent != null && intent.getData() != null ){
        Toast.makeText(this, intent.getData().toString(), Toast.LENGTH_SHORT).show();
        webView.loadUrl(intent.getData().toString());
    }
}

и добавьте эти строки кода, к которым прикреплено действие для глубоких ссылок, чтобы открыть страницу вашего сайта

и пометить ее какответ, если это помогло вам решить вашу проблему

...