2

のカメラ写真の縮小版を作成し、それを自分のframelayoutの画像ビューに設定するためにBitmapFactory.decodefile()を使用しようとしています。 次のAndroid開発者からの指示に従って午前:これらの指示で https://developer.android.com/training/camera/photobasics.html を、ファイルが作成され、XMLでフォーマットされたいくつかのメタデータファイルを保持しているfileprovider内部に格納されています。 BitmapFactory.decodefile()は、コンテンツuriがfileprovider内にある画像を格納するこのファイルにアクセスできないようです。 次のようにfileproviderがandroidmanifestファイル内に作成されます。AndroidでのFileProviderパス作成とBitmapFactory.decodefileの問題

<provider 
android:authorities="mypackagename.fileprovider" 
android:name="android.support.v4.content.FileProvider" 
android:exported="false" android:grantUriPermissions="true"> 
<meta-data 
android:name="android.support.FILE_PROVIDER_PATHS" 
android:resource="@xml/file_paths" > 
</meta-data> 
</provider> 

file_paths xmlファイルは次のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<external-path name="my_images"   path="Android/data/mypackagename/files/Pictures/" /> 
</paths> 

絵が置かれる場所のファイル名が生成され、このメソッドを介して:

private File createImageFile() throws IOException { 
// Create an image file name 
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
String imageFileName = "JPEG_" + timeStamp + "_"; 
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
File image = File.createTempFile(imageFileName,".jpg",storageDir); 

// Save a file: path for use with ACTION_VIEW intents 
mCurrentPhotoPath = image.getAbsolutePath(); 
Log.d("absolute",""+image.getAbsolutePath()); 
return image; 
} 

このコードは、startactivityforresult()で次のように画像を撮るためにインテントを開始します:

012今
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
// Ensure that there's a camera activity to handle the intent 
if (i.resolveActivity(getPackageManager()) != null) { 
// Create the File where the photo should go 
photoFile = null; 
try { 
photoFile = createImageFile(); 
} catch (IOException ex) { 
// Error occurred while creating the File 

} 
// Continue only if the File was successfully created 
if (photoFile != null) { 
Uri photoURI = FileProvider.getUriForFile (this,"mypackagename.fileprovider",photoFile); 

i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoURI); 
startActivityForResult(i,TAKE_PICTURE); 
} 
} 

、onActivityForResult()メソッドが起動しますが、それは動作しません(requestCode == TAKE_PICTURE & &のresultCode == RESULT_OK) 場合、私はこの のような文ならば、私を設定している場合。 私は理由が分からない。 fileproviderクラスのアンドロイドリファレンスドキュメントを読むことから、私はそれを参照してください 私の意図で余分に渡されるphotoUriを開く必要があります。 ドキュメントによると、私はそれをParcelFileDescriptorを返すContentResolver.openFileDescriptorで開く必要があります。どういうわけか、これはカメラがちょうど撮った写真がどこにあるかです。 どういうわけか、このParcelFileDescriptorオブジェクトからファイル名にアクセスし、BitmapFactory.decodefileに渡してピクチャビットマップを縮小し、イメージビューに設定する必要があります。私はこのことについてどうすればよいかわかりません

ピクチャビットマップを拡大しようとすると、-1を返す次のコードがあります。つまり、 "BitmapFactoryクラスのアンドロイドリファレンスドキュメントによると"問題のファイルを解読する "。私はなぜ問題があるのか​​分からない。 -1を返すコードは次のとおりです。

BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 

int photoW = bmOptions.outWidth; 
int photoH = bmOptions.outHeight; 

photoWとphotoHの両方が-1を返します。変数mCurrentPhotoPathは、この質問の先頭にあるCreateImageFile()メソッド内で初期化されたことを覚えておいてください。

私も試してみた、

BitmapFactory.decodeFile(photoFile.getAbsolutePath(), bmOptions); 

しかし、それでも同じ結果、実際にmCurrentPhotoPathとphotoFile.getAbsolutePathは()同じ文字列です。

どういうわけか、メタデータxmlファイルのfileproviderがBitmapFactory.decodefile()のファイルパスを何とか隠していると思います。

私がアプリをテストすると写真が撮られ、写真も自分の電話の写真ギャラリーに保存されます。

私はtess-twoライブラリーに進み、カメラからの写真でOCRを実行する必要があるので、アドバイスや提案をお願いします。ご提案

+0

作成したファイルの一時的なアクセス許可を追加しようとしますか?i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); してもう一度お試しください。そのことができたら教えてください。 –

+0

実行時にストレージのアクセス権を要求していますか? –

答えて

3

ため

おかげで、私は正確に同じ問題に直面している、これはそれにどのように私はdealedです:上記の提案として、すべての最初は、カメラを起動する前に、i.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);を設定します。それが唯一のURIのfile:///タイプで動作するようそして、Uri.fromFile()を使用して取得しますが、URIのcontent://タイプはFileProvider.getUriForFile()を使用して取得していないとのAPIの代わりに> = 24

ために必要な方法であるBitmapFactory.decodeFile()メソッドを使用しないでください入力ストリームを開き、次のように画像を復号するContentResolverのを使用する:最初のものはできないので、ビットマップを得るために、あなたは、2番目の入力ストリームをオープンしなければならないこと

BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
bmOptions.inJustDecodeBounds = true; 
ContentResolver cr = getActivity().getContentResolver(); 
InputStream input = null; 
InputStream input1 = null; 
try { 
    input = cr.openInputStream(photoUri); 
    BitmapFactory.decodeStream(input, null, bmOptions); 
    if (input != null) { 
     input.close(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

int photoW = bmOptions.outWidth; 
int photoH = bmOptions.outHeight; 
try { 
    input1 = cr.openInputStream(photoUri); 
    Bitmap takenImage = BitmapFactory.decodeStream(input1);     
    if (input1 != null) { 
     input1.close(); 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

注、再利用される。

関連する問題