[解決済み] ギャラリー(SDカード)からアプリに使用する画像を選ぶには?
質問
この質問は、もともとAndroid 1.6で出題されたものです。
アプリの写真オプションに取り組んでいます。
私のアクティビティには、ボタンとImageViewがあります。ボタンをクリックすると、ギャラリーにリダイレクトされ、画像を選択することができます。選択された画像はImageViewに表示されます。
どのように解決するのですか?
約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、つまりパスを指定し、その文字列[]をカーソル クエリに与えることで動作します。カーソルクエリはパスとともに返されますが、どのカラムにあるのかは
columnIndex
というコードがあります。これは単に名前に基づいて列の番号を取得するもので、フィルタリング処理で使用されるものと同じものです。これができたら、最後に紹介したコードでようやく画像をビットマップにデコードできるようになります。
関連
-
Error:A problem occurred configuring project ':app'. > ビルドを見つけられませんでした。
-
[解決済み] アイテムの親を取得する際にエラーが発生しました。AppCompat v23にアップグレードした後、指定された名前に一致するリソースが見つかりません。
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Bitmapオブジェクトに画像を読み込む際にOutOfMemoryが発生する問題
-
[解決済み] アプリケーションを終了することは嫌われますか?
-
[解決済み] グリッドレイアウトにおけるフリングジェスチャーの検出
-
[解決済み] AndroidでSQLiteを使用する際に、並行処理の問題を回避するにはどうすればよいですか?
-
[解決済み] 初期テキストが「Select One」のAndroidスピナーを作るには?
-
[解決済み】フラグメント内のXML onClickを使用して、ボタンのクリックを処理する方法
-
[解決済み】カメラで撮影した画像をアクティビティに表示する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
アプリはGoogle検索でインデックスされません Androidmanifestのクソみたいな黄色い警告
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
GoogleMapと連携し、位置情報の取得が可能
-
Windowsのadbシェルでデータディレクトリにアクセスするとパーミッションが拒否される
-
android bluetooth--Bluetooth on、検索、ペアリング、接続
-
Android基本アプレット
-
SpinnerのOnItemSelectedListenerのonItemSelectedメソッドの4つのパラメーターの意味
-
アンドロイドスタジオソフトウェア使用詳細説明書
-
[解決済み】Android内蔵のギャラリーアプリからプログラムで画像を取得/選択する方法