2017-07-13 4 views
1

私はこのerror.Iを取得していますがアンドロイドスタジオに新しいですし、私はでAPKをインストールするには、団結のためにこのプラグインを作成する必要がありますランタイムエラー:java.lang.NullPointerExceptionが:仮想メソッドを呼び出すための試み「android.content.res.XmlResourceParser

エラー - ヌルオブジェクト参照に仮想メソッドを呼び出すための試み 'android.content.Context Android.content.Context.getApplicationContext()'

プラグインクラス -

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 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 - プラグインクラス

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; 
} 

} 

プラグラッパー -

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

Plugins/Android

+0

ここで整理 'android:name ="。ContextClass ">' –

+0

あなたは 'InstallApp'関数をどのように呼びますか? C#の場合は、そのコードも投稿してください。 – Programmer

+0

@Programmerはい私はC#から呼び出しています...上記のコードを追加しました –

答えて

1

Contect 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ヌル問題がなくなってしなければなりません。

EDIT:

あなたが例外を取得した場合:

Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.packageItemInfo.loadXmlMetaData(android.c‌​ontent.pm.PackageMan‌​ager.java.lang.Strin‌​g)'

をあなたはいくつかのことを行う必要があります。あなたのUnityProject /資産/プラグイン/ Androidのディレクトリをプラグイン "の.jar" .Put

.Copyあなた"AndroidSDK /エクストラ/アンドロイド/サポート/ V4 /アンドロイド・サポート・v4.jar" ディレクトリあなたの「UnityProject /資産への "アンドロイド・サポート-v4.jar"/Plugins/Android "ディレクトリにあります。

.CreateあなたUnityProject /資産/プラグイン/ Androidのディレクトリに "のAndroidManifest.xml" というファイルと、それに以下のコードを置きます。

独自のパッケージ名"com.company.product"を交換することを確認します。これが出現したのインスタンスがあります。あなたはそれらの両方を交換する必要があります。

これらは= "com.company.product" パッケージで発見されアンドロイド:当局= "com.company.product.fileprovider""fileprovider"を変更または削除して他のものを変更しないでください。

<?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> 

.Createあなた「UnityProject /資産/プラグイン/アンドロイド/ resを中 "provider_paths.xml" と呼ばれる新しいファイル:ここで

は "AndroidManifest.xmlを" ファイルであります/ xml "ディレクトリに移動し、その下にコードを入力します。ご覧のとおり、resを作成し、xmlというフォルダを作成する必要があります。

独自のパッケージ名"com.company.product"を交換することを確認します。 と表示されました。

<?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> 

それだ:ここで

は、あなたがこの "provider_paths.xml" ファイルに入れなければならないものです。

+0

悲しいことに、私はgear-vrを持っていないので、私はその問題を再現することができないので、実際にはそれを手助けできないかもしれません。私の他の答え[了解](https://stackoverflow.com/a/45138326/3785314)を忘れないでください。一方で、あなたは[this](https://androidforums.com/forums/samsung-gear-vr.2922/)や[that](https://forum.xda-developers.com)のような他のフォーラムで試してみるべきだと思います/ mobile-vr/gear-vr)。私が何かを見つけたら、私は答えを残します。 – Programmer

関連する問題