Android неявное углубление ссылок: пустые дополнения в Intent - PullRequest
0 голосов
/ 08 мая 2020

Я хочу создать неявный deeplink с помощью компонентов навигации.

Но когда я запускаю свое приложение со следующим URL:

https://my-app.com/cars/ef123-aaf33/parts

, я получаю следующую ошибку:

java.lang.RuntimeException: Unable to start activity ComponentInfo{myapp/screens.car.CarActivity}: java.lang.IllegalStateException: 

Activity screens.car.CarActivity@3b8d354 has null extras in Intent { act=android.intent.action.VIEW cat=[android.intent.category.BROWSABLE] dat=https://my-app.com/... flg=0x13008000 cmp=myapp/screens.car.CarActivity }

У намерения нет дополнительных функций, но он должен содержать carUuid, определенный как заполнитель URL-адреса в deeplink. Ошибка возникает, как только вычисляется navArgs().

Это моя настройка:

nav_graph. xml

<fragment
    android:id="@+id/fragment_parts"
    android:name="myapp.screens.parts.PartsFragment"
    android:label="@string/parts"
    tools:layout="@layout/fragment_parts">
    <deepLink
        android:id="@+id/deepLink"
        app:uri="my-app.com/cars/{carUuid}/parts" />
    <argument
        android:name="carUuid"
        app:argType="string" />
</fragment>

AndroidManifest

<activity android:name=".screens.car.CarActivity" >
    <nav-graph android:value="@navigation/nav_graph" />
</activity>

CarActivity

class CarActivity : AppCompatActivity() {


    private val carViewModel: CarViewModel by viewModel { parametersOf(args.carUuid) }

    private val args: CarActivityArgs by navArgs()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        DataBindingUtil.setContentView<ActivityCarBinding>(this, R.layout.activity_car).also { binding ->
        binding.lifecycleOwner = this
        binding.carViewModel = carViewModel
    }

}

Полезные ссылки:

Android документация для неявных DeepLinks

На DeepLinks от RayWenderlich

---- ОБНОВЛЕНИЕ ----

Я создал минимальный образец проекта и найдены подсказки о том, что происходит / идет не так. Я разместил все в официальном трекере проблем: https://issuetracker.google.com/issues/155690730

Ответы [ 2 ]

1 голос
/ 19 мая 2020

Я получил ответ от группы навигации и решение / обходной путь, который подходит для моего случая. Более подробную информацию, включая пример проекта, можно найти здесь

https://issuetracker.google.com/issues/155690730

ПОЧЕМУ ЭТО ПРОИСХОДИТ (ответ от системы отслеживания проблем Google)

Переход к месту назначения глубокой ссылки внутри SubActivity определенно возможен, но во время handleDeepLink() мы не создали объект NavDeepLink, чтобы иметь возможность идентифицировать переменные глубинных ссылок. Кроме того, если бы мы каким-то образом смогли проанализировать шаблон URL-адреса и поместить его в качестве дополнительного намерения, в приведенном вами примере вызов by navArgs() в SubActivity вернул бы значение «alice», которое предназначено для место назначения глубинной ссылки, а не Activity.

Причина, по которой by navArgs() работает в Activity, когда вы вызываете navigate () с NavDirections, заключается в том, что ActivityNavigator добавляет дополнительные функции в Intent, который используется для запуска нового Activity. Когда вы используете глубокую ссылку от adb, вы обходите все эти логические c, что означает, что намерение, запускающее действие, не имеет дополнительных функций, поэтому оно терпит неудачу, как должно.

Вероятно, есть подход лучше вложенные действия для любого вашего случая использования. При этом вы можете сделать эту работу, добавив дополнительную информацию с именем ключа к команде adb, используемой для запуска приложения по глубокой ссылке: --es "name" <"your string">.

ЧТО Я ДЕЛАЮ СЕЙЧАС

То, что я делаю сейчас, поскольку у меня есть полный контроль над URL-адресами deeplink, - это установка deeplink на саму SubActivity. Кроме того, я даю URL-адрес deeplink также информацию о том, какое назначение SubActivity должно быть установлено как startDestination.

Этот подход отлично подходит для меня. Единственным недостатком является то, что MainActivity также создается в backstack, так что пользователь сначала возвращается к этому MainActivty при нажатии кнопки возврата. Но я могу с этим жить :)

0 голосов
/ 08 мая 2020

Попробуйте вместо этого в своей deepLink:

<fragment
    android:id="@+id/fragment_parts"
    android:name="myapp.screens.parts.PartsFragment"
    android:label="@string/parts"
    tools:layout="@layout/fragment_parts">
    <argument
        android:name="carUuid"
        app:argType="string" />
    <deepLink
        android:id="@+id/deepLink"
        app:uri="my-app.com/cars/{carUuid}/parts" >
    </deepLink>
</fragment>
...