問題の簡単な要約:ローカル画像ファイルを読み込もうとしています。ファイルをアセットディレクトリに含めてアセットとして扱うと、すべて正常に機能します。ただし、外部SDカードから読み取ろうとすると、BitmapFactory.decodeストリームはnullを返します。.jpegファイルと.pngファイルの両方で同じ結果が得られました。
これは、アセットファイルからInputStreamを取得する方法です。
InputStream isa = context.getAssets().open("Boulder.jpg");
これは、アセットファイルからInputStreamを取得する方法です。
File f = new File( "/mnt/extSdCard/Maps/Colorado/Boulder.jpg" );
InputStream isf = new BufferedInputStream( new FileInputStream( f.toString() ) );
いずれの場合も、InputStreamはこのコードに渡されます:(このコードが見覚えがある場合は、インターネットの例から借用したものです)
this.decoder = BitmapRegionDecoder.newInstance(inputStream, false);
tmpOptions.inJustDecodeBounds = true;
Bitmap temp = BitmapFactory.decodeStream(inputStream, null, tmpOptions);
setSceneSize(tmpOptions.outWidth, tmpOptions.outHeight);
tmpOptions.inJustDecodeBounds = false;
tmpOptions.inSampleSize = (1<<downShift);
sampleBitmap = BitmapFactory.decodeStream(inputStream, null, tmpOptions);
ここでも、InputStreamから派生したアセットファイルを使用すると、すべてが正常に機能します。逆に、sdCardファイルでは、最初の呼び出しの後、outWidthとoutHeightは両方とも-1であり、2回目以降はsampleBitmapがnullになります。
私は本当にこの問題に巻き込まれ、このフォーラムを閲覧し、提案された解決策を実験することに多くの時間を費やしてきましたが、まったく役に立ちませんでした。また、ファイルの両方のバージョンを開き、上記のようにInputStreamsを作成し、各ストリームの内容を読み取り、各バイトを比較して、それらが同一であることがわかったテストコードをいくつか作成しました。
さまざまなデバイスでコードを試しましたが、同じ結果になりました。私は現在、Galaxy Note II(Android 4.1.1)でテストしており、AndroidManifestに次のバージョン情報があります。
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="16"/>
システムにファイルを動的に追加する機能が必要なので、すべてをアセットとして含めることはできません。どんな助けでも大歓迎です。