android firebase dynamic link PendingDynamicLinkData 为 null 直接通过应用
android firebase dynamic link PendingDynamicLinkData is null direct through app
问题:为什么 "Short dynamic links" 以编程方式创建不会直接 open/launch 应用程序?
我想在用户单击由 android 应用动态创建的动态 url 时直接启动应用。
单击由 android 应用动态创建的动态短片 link 时,会发生以下情况,
1.Option 显示两个选项,一个是通过 chrome,另一个是通过应用程序
2.if 我选择 chrome 选项,浏览器打开,显示加载对话框并启动带有 PendingDynamicLinkData 数据的应用程序
3.but 如果我选择应用程序选项,应用程序启动应用程序但 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>
您应该在 activity 中处理您的 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 .....
}
}
});
}
我不知道正确的解决方案,但我找到了一个有效的技巧。
首先确保您已将以下意图过滤器添加到应该处理动态 link:
的 activity
<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>
然后在您的 activity 中,使用以下代码获取 link:
String link=null;
if (getIntent().getData()!=null){
link=getIntent().getData().toString();
}
在清单中,将以下意图过滤器添加到将处理 url 的 activity:
覆盖目标 Activity:
的 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);
}
});
完整指南here。
出于某种原因,我无法让它在与主要操作相同的 activity 中工作。
问题:为什么 "Short dynamic links" 以编程方式创建不会直接 open/launch 应用程序?
我想在用户单击由 android 应用动态创建的动态 url 时直接启动应用。
单击由 android 应用动态创建的动态短片 link 时,会发生以下情况,
1.Option 显示两个选项,一个是通过 chrome,另一个是通过应用程序
2.if 我选择 chrome 选项,浏览器打开,显示加载对话框并启动带有 PendingDynamicLinkData 数据的应用程序
3.but 如果我选择应用程序选项,应用程序启动应用程序但 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>
您应该在 activity 中处理您的 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 .....
}
}
});
}
我不知道正确的解决方案,但我找到了一个有效的技巧。 首先确保您已将以下意图过滤器添加到应该处理动态 link:
的 activity <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>
然后在您的 activity 中,使用以下代码获取 link:
String link=null;
if (getIntent().getData()!=null){
link=getIntent().getData().toString();
}
在清单中,将以下意图过滤器添加到将处理 url 的 activity:
覆盖目标 Activity:
的 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);
}
});
完整指南here。 出于某种原因,我无法让它在与主要操作相同的 activity 中工作。