2017-12-21 36 views
0

プロバイダを実装するようにプロジェクトを更新しました。全体の実装は正しいようですが、私はの例外を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'

答えて

1

は交換してください:

<external-path name="images" path="Android/data/com.project/cache/tempImage" /> 

と:あなたの現在の実装では、getExternalCacheDir()ポイントについての仮定を作るよう、より信頼性になります

​​3210

まず、。次に、pathはファイルではなくディレクトリを指し示す必要があります。私の推測によれば、これは物事が横向きに進んでいるところです。

+0

はなし 'PATH'パラメータで'外部キャッシュPATH'に変更するには、 'パス」属性は – GuilhermeFGL

+0

@GuilhermeFGLをdefined'されなければならない原因となります。私はそれがオプションであると思った。 'path ="。 "'を試してください。あるいは、 'getExternalCacheDir()'のサブディレクトリにイメージを置き、そのディレクトリ名を 'path'に入れてください。 – CommonsWare

+0

'は私の問題を解決しました。しかし、なぜ例外を取得しませんでした。 – GuilhermeFGL

0

あなたはこの方法でXMLを変更する必要があります:うーん:

<external-path name="images" path="." /> 
関連する問題