【问题标题】:Android: IllegalArgumentException: Failed to find configured root that contains /data/data/Android:IllegalArgumentException:未能找到包含 /data/data/ 的已配置根目录
【发布时间】:2017-01-20 01:49:00
【问题描述】:

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

}

【问题讨论】:

    标签: android android-glide android-fileprovider


    【解决方案1】:

    就我而言,这是 filepath.xml 中的解决方案

        <paths>
        <root-path name="root" path="." />
    </paths>
    

    【讨论】:

    • 我不明白为什么,但它可以添加这一行。尽管 Android Studio 说“这里不允许元素‘根路径’”。咕哝
    • 兄弟你救了我的命!非常感谢!
    【解决方案2】:

    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")
    

    (不确定我是否完全正确,但你应该明白这一点。)

    【讨论】:

    • 做到了!非常感谢@TWiStErRob! github 上的项目现在应该可以正常运行了,供任何希望参考它的未来搜索者使用。
    • 嗨@TWiStErRob,我正在尝试访问系统文件夹下的文件。您能帮我在 filepaths.xml 文件中添加什么吗?我收到此异常:无法找到包含 /system/CSCVersion.txt 的已配置根目录。谢谢
    • 我将File file = new File(activity.getCacheDir(), "WireInstructions.pdf");uri = FileProvider.getUriForFile(activity, activity.getApplicationContext().getPackageName() + ".provider", file);&lt;cache-path name="external_files" path="."/&gt; 一起使用,效果很好!
    【解决方案3】:

    当我尝试为存储在外部 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 测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多