Java 插件的上下文是null
。如果需要,您必须将 Unity 的上下文发送到 Java 插件。
添加另一个接收参数Context
然后使用参数中的上下文而不是来自参数的上下文Android.content.Context.getApplicationContext()
.
Java:
public static String InstallApp(Context context, String ApkPath){
try {
errMessage = "test";
File toInstall = new File(ApkPath);
Uri apkUri = FileProvider.getUriForFile(context,
context.getPackageName() +
".fileprovider", toInstall);
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE);
intent.setData(apkUri);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);
}
catch (Exception e){
errMessage = e.getMessage();
}
return errMessage;
}
C#:
发送团结Context
以及您想要传递给函数的路径。
void Install()
{
try
{
GameObject.Find("TextDebug").GetComponent<Text>().text = "Installing...";
//Get Unity Context
AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext");
AndroidJavaClass plugin = new AndroidJavaClass("com.example.unitypluginappinstall.PluginClass");
string result = plugin.CallStatic<string>("InstallApp", unityContext, savePath);
}
catch (Exception e)
{
GameObject.Find("TextDebug").GetComponent<Text>().text = e.Message;
}
}
您可能有其他不相关的错误,但Context
null 问题应该消失了。
EDIT:
如果您收到异常:
尝试调用虚方法
'android.content.res.XmlResourceParser
android.content.pm.packageItemInfo.loadXmlMetaData(android.content.pm.PackageManager.java.lang.String)'
你必须做几件事。
1.将“.jar”插件放入您的UnityProject/资产/插件/Android目录。
2.从您的文件中复制“android-support-v4.jar”“AndroidSDK/extras/android/support/v4/android-support-v4.jar”目录到你的“UnityProject/资产/插件/Android”目录。
3.在您的文件中创建一个名为“AndroidManifest.xml”的文件UnityProject/资产/插件/Android目录并将以下代码放入其中。
确保更换“com.公司.产品”用你自己的包名。有2出现这种情况的实例。您必须更换它们:
这些发现于包=“com.company.product” and android:authorities="com.company.product.fileprovider"。不要更改或删除“文件提供者”并且不要改变任何其他东西。
这是“AndroidManifest.xml”文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.product" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal" android:versionName="1.0" android:versionCode="1">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<application android:theme="@style/UnityThemeSelector" android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="true">
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name">
<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>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.company.product.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
</application>
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
</manifest>
4.创建一个名为“的新文件提供者路径.xml“ 在你的“UnityProject/资产/插件/Android/res/xml”目录并将下面的代码放入其中。如您所见,您必须创建一个res然后一个xml folder.
确保更换“com.公司.产品”用你自己的包名。
才出现了once.
这是您应该放入的内容“提供者路径.xml" file:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--<external-path name="external_files" path="."/>-->
<external-path path="Android/data/com.company.product" name="files_root" />
<external-path path="." name="external_storage_root" />
</paths>
就是这样。