プロバイダを実装するようにプロジェクトを更新しました。全体の実装は正しいようですが、私はの例外をFileProvider
クラス内に受け取りました。FileProvider.getUriForFileが原因でStringIndexOutOfBoundsExceptionが発生しています
私の場合、ユーザーは自分のライブラリからイメージを取得するか、新しい写真を撮るかを選択するインテントが作成されます。
これは、自分のインテントの1つが作成された後で、リストに含めて選択子を作成する場所です。
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
方法:スローされ
private static File getTempFile(Context context) {
File imageFile = new File(context.getExternalCacheDir(), TEMP_IMAGE_NAME);
if (imageFile.getParentFile().mkdirs()) {
return imageFile;
} else {
return null;
}
}
例外:
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)
私はこのような状況で進行する方法を教えてください。おそらく、このバージョンのProviderのバグでしょうか?
マニフェストファイル:
<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ファイル:私のプロジェクトについては、いくつかのより多くの情報を追跡するには
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="images" path="Android/data/com.project/cache/tempImage" />
</paths>
buildToolsVersion '27.0.2'
はなし 'PATH'パラメータで'外部キャッシュPATH'に変更するには、 'パス」属性は – GuilhermeFGL
@GuilhermeFGLをdefined'されなければならない原因となります。私はそれがオプションであると思った。 'path ="。 "'を試してください。あるいは、 'getExternalCacheDir()'のサブディレクトリにイメージを置き、そのディレクトリ名を 'path'に入れてください。 – CommonsWare
' は私の問題を解決しました。しかし、なぜ例外を取得しませんでした。 –
GuilhermeFGL