のカメラ写真の縮小版を作成し、それを自分の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を実行する必要があるので、アドバイスや提案をお願いします。ご提案
作成したファイルの一時的なアクセス許可を追加しようとしますか?i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); してもう一度お試しください。そのことができたら教えてください。 –
実行時にストレージのアクセス権を要求していますか? –