java - Android,Glide图像加载库: NullPointerException, ProviderInfo

标签 java android nullpointerexception android-glide

刚刚进入 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");

(该链接实际上是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。 (请参阅下面以红色突出显示的代码。)

预先感谢您提供的任何帮助!

enter image description here

最佳答案

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

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

关于您在调试过程中遇到的问题:

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

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

W/SHARE: Sharing http://... failed

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

关于java - Android,Glide图像加载库: NullPointerException, ProviderInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41753322/

相关文章:

java - 我能知道Eclipse是如何自动编译Java代码的吗?

java - 如果在 Apache Spark Java 中为空,则用另一个值替换一行的值

android - 在首选项中更改摘要的字体大小

java - 线程 "AWT-EventQueue-0"java.lang.NullPointerException中的异常和JTable问题

pointers - 空指针定义在计算机的哪一层?

java - 使用棋盘的2个输入坐标,识别它们是否交叉了彼此的路径(使用国际象棋游戏的皇后 Action )

Java:如何@SuppressWarnings 无法访问的代码?

java - 使用 DatagramPacket 发送 0x04 - 类似于十六进制 char[] 数据

android - 在位图上应用多重效果而不保存

Java HTML解析NullpointerException