如何从我的 Delphi 应用调用Android 13中的默认Map应用?

xqnpmsa8  于 2023-06-29  发布在  Android
关注(0)|答案(1)|浏览(115)

在 Delphi 中,我试图使用Intent将Android应用中的用户发送到设备的默认Map应用(Google Maps、Waze等)。意图的目的是基于Lat/Lng坐标请求从当前位置到另一位置的方向。它在以前的Android和 Delphi 版本中运行良好,但这段代码在Android 13中无法运行。从我所读到的权限来看,似乎除了Andriod 11之外还有更多的限制。
无论如何,当我点击应用程序中的导航按钮时,我一直收到“未找到接收器”的消息。
My AndroidManifest.xml显示了以下位置权限:

android:targetSdkVersion="32" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

下面是我的Navigate button click事件代码:

procedure TMainForm.NavigateBtnClick(Sender: TObject);
var
  {$IFDEF ANDROID}
    Intent: JIntent;  //Declares the intent object
  {$ENDIF}
  LGoogleMapsURL: String;
begin
   // Populate a string to send to Mapping app
   LGoogleMapsURL:= 'google.navigation:q=37.422219,-122.08364&mode=d';
  
  {$IFDEF MSWINDOWS}
    WebBrowser1.Navigate(LGoogleMapsURL);
  {$ENDIF}

  {$IFDEF ANDROID}
      Intent := TJIntent.Create;
      Intent.setData(StrToJURI(LGoogleMapsURL));
      Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
      Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(LGoogleMapsURL));
      if MainActivity.getPackageManager.queryIntentActivities(Intent, TJPackageManager.JavaClass.MATCH_DEFAULT_ONLY).size > 0 then
        begin          
          MainActivity.startActivity(Intent);
        end
      else
        ShowMessage('Receiver not found');
  {$ENDIF}
end;

这是否不再适用于Android 13或缺少某些内容?

qco9c6ql

qco9c6ql1#

为了让你的例子工作,我需要:
修改AndroidManifest.template.xml,将<queries>标签更改为:

<queries>
<%queries-child-elements%>
        <package android:name="com.google.android.apps.maps" />
    </queries>

(see here
..并修改代码:

URI := TJnet_Uri.JavaClass.parse(StringToJString('google.navigation:q=37.422219,-122.08364&mode=d'));
  Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, URI);
  Intent.setPackage(StringToJString('com.google.android.apps.maps'));
  if Intent.resolveActivity(TAndroidHelper.Context.getPackageManager) <> nil then
    TAndroidHelper.Context.startActivity(Intent);

也就是说,使用queryIntentActivities并不是真正必要的,除非你真的想看看哪些Activity可以处理Intent。URI的类型为:Jnet_Uri
如果您想查询其他包,那么您大概需要在<queries>标记中有相应的条目

相关问题