刚进入Android的Glide图片加载库。 使用此处的代码:https://github.com/bumptech/glide/issues/459
这里的完整项目: https://github.com/mhurwicz/glide02
当我在Android Studio中的模拟器中运行应用程序时,我收到以下异常:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.example.glide02/cache/image_manager_disk_cache/5a992029460eed14244e8b970d969d45518b2f7ac10f71eb26bd0aaf7c3bcf06.0
其余信息是:
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
at com.example.glide02.ShareTask.onPostExecute(ShareTask.java:37)
at com.example.glide02.ShareTask.onPostExecute(ShareTask.java:15)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
FileProvider.getUriForFile()
上发生错误@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
}
我已经查看了其他几个与此错误有关的问题,但看不出它们与我的情况有什么关系,可能是由于我对整个区域不熟悉。
非常感谢任何帮助。
这是发生上述方法的类的完整代码:
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"));
}
}
答案 0 :(得分:3)
在filepaths.xml
中你需要
<cache-path name="shared_images_from_glide_cache" path="image_manager_disk_cache"/>
这将导致映射
new File("/data/data/com.example.glide02/cache/image_manager_disk_cache/5a992029460eed14244e8b970d969d45518b2f7ac10f71eb26bd0aaf7c3bcf06.0")
到
Uri.parse("content://com.example.glide02/shared_images_from_glide_cache/5a992029460eed14244e8b970d969d45518b2f7ac10f71eb26bd0aaf7c3bcf06.0")
(不确定我是否完全正确,但你应该明白这一点。)
答案 1 :(得分:3)
就我而言,这是filepath.xml中的解决方案
<paths>
<root-path name="root" path="." />
</paths>
答案 2 :(得分:0)
当我尝试获取存储在外部 SD 卡 中的文件的 Uri 时,出现此错误。但是当我对存储在内部存储中的文件执行相同的操作集时,它运行良好。在我的情况下,在 @xml/file_path 资源文件中进行下面提到的更改(您可以在清单中提供程序的元数据标记下检查您的。)
//adding the below line will give you a warning saying that Element root-path is not allowed here
//but you can ignore that.
<paths>
<root-path name="root" path="." />
</paths
以下代码仅供参考。
//@xml/file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="files" path="." />
<external-files-path name="external_files" path="." />
<external-path name="external_files" path="." />
<cache-path name="cached_files" path="." />
<external-cache-path name="cached_files" path="." />
<root-path name="root" path="." />
</paths>
//My provider in Manifest.xml
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
在 android 11、10 和 7 上测试