web-dev-qa-db-ja.com

Android:decodeFileが内部ストレージのファイルに対して常にnullを返す

ファイルをアプリケーションのプライベートストレージにローカルに保存しました。存在することを確認しましたが、BitmapFactory.decodeFileを呼び出すと常にnullが返されます。

ファイルをリソースとして保存し、ImageView.setImageResourceを使用すると、常に問題なく表示されます。

何が問題ですか?

これがスニペットです:

filename = "test.png";

if (doesFileExist(filename))
    Bitmap bMap = BitmapFactory.decodeFile(filename);

私も試しました:

Bitmap bMap = BitmapFactory.decodeFile(getFilesDir().getPath()
                    + filename);
19
Jahmic

この質問は以前、たとえば次のように回答されています。 BitmapFactory.decodeFileは画像が存在していてもnullを返します

これはまさに私が必要としたものでした:

String fname=new File(getFilesDir(), "test.png").getAbsolutePath();
31
Jahmic

アプリリソースに格納されているファイルやファイルは、特別な方法で参照する必要があります。例えば。ファイルがアセットにあり、「myfile.png」という名前の場合、次のように参照する必要があります。

String uriString="file:///Android_asset/myfile.png";
Uri uri=Uri.parse(uriString);
3
barmaley

_BitmapFactory.decodeFile_は、スキームのないファイルパスを想定しています。つまり最初に_file://_なし。

Uriを処理している場合は、.toString()だけでなく、.getPath()を呼び出してメソッドに渡します。

2
David Refaeli

BitmapFactory.decodeFileを使用する代わりに、InputStreamを使用してみてください。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 

    if(resultCode == RESULT_OK){          
        Uri selectedImage = imageReturnedIntent.getData();
        InputStream imageStream = getContentResolver().openInputStream(selectedImage);
        Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
2
rharvey

FileList()を試していただけませんか?それ

このコンテキストのアプリケーションパッケージに関連付けられたプライベートファイルを指定する文字列の配列を返します。

0
user609395

Manifest.permission.READ_EXTERNAL_STORAGEの実行時権限を設定する必要があります。そうしないと、ログにエラーメッセージや表示が表示されずにnullが返されます。マニフェストと実行時の両方で権限をリクエストする必要があることに注意してください。

0
user3447220

私にとっては、「file:/// storage/emulated/0/....」のようなローカルに保存されたURLから画像を取得していました(Phonegapプラグインを使用して画像をキャプチャしました。プラグインが画像パスを提供していたので、ネイティブコードで使用)

これは私のために働いたコードスニペットです。

String captured_image_info = "file:///storage/emulated/0/Android/data/com.testapp/cache/1493809796526.jpg"
Uri uri=Uri.parse(captured_image_info);
largeLog("uri", "" + uri);

InputStream imageStream = getContentResolver().openInputStream(uri);

Bitmap bm = BitmapFactory.decodeStream(imageStream);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object

byte[] decodedBytes = baos.toByteArray();

Bitmap img_captured_image = BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);
0
Chirag Purohit