348

この質問は、もともと Android 1.6 に対して行われました。

アプリの写真オプションに取り組んでいます。

アクティビティにボタンと ImageView があります。ボタンをクリックすると、ギャラリーにリダイレクトされ、画像を選択できるようになります。選択した画像が ImageView に表示されます。

4

10 に答える 10

420

更新された回答、ほぼ5年後:

元の回答のコードは、さまざまなソースからの画像が異なるコンテンツ URI で返されることがあるためcontent://file://. より良い解決策は、単に を使用するcontext.getContentResolver().openInputStream(intent.getData())ことです。これは、選択したとおりに処理できる InputStream を返すためです。

たとえばBitmapFactory.decodeStream()、 Options および inSampleSize フィールドを使用して大きな画像をダウンサンプリングし、メモリの問題を回避することもできるため、この状況では完全に機能します。

ただし、Google ドライブなどは、実際にはまだダウンロードされていない画像への 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カーソル クエリはパスを返しますが、コードを使用するまで、それがどの列にあるかはわかりません。これは、フィルタリングプロセスで使用されたものと同じ名前に基づいて、列の番号を取得するだけです。それを取得したら、最後に指定したコード行を使用して、最終的に画像をビットマップにデコードできます。

于 2010-03-24T13:51:13.523 に答える
316
private static final int SELECT_PHOTO = 100;

開始意図

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);    

処理結果

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

    switch(requestCode) { 
    case SELECT_PHOTO:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            InputStream imageStream = getContentResolver().openInputStream(selectedImage);
            Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
        }
    }
}

または、OutOfMemory エラーを回避するために画像をダウンサンプリングすることもできます。

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 140;

        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
               || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);

    }
于 2011-02-23T03:31:40.157 に答える
87

結果を得るには、ギャラリー インテントを開始する必要があります。

Intent i = new Intent(Intent.ACTION_PICK,
               android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

次に、onActivityForResultを呼び出しintent.getData()て画像の Uri を取得します。次に、ContentProvider から画像を取得する必要があります。

于 2010-03-24T13:28:21.847 に答える
14

これを実行してギャラリーを起動し、ユーザーが画像を選択できるようにします。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);

次に、onActivityResult()返された画像の URI を使用して、ImageView に画像を設定します。

于 2010-03-24T13:34:11.190 に答える
11
public class EMView extends Activity {
ImageView img,img1;
int column_index;
  Intent intent=null;
// Declare our Views, so we can access them later
String logo,imagePath,Logo;
Cursor cursor;
//YOU CAN EDIT THIS TO WHATEVER YOU WANT
private static final int SELECT_PICTURE = 1;

 String selectedImagePath;
//ADDED
 String filemanagerstring;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    img= (ImageView)findViewById(R.id.gimg1);



    ((Button) findViewById(R.id.Button01))
    .setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

            // in onCreate or any event where your want the user to
            // select a file
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,
                    "Select Picture"), SELECT_PICTURE);


        }
    });
}

//UPDATED
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();

            //OI FILE Manager
            filemanagerstring = selectedImageUri.getPath();

            //MEDIA GALLERY
            selectedImagePath = getPath(selectedImageUri);


            img.setImageURI(selectedImageUri);

           imagePath.getBytes();
           TextView txt = (TextView)findViewById(R.id.title);
           txt.setText(imagePath.toString());


           Bitmap bm = BitmapFactory.decodeFile(imagePath);

          // img1.setImageBitmap(bm);



        }

    }

}

//UPDATED!
public String getPath(Uri uri) {
String[] projection = { MediaColumns.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
column_index = cursor
        .getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
 imagePath = cursor.getString(column_index);

return cursor.getString(column_index);
}

}
于 2011-03-09T10:12:43.220 に答える
8
public class BrowsePictureActivity extends Activity {
private static final int SELECT_PICTURE = 1;

private String selectedImagePath;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ((Button) findViewById(R.id.Button01))
            .setOnClickListener(new OnClickListener() {

                public void onClick(View arg0) {

                    Intent intent = new Intent();
                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);
                    startActivityForResult(Intent.createChooser(intent,
                            "Select Picture"), SELECT_PICTURE);
                }
            });
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
        }
    }
}

public String getPath(Uri uri) {

        if( uri == null ) {
            return null;
        }

        // this will only work for images selected from gallery
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if( cursor != null ){
            int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }

        return uri.getPath();
}

}
于 2014-02-21T12:04:28.090 に答える