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
-- 不能把它留在上面因为 Whosebug 不允许 URL 缩写。)
这是我的 ShareTask 代码 class
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()
语句 returns null
。 (请参阅下面以红色突出显示的代码。)
在此先感谢您提供的任何帮助!
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: Sharing http://... failed
但不是堆栈跟踪,这很奇怪,因为 ex
在 catch
!
中不能是 null
刚刚进入 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
-- 不能把它留在上面因为 Whosebug 不允许 URL 缩写。)
这是我的 ShareTask 代码 class
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()
语句 returns null
。 (请参阅下面以红色突出显示的代码。)
在此先感谢您提供的任何帮助!
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: Sharing http://... failed
但不是堆栈跟踪,这很奇怪,因为 ex
在 catch
!
null