Unity 访问Android ContentProvider
文章目录
今天接到个需求,在Unity中需要获取第三方App接口中的某个值,第三方App提供了Uri,如果直接通过 Android 代码去获取,相信一两分钟就可以搞定,但是在 Unity 中怎么获取?
这个时候去查看 Unity 的官方文档,里面看到了 AndroidJavaClass 这些类,这个看起来像是调用 Android 类相关方法的一个入口,那么今天就跟大家介绍下如何利用 AndroidJavaClass 相关方法读取 ContentProvider 中的值。
官方API
https://docs.unity3d.com/ScriptReference/AndroidJavaClass.html
使用
写过 java 反射的同学应该一眼就能学会该怎么使用,看如下实现
// 获取 UnityPlayer 类
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
// 获取当前的 Activity
AndroidJavaObject unityActivity = jc.GetStatic<AndroidJavaObject>("currentActivity");
// 第三方 APP 提供的 uri
string uri = "content://com.demo.third.settings.provider/config";
// 得到 Uri 类型
AndroidJavaClass clsUri = new AndroidJavaClass("android.net.Uri");
// 调用 Uri.parse 方法
AndroidJavaObject objUri = clsUri.CallStatic<AndroidJavaObject>("parse", new object[]{uri});
// 得到 ContentResolver
AndroidJavaObject contentResolver = unityActivity.Call<AndroidJavaObject>("getContentResolver");
// 调用 ContentResolver 的 query 方法
AndroidJavaObject cursorObj = contentResolver.Call<AndroidJavaObject>("query", objUri, null, "key=m", null, null);
// 获取游标内容
if (cursorObj != null && cursorObj.Call<bool>("moveToNext")) {
string m = cursorObj.Call<string>("getString", new object[]{0});
// Log
Debug.Log("m:" + m);
}
// 关闭游标
if (cursorObj != null) {
cursorObj.Call("close");
}
其实以上代码通过 Android 跟以下代码的结果是一致的
String uri = "content://com.demo.third.settings.provider/config";
String m = null;
ContentResolver mResolver = App.getInstance().getContentResolver();
try (Cursor mCursor = mResolver.query(Uri.parse(uri), null,
"key=m", null, null)) {
if (mCursor != null && mCursor.moveToNext()) {
m = mCursor.getString(0);
}
} catch (Exception e) {
e.printStackTrace();
}
return m;
当想通过纯 C# 代码实现某些功能时,可以参考如上方法,利用 AndroidJavaClass 不写 Android 代码即可实现部分功能。
参考
https://forum.unity.com/threads/error-when-query-android-contacts.178582/
文章作者 Brook
上次更新 2020-08-24