【问题标题】:Android, Glide Image Loading Library: NullPointerException, ProviderInfoAndroid、Glide 图片加载库:NullPointerException、ProviderInfo
【发布时间】:2019-03-25 01:06:15
【问题描述】:

刚刚进入 Android 的 Glide 图像加载库。目前正在使用这里的一些代码: https://github.com/bumptech/glide/issues/459

我的完整项目在这里,你想看看吗:

https://github.com/mhurwicz/glide02

当我在 Android Studio 的模拟器中运行应用程序时遇到以下异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

这是 MainActivity 中的关键语句:

new ShareTask(this).execute("http://thelink");

thelink 实际上是 goo.gl/gEgYUd -- 不能把它留在上面,因为 stackoverflow 不允许 URL 缩短器。)

这是我的 ShareTask 类代码

class ShareTask extends AsyncTask<String, Void, File> {
    private final Context context;

    public ShareTask(Context context) {
        this.context = context;
    }
    @Override protected File doInBackground(String... params) {
        String url = params[0]; // should be easy to extend to share multiple images at once
        try {
            return Glide
                    .with(context)
                    .load(url)
                    .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
                    .get() // needs to be called on background thread
                    ;
        } catch (Exception ex) {
            Log.w("SHARE", "Sharing " + url + " failed", ex);
            return null;
        }
    }
    @Override protected void onPostExecute(File result) {
        if (result == null) { return; }
        Uri uri = FileProvider.getUriForFile(context, context.getPackageName(), result);
        share(uri); // startActivity probably needs UI thread
    }

    private void share(Uri result) {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/jpeg");
        intent.putExtra(Intent.EXTRA_SUBJECT, "Shared image");
        intent.putExtra(Intent.EXTRA_TEXT, "Look what I found!");
        intent.putExtra(Intent.EXTRA_STREAM, result);
        context.startActivity(Intent.createChooser(intent, "Share image"));
    }
}

使用调试,我似乎在get() 语句中遇到了麻烦。一方面,宽度和高度是非常大的负数。 (参见下面以绿色突出显示的代码。)然后get() 语句返回null。 (见下方红色突出显示的代码。)

提前感谢您提供的任何帮助!

【问题讨论】:

标签: java android nullpointerexception android-glide


【解决方案1】:

NPE 来自FileProvider.getUriForFile,因为您传递了错误的权限。您在清单中声明了 android:authorities="com.example.fileprovider",但您在调用时使用了包名称。这无法解析FileProvider.parsePathStrategy 中的info。匹配这两个字符串,你会很高兴的。

最简单的解决方法是使用android:authorities="${applicationId}",这会导致0个硬编码字符串,所以你可以继续使用context.getPackageName()

关于您在调试过程中的顾虑:

  • Target.SIZE_ORIGINAL 被声明为 MIN_VALUE,因此数量很大
  • 它没有返回null,IDEA 只是对它在方法中的位置感到困惑,如果在FileProvider 代码中失败,则不应执行return null;
  • doGet(null): null 是这里的超时时间,在代码中得到了妥善的保护

我已经运行了应用程序,但奇怪的是我得到了一条日志行

W/SHARE:分享 http://... 失败

但不是堆栈跟踪,这很奇怪,因为excatch 中不能是null

【讨论】:

  • 谢谢,@TWiStErRob - 这确实解决了这个问题。但是,我现在收到 IllegalArgumentException:无法找到包含 /data/data/ 的已配置根目录。详情在这里:stackoverflow.com/questions/41754799/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
相关资源
最近更新 更多