代码之家  ›  专栏  ›  技术社区  ›  user1147171

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

  •  0
  • user1147171  · 技术社区  · 7 年前

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

    使用debug,我可能会在 get() 陈述首先,宽度和高度是非常大的负数。(请参见下面以绿色突出显示的代码。)然后 获取() 语句返回 null (请参见下面以红色突出显示的代码。)

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

    enter image description here

    1 回复  |  直到 5 年前
        1
  •  2
  •   TWiStErRob    7 年前

    NPE来自 FileProvider.getUriForFile 因为你交错了人。你宣布 android:authorities="com.example.fileprovider" 在清单中,但您在调用时使用了包名。这无法解决 info 在里面 FileProvider.parsePathStrategy .把这两条线连起来,你就可以走了。

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

    关于调试期间的问题:

    • Target.SIZE_ORIGINAL 被宣布为 MIN_VALUE 因此,大量
    • 它不会回来了 null ,IDEA只是对它在方法中的位置感到困惑 return null; 如果在 FileProvider 密码
    • doGet(null) : 无效的 超时在这里,它在代码中得到了正确的保护

    我运行了这个应用程序,奇怪的是,我得到了一条日志,上面写着:

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

    但不是堆栈跟踪,这很奇怪,因为 ex 不可能 无效的 在一个 catch !