Delphi 10.2安卓APP通过PHP唤起后无法接收数据求助
分析Delphi安卓应用唤起后无法获取Intent数据的问题
我帮你梳理下可能导致valor为空、valor3为nil的几个常见原因,结合Delphi 10.2和安卓的特性来逐一排查:
1. AndroidManifest.xml的Intent Filter配置不匹配
这是最常见的原因之一,要确保你的Intent Filter完全匹配PHP生成的唤起链接:
- 检查
scheme、host是否和PHP链接一致:比如PHP用的是myapp://myhost?valor=xxx,那Manifest里的<data>标签必须包含android:scheme="myapp"和android:host="myhost",如果有path也要对应上。 - 确认Intent Filter包含必要的
action和category:必须有<action android:name="android.intent.action.VIEW" />,以及<category android:name="android.intent.category.DEFAULT" />、<category android:name="android.intent.category.BROWSABLE" />,否则浏览器无法正确唤起你的应用。 - 避免多个Activity匹配同一个Intent:如果你的应用里有多个Activity声明了相同的Intent Filter,系统可能会默认启动其他Activity,导致当前Frm的HandleIntentAction拿不到数据。
2. Delphi中获取Intent数据的方式错误
浏览器通过ACTION_VIEW唤起应用时,传递的参数是在Intent的Data(也就是URL的query部分)里,而不是Extras里,很多人会搞混这点:
- 正确的获取方式应该是从Intent的
Data中提取query参数,示例代码:procedure TForm1.HandleIntentAction; var LIntent: JIntent; LData: JUri; LValor: string; begin LIntent := SharedActivity.getIntent; if Assigned(LIntent) and Assigned(LIntent.getData) then begin LData := LIntent.getData; // 获取valor参数 LValor := JStringToString(LData.getQueryParameter(StringToJString('valor'))); // 如果是valor3同理 // LValor3 := JStringToString(LData.getQueryParameter(StringToJString('valor3'))); ShowMessage('获取到的valor:' + LValor); end; end; - 注意应用后台唤起的情况:如果你的应用已经在后台运行,浏览器唤起时会触发
onNewIntent而不是重新创建Activity,这时候你需要在ActivityNewIntent事件里更新当前Intent,再调用HandleIntentAction:
如果你没处理这个事件,还是用旧的Intent,自然拿不到新传递的参数。procedure TForm1.ActivityNewIntent(Sender: TObject; Intent: JIntent); begin inherited; // 更新当前Activity的Intent为新传入的Intent SharedActivity.setIntent(Intent); // 重新处理Intent数据 HandleIntentAction; end;
3. PHP生成的唤起链接存在格式/编码问题
- 检查参数是否做了URL编码:如果
valor的值包含特殊字符(比如中文、&、=等),必须用urlencode()处理,否则参数会被截断或解析错误,示例PHP代码:$valor = urlencode('需要传递的带特殊字符的数据'); $valor3 = urlencode('另一个参数'); $deepLink = "myapp://myhost?valor={$valor}&valor3={$valor3}"; echo "<a href='{$deepLink}'>点击唤起应用</a>"; - 确认链接的scheme和Manifest完全一致:虽然安卓的scheme不区分大小写,但尽量保持PHP链接和Manifest里的写法一致,避免潜在的匹配问题。
4. 安卓系统的包可见性限制(针对高版本系统)
如果你的测试设备是Android 11及以上,Delphi 10.2默认的安卓SDK可能没处理包可见性,需要在AndroidManifest.xml里添加<queries>标签,声明你的应用包名,确保浏览器能找到并唤起你的应用:
<queries> <package android:name="com.yourcompany.yourapp" /> </queries>
你可以按照这个顺序逐一排查,大概率是Intent Filter配置或者Delphi获取数据的方式出了问题。
内容的提问来源于stack exchange,提问作者Bazi




