错误:java.lang.NullPointerException:尝试调用虚拟方法“android.content.res.XmlResourceParser”

2023-11-30

我收到此错误。我是 android studio 的新手,我需要为 Unity 创建此插件以在运行时安装 apk

错误 - 尝试在空对象引用上调用虚拟方法“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;
}

}

上下文类 -

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>

插件包装器:

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


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

您可能有其他不相关的错误,但Contextnull 问题应该消失了。

EDIT:

如果您收到异常:

尝试调用虚方法 'android.content.res.XmlResourceParser android.content.pm.packageItemInfo.loadXmlMetaData(android.c‌​ontent.pm.PackageMan‌​ager.java.lang.Strin‌​g)'

你必须做几件事。

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>

就是这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

错误:java.lang.NullPointerException:尝试调用虚拟方法“android.content.res.XmlResourceParser” 的相关文章

随机推荐

  • Cocoa:每次方法调用都会中断?

    通常 在调试时 了解以什么顺序调用类的哪些方法对我来说很重要 天真的解决方案 到目前为止我一直在使用 是弹出一个NSLog在每个方法的顶部 但这是耗时的 重复的 丑陋的 并且如果我在调试后忘记删除日志 会让我的代码看起来很幼稚 一个更干净的
  • Toast 不从列表中选定的项目生成文本

    我在android中用列表视图制作了一个简单的应用程序 因为我想在选择一个项目时进行吐司 我已经尝试如下 但它不起作用 我的代码如下 main java package com example listview import java ut
  • ZF2 骨架应用程序抛出 500 错误

    当尝试使用以下命令部署骨架应用程序时 git clone git github com zendframework ZendSkeletonApplication git cd ZendSkeletonApplication php com
  • 将数组传递给 useEffect 依赖项列表

    每 5 秒长轮询会产生一些数据 我希望我的组件在每次数组的一项 或数组长度本身 发生变化时调度一个操作 在将数组作为依赖项传递给 useEffect 时 如何防止 useEffect 进入无限循环 但如果任何值发生变化 仍然设法调度一些操作
  • 运算符和方法之间的区别

    运算符和方法之间有本质区别吗 我看到的唯一区别是它们的调用方式 它们还有其他区别吗 例如在Python中连接 切片 索引被定义为运算符 而 指字符串 upper replace strip 等等都是方法 如果我正确理解问题 简而言之 一切都
  • Python pygame 未安装

    C Users matth gt pip3 安装 pygame 收集pygame 使用缓存的 pygame 2 1 2 tar gz 10 1 MB 准备元数据 setup py 错误 错误 子进程退出并出现错误 python setup
  • Javascript 和 RegEx:分割​​并保留分隔符

    我有一个正则表达式 它将把我的字符串分割成数组 一切工作正常 除了我想保留分隔符的一部分 这是我的正则表达式 a zA Z0 9 s 在 JavaScript 中 我正在做 var test paragraph split a zA Z0
  • 有没有办法使用 ServiceTask 在控制台应用程序中托管 Razor 页面?

    我正在尝试创建一个控制台应用程序来公开 JSON 服务 另外我想托管 html 和 js 页面来使用它们 我将 md 甚至 htm 文件放入 Views 文件夹中 但我无法访问它们 如果我添加一条路线 Add Test 其中 MyMarkd
  • 46 个 SQL 加载程序的控制文件

    我必须使用 SQL Loader for Oracle 加载 46 个表的数据 所有数据文件均为 CSV CSV 中的列顺序与表中的列顺序匹配 我需要为每个表创建一个控制文件 我批量生产这些文件的最佳方法是什么 我知道这是一个老问题 但它仍
  • Android DexClassLoader 错误,“优化数据目录..不属于当前用户”

    我正在尝试生成一个简单的 Android 应用程序 可以在运行时从 SD 卡加载 DEX 文件 该应用程序有两个活动 第一个活动是一个带有按钮的简单屏幕 当按下按钮时 将启动第二个活动 从而调用 loadDex 方法 loadDex 方法尝
  • 如何初始化相互引用的结构体字段

    我目前想定义一个结构体Piston使用 GamerIterator 进行游戏 pub struct MyGame lt a gt game window GameWindowGLFW game iter GameIterator lt a
  • 将字典保存到 NSUserDefaults 中

    class AddElementVC UIViewController textfields and some other functions are defined here IBAction func addElement sender
  • Win32_MountPoint 和 Win32_Volume 在 Windows XP 上是否可用?

    从我找到的 MSDN 文章中 http msdn microsoft com en us library aa394515 v VS 85 aspx Win32 Volume 和 Win32 MountPoint 在 Windows XP
  • 当我知道 CNAME 存在时,为什么 dns_get_record 不显示它们?

    我正在 PHP 中进行 DNS 记录查找 但遇到了一些令人困惑的事情 我查找了两个不同的域 每个域使用不同的主机和不同的权威名称服务器 我确信这两个域都有 CNAME 我使用这个在线工具查找了 DNS 记录 http network too
  • 使用实体框架自动编号

    我想循环遍历对象集合并将它们全部添加到表中 目标表有一个自动增量字段 如果我添加单个对象就没有问题 如果我添加两个主键都为零的对象 实体框架将失败 我可以手动指定主键 但尝试 EF 的全部目的是让生活更轻松 而不是更复杂 这是代码 收到的异
  • 检查更新查询是否成功[PHP,mysqli] [重复]

    这个问题在这里已经有答案了 我正在使用 PHP 和 mysqli 该程序正在做的是 如果在它设置密码的数据库中找到电子邮件添加和重置代码 它会要求重置代码和电子邮件地址 这部分功能正在工作 我需要这部分的帮助 我需要做的是告诉用户是否设置了
  • 是否可以强制 MapKit 显示所有注释而不进行聚类?

    我有两个类都符合MKAnnotation 我想知道有没有办法强制MapKit当用户缩小并显示所有注释时不聚集注释 上述解决方案对我不起作用 但是这个解决方案有效 final class CarPinMarkerView MKMarkerAn
  • Firefox 中图像顶部显示“提交查询”的图像按钮

    我的项目在 IE 和 Chrome 中都能正确显示 然而 在 FF 中 由于某种原因 图像按钮在其顶部显示 提交查询 我正在 CSS 中设置图像位置 它绝对是正确的 因为它在所有浏览器中都能正常工作 只是 FireFox 出于某种原因将 提
  • 使用 jquery 替换通配符文本

    我有一个包含公司信息 地址 电话等 的数据库 某些电话号码有国际代码 44 0 123 12345 其中 0 的数字因国家 地区而异 我需要去掉 0 我有以下代码 var el contactdetails el html el html
  • 错误:java.lang.NullPointerException:尝试调用虚拟方法“android.content.res.XmlResourceParser”

    我收到此错误 我是 android studio 的新手 我需要为 Unity 创建此插件以在运行时安装 apk 错误 尝试在空对象引用上调用虚拟方法 android content Context Android content Cont