I am getting this error.I am new to android studio and i need to create this plugin for unity to install an apk at runtime
Error - Attempt to invoke virtual method 'android.content.Context Android.content.Context.getApplicationContext()' on a null object reference
Plugin Class -
package com.example.unitypluginappinstall; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.v4.content.FileProvider; import java.io.File; public class PluginClass extends Activity { static String errMessage; public static String InstallApp(String ApkPath){ try { errMessage = "test"; File toInstall = new File(ApkPath); Uri apkUri = FileProvider.getUriForFile(ContextClass.context(), ContextClass.context().getApplicationContext().getPackageName() + ".fileprovider", toInstall); Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); intent.setData(apkUri); intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); ContextClass.context().startActivity(intent); } catch (Exception e){ errMessage = e.getMessage(); } return errMessage; } } ContextClass -
package com.example.unitypluginappinstall; import android.app.Application; import android.content.Context; public class ContextClass extends Application { private static ContextClass instance; public ContextClass(){ instance = this; } public static ContextClass instance(){ return instance; } public static Context context() { return instance.getApplicationContext(); } } Manifest File -
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.unitypluginappinstall"> <application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths"></meta-data> </provider> android:name=".ContextClass"> </application> PluginWrapper:
public class PluginWrapper : MonoBehaviour { string savePath; void Start () { savePath = Path.Combine(Application.persistentDataPath, "data"); savePath = Path.Combine(savePath, "applaunchtest.apk"); Install(); } void Install(){ try { //Install APK GameObject.Find("TextDebug").GetComponent<Text().text"Installing..."; var plugin = new AndroidJavaClass("com.example.unitypluginappinstall.PluginClass"); GameObject.Find("TextDebug").GetComponent<Text>().text = plugin.CallStatic<string>("InstallApp", savePath); } catch(Exception e) { GameObject.Find("TextDebug").GetComponent<Text>().text = e.Message; } } } EDIT - Plugin Class
package com.example.unitypluginappinstall; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.support.v4.content.FileProvider; import java.io.File; public class PluginClass extends Activity { static String errMessage; public static String InstallApp(Context context, String ApkPath){ try { errMessage = "test"; File toInstall = new File(ApkPath); Uri apkUri = FileProvider.getUriForFile(context, context.getApplicationContext().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; } } Plugin Wrapper -
public class PluginWrapper : MonoBehaviour { string savePath; void Start () { savePath = Path.Combine(Application.persistentDataPath, "data"); savePath = Path.Combine(savePath, "applaunchtest.apk"); Install(); } void Install(){ try { //Install APK AndroidJavaClass unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject unityActivity = unityClass.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaObject unityContext = unityActivity.Call<AndroidJavaObject>("getApplicationContext"); GameObject.Find("TextDebug").GetComponent<Text().text"Installing..."; var plugin = new AndroidJavaClass("com.example.unitypluginappinstall.PluginClass"); GameObject.Find("TextDebug").GetComponent<Text>().text = plugin.CallStatic<string>("InstallApp",unityContext, savePath); } catch(Exception e) { GameObject.Find("TextDebug").GetComponent<Text>().text = e.Message; } } } EDIT
