Unity Android 之 在 Unity 中直接调用打开其他应用apk的方法实现
Unity Android 之 在 Unity 中直接调用打开其他应用apk的方法实现
目录
一、简单介绍
整理一些在Unity上可以方便调用 Android 方法的一些接口脚本,便于后期开发使用。
调用 Android 的 getPackageManager ,通过包名打开设备上安装的 apk应用,不需要 Android 端封装接口。
二、使用说明
1、调用方法
OpenPackage("com.tencent.mobileqq); 调用打开手机QQ
三、效果预览
图3-1 Unity打开QQ
四、实现步骤
1、打开Unity,新建一个工程,如下图
图4-1 打开iUnity,新建工程
2、在工程中创建脚本,AndroidProcessData 实现调用 Toast 的功能, Test_AndroidProcessData 测试 Toast 的功能,如下图
图4-2 新建脚本
3、把脚本 Test_AndroidProcessData 挂载到场景中,如下图
图4-3 挂载脚本呢
4、运行场景,测试效果,如下图
图4-4 测试效果
五、关键代码
1、AndroidProcessData
using UnityEngine;
/// <summary>
/// 调用 Android 一些方法的整理
/// </summary>
public static class AndroidProcessData
{
#if UNITY_ANDROID
/// <summary>
/// 通过包名调用其他软件
/// </summary>
/// <param name="pkgName">应用包名</param>
/// <param name="activity">AndroidJavaObject</param>
public static void OpenPackage(string pkgName, AndroidJavaObject activity = null)
{
if (activity == null)
{
AndroidJavaClass UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
}
using (AndroidJavaObject joPackageManager = activity.Call<AndroidJavaObject>("getPackageManager"))
{
using (AndroidJavaObject joIntent = joPackageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", pkgName))
{
if (null != joIntent)
{
activity.Call("startActivity", joIntent);
}
else
{
Debug.Log("未安装此软件:" + pkgName);
}
}
}
}
#endif
}
//相关说明
//a.AndroidJavaClass对应着Android里面的Java类,而AndroidJavaObject对应着Android里面实例化的对象。
//b.一定要切记C#里的String和Java的String不是一码事,所以调用Android方法时如果需要传字符串为参数时,不能直接给个字符串,应该给个Java里的String,例如 new AndroidJavaObject("java.lang.String","你想传的字符串");
//c.由于AndroidJavaClass对应的是类,所以一般用之来调用对应的类的静态变量(GetStatic<Type>)或者静态方法(CallStatic<Type>("functionName", param1, param2,....));其中的Type为返回类型,注意是Java的返回类型不是C#的,一般整型和布尔型是通用的,其他的如果不清除可以统一写返回类型为AndroidJavaObject,当然没有返回类型的不需要写Type。
//d.AndroidJavaObject对应的是实例对象,所以用new方法给其初始化时要注意说明其是哪个类的实例对象。再比如刚才那个例子: AndroidJavaObject javaString = new AndroidJavaObject("java.lang.String", "字符串的值");
2、Test_AndroidProcessData
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test_AndroidProcessData : MonoBehaviour
{
AndroidJavaClass UnityPlayer;
AndroidJavaObject activity;
// Start is called before the first frame update
void Start()
{
UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
}
void OnGUI()
{
GUILayout.BeginArea(new Rect(100, 100, 200, 200));
if (GUILayout.Button("Open QQ Apk"))
{
AndroidProcessData.OpenPackage("com.tencent.mobileqq", activity);
}
GUILayout.EndArea();
}
}