Androidでファイルを開く方法を理解するのに役立ちます。私の特定の問題は、画像ファイルを開くことに関係しています。私のアプリケーションでは、ユーザーが選択したカメラ アプリで画像を撮影し、返された画像を操作します。電話、Android のバージョン、および選択したカメラ アプリに応じて、onActivityResult にさまざまなパラメーターが返されます。URI を取得することもあれば、画像だけを取得することもあれば、両方を取得することもあります。
カメラを起動するコードは次のとおりです。
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, CAMERA_IMAGE);
次に、結果を次のように受け取ります。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_IMAGE && resultCode == Activity.RESULT_OK) {
Log.d(TAG,"In onActivityResult");
Bitmap imageBmp = null;
Uri imageUri = data.getData();
if (data.getExtras() != null) {
imageBmp = (Bitmap)data.getExtras().get("data");
Log.d(TAG,"Got Bitmap");
}
...
}
}
私の問題は、URI を取得しても画像を取得できない場合に発生します。imageBmp が null の場合、URI から画像をロードする必要があります。これをいくつかのデバイスとアプリの組み合わせでテストしました。URI が内部ストレージにある場合もあれば、SD カードにある場合もあります。ファイルが SD カードにある場合は、managedQuery を使用してファイルを取得しました。
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(imageUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imageFileName = cursor.getString(column_index);
File imageFile = new File(imageFileName);
...
内部ストレージにある場合は、FileNotFoundException が発生します。
私の具体的な質問は次のとおりです。これを変更して、ファイルシステム上の場所に関係なく、URIのみを知っているファイルを開くにはどうすればよいですか? 私は次のようなことをしたいと思います:
File imageFile = new File(imageUri);
File は Uri オブジェクトを受け入れません。マネージド クエリを実行して文字列に変換します。
私のより一般的な質問は、そもそもなぜクエリを実行する必要があるのですか? 返された URI をそのまま使用できないのはなぜですか?