权限声明: 确保你的 AndroidManifest.xml
中声明了必要的权限:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
比如我的:因为我应用需要的权限比较多
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools">
<!-- 添加权限声明 -->
<uses-permission android:name="android.permission.CAMERA" /><!--允许应用访问设备的摄像头-->>
<uses-permission android:name="android.permission.RECORD_AUDIO" /><!--允许应用访问设备的麦克风进行音频录制-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--允许应用写入设备的外部存储(如SD卡)-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!--允许应用读取设备的外部存储(如SD卡-->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><!--允许应用管理设备的外部存储,包括访问所有文件-->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /><!--允许应用查询所有已安装的应用的包名-->
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
</application>
</manifest>
unity 代码:代码里面有一个示例打开微信LaunchWeChat
using System.Collections.Generic;
using UnityEngine;
public class LaunchOtherAPK :MonoBehaviour
{
// 替换为目标APK的包名
private string targetPackage = "com.tencent.mm";
public Dictionary<string, string> parametersDic = new Dictionary<string, string>
{
{"my_parameter", "传递的参数"}
};
/// <summary>
/// 打开外部应用
/// </summary>
/// <param name="targetPackage">目标APK的包名</param>
public void LaunchTargetAPK(string targetPackage)
{
this.targetPackage = targetPackage;
LaunchTargetAPK(parametersDic);
}
#region 示例
/// <summary>
/// 打开微信应用
/// </summary>
public void LaunchWeChat()
{
GetInstalledApps();
if(APKIsExist(targetPackage))
{
LaunchTargetAPK(targetPackage);
}else
{
Debug.LogError("微信应用未安装,请先安装微信!");
}
}
#endregion
private void LaunchTargetAPK(Dictionary<string, string> parameters)
{
try
{
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject intent = unityActivity.Call<AndroidJavaObject>("getPackageManager").Call<AndroidJavaObject>("getLaunchIntentForPackage", targetPackage);
if (intent != null)
{
// 传递参数
//intent.Call<AndroidJavaObject>("putExtra", parameterKey, parameterValue);
foreach (var key in parameters.Keys)
{
intent.Call<AndroidJavaObject>("putExtra", key, parameters[key]);
}
unityActivity.Call("startActivity", intent);
}
else
{
Debug.LogError("Intent is null. Target package may not be installed.");
}
}
catch (AndroidJavaException e)
{
Debug.LogError("Error launching APK: " + e.ToString());
}
}
public bool APKIsExist(string packageName)
{
try
{
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject intent = unityActivity.Call<AndroidJavaObject>("getPackageManager").Call<AndroidJavaObject>("getLaunchIntentForPackage", packageName);
if (intent != null)
{
return true;
}
else
{
Debug.LogError("Intent is null. Target package may not be installed.");
return false;
}
}
catch (AndroidJavaException e)
{
Debug.LogError("Error launching APK: " + e.ToString());
return false;
}
}
/// <summary>
/// 获取接收到的参数
/// </summary>
/// <param name="parameterKey"></param>
public string GetStringExtra(string parameterKey)
{
// 获取 Unity 的当前活动
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
// 获取启动时传递的 Intent
AndroidJavaObject intent = unityActivity.Call<AndroidJavaObject>("getIntent");
// 检查 Intent 是否包含指定的参数
if (intent != null && intent.Call<bool>("hasExtra", parameterKey))
{
// 从 Intent 中获取参数值
string parameterValue = intent.Call<string>("getStringExtra", parameterKey);
// 处理接收到的参数
Debug.Log("Received parameter: " + parameterValue);
// 在这里,你可以使用 parameterValue 进行进一步的逻辑处理
return parameterValue;
}
return "";
}
/// <summary>
/// 打印设备已安装应用的信息
/// </summary>
public List<PackageInfo> GetInstalledApps()
{
List<PackageInfo> res = new List<PackageInfo>();
try
{
// 获取PackageManager
AndroidJavaClass packageManagerClass = new AndroidJavaClass("android.content.pm.PackageManager");
AndroidJavaObject packageManager = new AndroidJavaObject("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity").Call<AndroidJavaObject>("getPackageManager");
// 获取已安装应用的信息
const int GET_META_DATA = 0x00000080;
AndroidJavaObject appsList = packageManager.Call<AndroidJavaObject>("getInstalledApplications", GET_META_DATA);
int size = appsList.Call<int>("size");
// 遍历应用列表并打印应用信息
for (int i = 0; i < size; i++)
{
AndroidJavaObject appInfo = appsList.Call<AndroidJavaObject>("get", i);
string appName = packageManager.Call<string>("getApplicationLabel", appInfo);
string packageName = appInfo.Get<string>("packageName");
Debug.Log($"App Name: {appName}, Package Name: {packageName}");
res.Add(new PackageInfo { appName = appName, packageName = packageName });
}
}
catch (System.Exception e)
{
Debug.LogError("Error getting installed apps: " + e.ToString());
}
return res;
}
public struct PackageInfo
{
public string appName;
public string packageName;
}
}