Android 无法查询存储在Firebase动态/深度链接中的参数
我正在手动创建Firebase动态/深度链接,如下所示:Android 无法查询存储在Firebase动态/深度链接中的参数,android,firebase,uri,deep-linking,firebase-dynamic-links,Android,Firebase,Uri,Deep Linking,Firebase Dynamic Links,我正在手动创建Firebase动态/深度链接,如下所示: Uri BASE_URI = Uri.parse("http://example.com/"); String packageName = getBaseContext().getPackageName(); Uri APP_URI = BASE_URI.buildUpon().path(requestID.getText().toString().trim()+"%3DrequestID="+requestID.getText().to
Uri BASE_URI = Uri.parse("http://example.com/");
String packageName = getBaseContext().getPackageName();
Uri APP_URI = BASE_URI.buildUpon().path(requestID.getText().toString().trim()+"%3DrequestID="+requestID.getText().toString().trim()+"%3Dextra1="+extra1.getText().toString().trim()+"%3Dextra2="+extra2.getText().toString().trim()).build();
String encodedUri = URLEncoder.encode(APP_URI.toString(), "UTF-8");
Uri deepLink = Uri.parse("https://appcode.app.goo.gl/?link="+encodedUri+"&apn="+packageName+"&amv="+16+"&ad="+0);
然后我与另一个用户共享,他收到了这个链接:http://example.com/-KcP1YHgGsg3tVYybX8b%253DrequestID%3D-KCP1YHGSG3Tvyybx8b%253Dextra1%3Dtext1%253Dextra2%3D3%253Dtext2
然后使用以下代码尝试从这里获取查询参数(链接中的额外参数):
boolean autoLaunchDeepLink = false;
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink)
.setResultCallback(
new ResultCallback<AppInviteInvitationResult>() {
@Override
public void onResult(@NonNull AppInviteInvitationResult result) {
if (result.getStatus().isSuccess()) {
// Extract deep link from Intent
Intent intent = result.getInvitationIntent();
final String deepLink = AppInviteReferral.getDeepLink(intent);
Log.d("deepLinkMainActivity", deepLink);
Uri uri = Uri.parse(deepLink);
String requestId = uri.getQueryParameter("requestID");
Log.d("requestId123", requestId);
} else {
Log.d("getInvitation", "getInvitation: no deep link found.");
}
}
});
boolean autoLaunchDeepLink=false;
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient,this,autoLaunchDeepLink)
.setResultCallback(
新的ResultCallback(){
@凌驾
public void onResult(@NonNull AppInviteInvitationResult){
if(result.getStatus().issucess()){
//从意图中提取深层链接
Intent=result.getinvitationcontent();
最终字符串deepLink=AppInviteReferral.getDeepLink(intent);
日志d(“deeplinkmain活动”,deepLink);
Uri=Uri.parse(deepLink);
字符串requestId=uri.getQueryParameter(“requestId”);
Log.d(“requestId123”,requestId);
}否则{
Log.d(“Get邀请函”,“Get邀请函:未找到深层链接”);
}
}
});
但应用程序正在崩溃,显示:java.lang.NullPointerException:println需要一条消息
,因为uri.getQueryParameter(“requestID”)代码>正在返回null
我做错了什么,我如何从深层链接获取查询参数
请让我知道。如果要从链接文本中提取文本,请使用regex或get
在文本的特定索引处。
以下是从邀请中获取数据的方式:
最好粘贴整个错误消息。
这是您的url
uriapp_Uri=BASE_Uri.buildOn().path(requestID.getText().toString().trim()+%3DrequestID=“+requestID.getText().toString().trim()+%3dextra=“+extra.getText().toString().trim()+%3dextra=“+extra.getText().toString().trim()).build()代码>
如果你解码这个Url,你会收到类似这样的东西
http://www.airbanq.com?name=45=extra1=45=extra2=12=extra3=455
此值%3D
等于a=
。要连接查询字符串中的值,您需要使用此&,您可以尝试避免编码和解码,然后重试。在另一个线程中,我提出了这个选项,因为对于旧版本的FIrebase来说,它工作得很好
这是导致空错误的主要原因,基本上,您正试图从中获取查询字符串
http://www.airbanq.com?name=45=extra1=45=extra2=12=extra3=455
创建这样的链接
http://www.airbanq.com?name=45&extra1=45&extra2=12&extra3=455
让我知道。在对代码进行此更改后,这将很好地工作
更新1
我将与您分享一些代码,希望这能解决您的问题。
此代码基于您现在拥有的内容
第一部分是创建URL并添加一些参数,如您所见
Uri BASE_URI = Uri.parse("http://example.com/");
Uri APP_URI = BASE_URI.buildUpon().appendQueryParameter("requestID", "200").
appendQueryParameter("extra1", "value").
appendQueryParameter("extra2", "value").build();
String encodedUri = null;
try {
encodedUri = URLEncoder.encode(APP_URI.toString(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Uri deepLink = Uri.parse("https://app.app.goo.gl/?link="+encodedUri+"&apn=com.xx.xx.dev");
最后一部分只是接收deeplink并读取值
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient, this, autoLaunchDeepLink)
.setResultCallback(
new ResultCallback<AppInviteInvitationResult>() {
@Override
public void onResult(AppInviteInvitationResult result) {
Log.d(TAG, "getInvitation:onResult:" + result.getStatus());
if (result.getStatus().isSuccess()) {
// Extract information from the intent
Intent intent = result.getInvitationIntent();
String deepLink = AppInviteReferral.getDeepLink(intent);
String invitationId = AppInviteReferral.getInvitationId(intent);
try {
deepLink = URLDecoder.decode(deepLink, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Uri uri = Uri.parse(deepLink);
String requestId = uri.getQueryParameter("requestID");
String requestId2 = uri.getQueryParameter("extra2");
// Because autoLaunchDeepLink = true we don't have to do anything
// here, but we could set that to false and manually choose
// an Activity to launch to handle the deep link here.
// ...
}
}
});
AppInvite.AppInviteApi.getInvitation(mGoogleApiClient,this,autoLaunchDeepLink)
.setResultCallback(
新的ResultCallback(){
@凌驾
公开作废onResult(AppInvitedInvitationResult){
Log.d(标记“getInvitation:onResult:+result.getStatus());
if(result.getStatus().issucess()){
//从意图中提取信息
Intent=result.getinvitationcontent();
字符串deepLink=AppInviteReferral.getDeepLink(intent);
字符串invitationId=AppInviteReferral.getInvitationId(intent);
试一试{
deepLink=URLDecoder.decode(deepLink,“UTF-8”);
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
Uri=Uri.parse(deepLink);
字符串requestId=uri.getQueryParameter(“requestId”);
String requestId2=uri.getQueryParameter(“extra2”);
//因为autoLaunchDeepLink=true,所以我们不必做任何事情
//这里,但我们可以将其设置为false并手动选择
//要在此处启动以处理深层链接的活动。
// ...
}
}
});
最后这是舱单
<activity
android:name="com.google.firebase.quickstart.invites.MainActivity"
android:label="@string/app_name">
<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="example.com" android:scheme="http"/>
<data android:host="example.com" android:scheme="https"/>
</intent-filter>
</activity>
希望这可以解决您的问题但是这里:diidu说,&
应该被%3D
替换。我在解码我收到的url后得到了这个消息:http://example.com/-KcP1YHgGsg3tVYybX8b%3DrequestID=-KCP1YHGSG3TVYYBX8B%
<activity
android:name="com.google.firebase.quickstart.invites.MainActivity"
android:label="@string/app_name">
<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="example.com" android:scheme="http"/>
<data android:host="example.com" android:scheme="https"/>
</intent-filter>
</activity>