繁体   English   中英

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

[英]Android, Glide Image Loading Library: NullPointerException, ProviderInfo

刚进入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 (请参见下面以红色突出显示的代码。)

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

在此处输入图片说明

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

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

关于调试期间的问题:

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

我已经运行了该应用程序,但是很奇怪,我看到一条日志行说

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

但不是堆栈跟踪,这很奇怪,因为在catch ex不能为null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM