Unity3D可以通过一下代码调用另一个APK
public static XmlRequestResult OpenPackage(string pkgName)
{
XmlRequestResult r = new XmlRequestResult();
using (AndroidJavaClass jcPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
{
using (AndroidJavaObject joActivity = jcPlayer.GetStatic<AndroidJavaObject>("currentActivity"))
{
using (AndroidJavaObject joPackageManager = joActivity.Call<AndroidJavaObject>("getPackageManager"))
{
try
{
using (AndroidJavaObject joIntent = joPackageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", pkgName))
{
if (null != joIntent)
{
joActivity.Call("startActivity", joIntent);
r.Code = XmlRequestResult.ExceptionCode.noerror;
r.Message = "OK";
}
else
{
r.Code = XmlRequestResult.ExceptionCode.invalid_param;
r.Message = "没有找到程序包: " + pkgName;
}
}
}
catch (System.Exception ex)
{
r.Code = XmlRequestResult.ExceptionCode.unknown_exception;
r.Message = "调用程序包失败: " + ex.Message;
}
}
}
}
return r;
}
问题
在华为手机测试正常,小米平板测试getLaunchIntentForPackage返回null
确认包名正确
包名是区分大小写的
可能问题
网上很多说法是权限或者入口问题
实际问题
实际上是Android11修改了权限造成的,安卓11对通过包名查找应用做了限制。由于华为用的是鸿蒙系统,没有受到权限修改的影响
如何解决
安卓11收窄了查询包的权限,需要调用方在输出apk时,在androidmanifest.xml中申明可能要查询哪些包。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
<!--其他配置-->
<queries>
<!-- 声明将要查询的包名 -->
<package android:name="com.VRFab.VRSpaceCycling" />
</queries>
</manifest>