この質問はもともと Android 1.6 について尋ねられたものです。
アプリ内の写真オプションに取り組んでいます。
アクティビティにボタンと ImageView があります。ボタンをクリックするとギャラリーにリダイレクトされ、画像を選択できるようになります。選択した画像は ImageView に表示されます。
ベストアンサー1
ほぼ 5 年後の回答を更新しました。
元の回答のコードは、さまざまなソースからの画像が異なるコンテンツ URI (つまり、content://
ではなく )で返されることがあるため、確実に動作しなくなりました。file://
より良い解決策は、 を使用することです。context.getContentResolver().openInputStream(intent.getData())
これにより、選択に応じて処理できる InputStream が返されます。
たとえば、BitmapFactory.decodeStream()
この状況では、オプションと inSampleSize フィールドを使用して大きな画像をダウンサンプリングし、メモリの問題を回避することもできるため、完全に機能します。
ただし、Google Drive などは、実際にはまだダウンロードされていない画像への URI を返します。そのため、getContentResolver() コードをバックグラウンド スレッドで実行する必要があります。
元の回答:
他の回答では、インテントを送信する方法は説明されていましたが、応答を処理する方法についてはよく説明されていませんでした。その方法についてのサンプルコードを次に示します。
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(
selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
}
}
}
この後、選択した画像が「yourSelectedImage」に保存され、好きなように操作できるようになります。このコードは、ContentResolver データベース内の画像の場所を取得することで機能しますが、それだけでは十分ではありません。各画像には、ファイルパスから「最終更新日」、写真が撮影された場所の GPS 座標まで、約 18 列の情報が含まれていますが、フィールドの多くは実際には使用されません。
他のフィールドは実際には必要ないので、時間を節約するために、カーソル検索はフィルターを使用して行われます。フィルターは、必要な列の名前 (MediaStore.Images.Media.DATA) (パス) を指定してから、その string[] をカーソル クエリに渡すことで機能します。カーソル クエリはパスを返しますが、コードを使用するまで、どの列にあるかはわかりませんcolumnIndex
。コードでは、フィルター処理で使用したのと同じ名前に基づいて列の番号を取得するだけです。それができたら、最後に示したコード行を使用して、画像をビットマップにデコードできます。