Java Android,Glide图像加载库:NullPointerException,ProviderInfo
刚刚进入Android的Glide图像加载库。目前正在使用以下代码: 我的完整项目在这里,你想看看它: 当我在Android Studio的emulator中运行应用程序时,出现以下异常:Java Android,Glide图像加载库:NullPointerException,ProviderInfo,java,android,nullpointerexception,android-glide,Java,Android,Nullpointerexception,Android Glide,刚刚进入Android的Glide图像加载库。目前正在使用以下代码: 我的完整项目在这里,你想看看它: 当我在Android Studio的emulator中运行应用程序时,出现以下异常: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(a
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"));
}
}
class ShareTask扩展了AsyncTask{
私人最终语境;
公共共享任务(上下文){
this.context=上下文;
}
@覆盖受保护的文件doInBackground(字符串…参数){
字符串url=params[0];//应该易于扩展,以便一次共享多个图像
试一试{
回程滑翔
.与(上下文)
.load(url)
.仅下载(Target.SIZE_原件,Target.SIZE_原件)
.get()//需要在后台线程上调用
;
}捕获(例外情况除外){
Log.w(“共享”、“共享”+url+“失败”,ex);
返回null;
}
}
@重写受保护的void onPostExecute(文件结果){
如果(result==null){return;}
Uri=FileProvider.getUriForFile(上下文,context.getPackageName(),结果);
共享(uri);//startActivity可能需要UI线程
}
私有无效共享(Uri结果){
意向意向=新意向(意向.行动\发送);
intent.setType(“图像/jpeg”);
intent.putExtra(intent.EXTRA_主题,“共享图像”);
intent.putExtra(intent.EXTRA_文本,“看看我发现了什么!”);
intent.putExtra(intent.EXTRA_流,结果);
context.startActivity(Intent.createChooser(Intent,“共享图像”));
}
}
使用debug,我似乎在get()
语句中遇到了麻烦。首先,宽度和高度是非常大的负数。(请参阅下面以绿色突出显示的代码。)然后get()
语句返回null
。(请参见下面以红色突出显示的代码。)
提前感谢您提供的任何帮助
NPE来自
文件提供程序.getUriForFile
,因为您传递了错误的权限。您在清单中声明了android:authorities=“com.example.fileprovider”
,但在调用时使用了包名。这无法解析FileProvider.parsePathStrategy
中的info
。把这两条线连起来,你就可以走了
最简单的修复方法是使用android:authorities=“${applicationId}”
,这将导致0个硬编码字符串,因此您可以继续使用context.getPackageName()
关于调试期间的问题:
声明为Target.SIZE\u ORIGINAL
,因此该数字较大MIN\u值
- 它没有返回
,只是混淆了它在方法中的位置,null
返回null如果在
文件提供程序中失败,则不应执行code>
:doGet(null)
是这里的超时,它在代码中得到了正确的保护null
但不是堆栈跟踪,这很奇怪,因为
ex
在catch
中不能null
NPE来自FileProvider.getUriForFile
,因为您传递了错误的权限。您在清单中声明了android:authorities=“com.example.fileprovider”
,但在调用时使用了包名。这无法解析FileProvider.parsePathStrategy
中的info
。把这两条线连起来,你就可以走了
最简单的修复方法是使用android:authorities=“${applicationId}”
,这将导致0个硬编码字符串,因此您可以继续使用context.getPackageName()
关于调试期间的问题:
声明为Target.SIZE\u ORIGINAL
,因此该数字较大MIN\u值
- 它没有返回
,只是混淆了它在方法中的位置,null
返回null如果在
文件提供程序中失败,则不应执行code>
:doGet(null)
是这里的超时,它在代码中得到了正确的保护null
但不是堆栈跟踪,这很奇怪,因为
ex
在catch
中不能null
请提供更多日志可能的副本请提供更多日志可能的副本谢谢,@TWiStErRob-这确实解决了这个问题。但是,我现在得到了IllegalArgumentException:找不到包含/data/data/的配置根目录。这里的细节:谢谢,@TWiStErRob-这确实解决了这个问题。但是,我现在得到了IllegalArgumentException:找不到包含/data/data/的配置根目录。详情如下: