首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >FileProvider.getUriForFile导致了StringIndexOutOfBoundsException

FileProvider.getUriForFile导致了StringIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2017-12-21 18:58:01
回答 2查看 2.4K关注 0票数 5

我更新了我的项目以实现提供者。整个实现似乎是正确的,但我在FileProvider类中收到了一个FileProvider异常。

在我的例子中,创建了一个意图,在这个意图中,用户将选择从他的库中获取图像还是拍摄一张新照片。

这就是我的意图之一被创建的地方,在列表之后,包括在列表中,以创建一个选择器。

代码语言:javascript
运行
复制
    File file = getTempFile(context);
    if (file != null) {
        Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        takePhotoIntent.putExtra("return-data", true);
        takePhotoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                FileProvider.getUriForFile(context,                        // line 43
                        BuildConfig.APPLICATION_ID.concat(".fileprovider"),
                        file));
        intentList = addIntentsToList(context, intentList, takePhotoIntent);
    }

getTempFile方法:

代码语言:javascript
运行
复制
private static File getTempFile(Context context) {
    File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME);
    if (imageFile.getParentFile().mkdirs()) {
        return imageFile;
    } else {
        return null;
    }
}

引发的异常:

代码语言:javascript
运行
复制
java.lang.StringIndexOutOfBoundsException: length=86; index=87
     at java.lang.String.substring(String.java:1939)
     at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:728)
     at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:404)
     at com.project.helper.ImagePicker.getPickImageIntent(ImagePicker.java:43)

在这种情况下我该怎么做?也许是这个版本的提供者的错误?以下是有关我的项目的更多信息:

舱单档案:

代码语言:javascript
运行
复制
    <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.project.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths"/>
    </provider>

file_paths.xml文件:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="images" path="Android/data/com.project/cache/tempImage" />
</paths>

buildToolsVersion '27.0.2'

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-21 19:03:57

取代:

代码语言:javascript
运行
复制
<external-path name="images" path="Android/data/com.project/cache/tempImage" />

通过以下方式:

代码语言:javascript
运行
复制
<external-cache-path name="images" path="." />

首先,这将是更可靠的,因为您当前的实现对getExternalCacheDir()点的位置进行了假设。第二,path需要指向一个目录,而不是一个文件,而我的猜测是,这就是事情发展的方向。

票数 3
EN

Stack Overflow用户

发布于 2017-12-21 19:05:58

您必须以这样的方式更改xml:

代码语言:javascript
运行
复制
<external-path name="images" path="." />
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47931146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档