динамическая ссылка android firebase PendingDynamicLinkData имеет значение null прямо через приложение

Проблема: Почему «Короткие динамические ссылки», созданные программно, не открывают/запускают приложение напрямую?

Я хочу запускать приложение напрямую, когда пользователь щелкает динамический URL-адрес, динамически созданный приложением Android.

При нажатии на динамическую короткую ссылку, созданную динамически приложением Android, происходят следующие вещи:

1. Опция показывает два варианта: один — через хром, другой — через приложение.

2.если я выберу опцию Chrome, браузер откроется, покажет диалоговое окно загрузки и запустит приложение с данными PendingDynamicLinkData

3. но если я выберу вариант приложения, приложение запустит приложение, но PendingDynamicLinkData будет потерян или равен нулю.

Любая помощь будет здорово. мой параметр манифеста ниже

  <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:host="myapp.page.link" android:scheme="http"/>
    <data android:host="myapp.page.link" android:scheme="https"/>
  </intent-filter>

person Kim Young Hak    schedule 15.11.2018    source источник
comment
у брата такая же проблема, есть какое-нибудь решение?   -  person Vishal Patel    schedule 26.03.2021


Ответы (3)


Вы должны обработать свои PendingDynamicLinkData в действии, чтобы переопределить onCreate и onNewIntent. Как это:

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        if (intent != null) {
            handleDeepLink(intent);
        }
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (intent != null) {
        handleDeepLink(intent);
    }
}

private void handleDeepLink(Intent intent) {
        FirebaseDynamicLinks.getInstance().getDynamicLink(intent).addOnSuccessListener(pendingDynamicLinkData -> {
            if (pendingDynamicLinkData != null) {
                Uri deepLink = pendingDynamicLinkData.getLink();
                if (deepLink != null) {
                    // todo .....
                }
            }
        });
    }
person Onix    schedule 15.11.2018
comment
onNewIntent никогда не вызывается - person Kim Young Hak; 15.11.2018
comment
попробуйте добавить в AndroidManifest.xml свой тег ‹activity› android:launchMode=singleInstance - person Onix; 15.11.2018
comment
Используете ли вы для обработки PendingDynamicLinkData MainActivity, которая имеет категорию фильтра намерений android:name=android.intent.category.LAUNCHER? - person Onix; 15.11.2018
comment
Я использую ту же активность для обработки динамических ссылок с категорией фильтра намерений android:name=android.intent.category.LAUNCHER - person Umer Softwares; 04.11.2019

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

    <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:host="example.com"
            android:scheme="http" />
        <data
            android:host="example.com"
            android:scheme="https" />
    </intent-filter>

Источник

Затем в своей деятельности используйте следующий код, чтобы получить ссылку:

String link=null;
if (getIntent().getData()!=null){
    link=getIntent().getData().toString();
}
person Umer Softwares    schedule 05.11.2019

В манифесте добавьте следующий фильтр намерений к действию, которое будет обрабатывать URL-адрес:

переопределить метод OnStart целевого действия:

public override fun onStart() {
    super.onStart()
    FirebaseDynamicLinks.getInstance()
    .getDynamicLink(getIntent())
    .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
        @Override
        public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
            // Get deep link from result (may be null if no link is found)
            Uri deepLink = null;
            if (pendingDynamicLinkData != null) {
                deepLink = pendingDynamicLinkData.getLink();
            }
            // ...
        }
    })
    .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.w(TAG, "getDynamicLink:onFailure", e);
        }
    });

Полное руководство здесь. По какой-то причине я не мог заставить его работать в том же действии, что и действие MAIN.

person MiguelSlv    schedule 05.01.2020