You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Delphi 10.2安卓APP通过PHP唤起后无法接收数据求助

分析Delphi安卓应用唤起后无法获取Intent数据的问题

我帮你梳理下可能导致valor为空、valor3为nil的几个常见原因,结合Delphi 10.2和安卓的特性来逐一排查:

1. AndroidManifest.xml的Intent Filter配置不匹配

这是最常见的原因之一,要确保你的Intent Filter完全匹配PHP生成的唤起链接:

  • 检查schemehost是否和PHP链接一致:比如PHP用的是myapp://myhost?valor=xxx,那Manifest里的<data>标签必须包含android:scheme="myapp"android:host="myhost",如果有path也要对应上。
  • 确认Intent Filter包含必要的actioncategory:必须有<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:
    procedure TForm1.ActivityNewIntent(Sender: TObject; Intent: JIntent);
    begin
      inherited;
      // 更新当前Activity的Intent为新传入的Intent
      SharedActivity.setIntent(Intent);
      // 重新处理Intent数据
      HandleIntentAction;
    end;
    
    如果你没处理这个事件,还是用旧的Intent,自然拿不到新传递的参数。

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

火山引擎 最新活动