首页 文章

如何从我的应用程序的库(SD卡)中选择图像?

提问于
浏览
334

这个问题最初是针对Android 1.6提出的 .

我在我的应用程序中处理照片选项 .

我的Activity中有一个按钮和一个ImageView . 当我点击按钮时,它会重定向到图库,我可以选择一个图像 . 选定的图像将出现在我的ImageView中 .

10 回答

  • 11

    近5年后更新的答案:

    原始答案中的代码不再可靠地工作,因为来自各种来源的图像有时会返回不同的内容URI,即 content:// 而不是 file:// . 更好的解决方案是简单地使用 context.getContentResolver().openInputStream(intent.getData()) ,因为它将返回一个您可以根据需要处理的InputStream .

    例如, BitmapFactory.decodeStream() 在这种情况下可以正常工作,因为您还可以使用Options和inSampleSize字段对大图像进行缩减采样并避免内存问题 .

    但是,像Google Cloud 端硬盘这样的内容会将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数据库中获取映像的位置来工作,但这本身是不够的 . 每个图像有大约18列信息,从其文件路径到“最后修改日期”到拍摄照片的GPS坐标,尽管实际上没有使用许多字段 .

    为了节省时间,在您使用 columnIndex 代码之前,不要知道它所在的列 . 这只是根据其名称获取列的编号,与过滤过程中使用的相同 . 一旦你最终能够使用我给出的最后一行代码将图像解码为位图 .

  • 3
    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);
    
        }
    
  • 14

    您必须为结果启动图库意图 .

    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获取图像 .

  • 415

    这是一个经过测试的图像和视频代码 . 它适用于所有小于19且大于19的API .

    图片:

    if (Build.VERSION.SDK_INT <= 19) {
                            Intent i = new Intent();
                            i.setType("image/*");
                            i.setAction(Intent.ACTION_GET_CONTENT);
                            i.addCategory(Intent.CATEGORY_OPENABLE);
                            startActivityForResult(i, 10);
                        } else if (Build.VERSION.SDK_INT > 19) {
                            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                            startActivityForResult(intent, 10);
                        }
    

    视频:

    if (Build.VERSION.SDK_INT <= 19) {
                            Intent i = new Intent();
                            i.setType("video/*");
                            i.setAction(Intent.ACTION_GET_CONTENT);
                            i.addCategory(Intent.CATEGORY_OPENABLE);
                            startActivityForResult(i, 20);
                        } else if (Build.VERSION.SDK_INT > 19) {
                            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
                            startActivityForResult(intent, 20);
                        }
    

    .

    @Override
            public void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == Activity.RESULT_OK) {
    
                    if (requestCode == 10) {
                        Uri selectedImageUri = data.getData();
                        String selectedImagePath = getRealPathFromURI(selectedImageUri);
                    } else if (requestCode == 20) {
                        Uri selectedVideoUri = data.getData();
                        String selectedVideoPath = getRealPathFromURI(selectedVideoUri);
                    }
        }
    }
             public String getRealPathFromURI(Uri uri) {
                    if (uri == null) {
                        return null;
                    }
                    String[] projection = {MediaStore.Images.Media.DATA};
                    Cursor cursor = getActivity().getContentResolver().query(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();
                }
    
  • 8

    这样做是为了启动图库并允许用户选择图像:

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

    然后在 onActivityResult() 中使用返回的图像的URI来设置ImageView上的图像 .

  • 2
    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);
    }
    
    }
    
  • 87
    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();
    }
    
    }
    
  • 314

    由于某些原因,该线程中的所有答案都在 onActivityResult() 中尝试对收到的 Uri 进行后处理,就像获取图像的真实路径一样,然后使用 BitmapFactory.decodeFile(path) 来获取 Bitmap .

    这一步是不必要的 . ImageView 类有一个名为 setImageURI(uri) 的方法 . 把你的uri传递给它,你应该完成 .

    Uri imageUri = data.getData();
    imageView.setImageURI(imageUri);
    

    有关完整的工作示例,您可以在这里查看:http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

    PS:
    在要加载的图像太大而无法放入内存的情况下,将 Bitmap 放在单独的变量中是有意义的,并且需要按比例缩小操作来防止 OurOfMemoryError ,如@siamii答案中所示 .

  • 22

    调用chooseImage方法,如 -

    public void chooseImage(ImageView v)
    {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, SELECT_PHOTO);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
    
        if(imageReturnedIntent != null)
        {
            Uri selectedImage = imageReturnedIntent.getData();
        switch(requestCode) { 
        case SELECT_PHOTO:
            if(resultCode == RESULT_OK)
            {
                Bitmap datifoto = null;
                temp.setImageBitmap(null);
                Uri picUri = null;
                picUri = imageReturnedIntent.getData();//<- get Uri here from data intent
                 if(picUri !=null){
                   try {
                       datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(),                                 picUri);
                       temp.setImageBitmap(datifoto);
                   } catch (FileNotFoundException e) {
                      throw new RuntimeException(e);
                   } catch (IOException e) {
                      throw new RuntimeException(e);
                   } catch (OutOfMemoryError e) {
                    Toast.makeText(getBaseContext(), "Image is too large. choose other", Toast.LENGTH_LONG).show();
                }
    
            }
            }
            break;
    
    }
        }
        else
        {
            //Toast.makeText(getBaseContext(), "data null", Toast.LENGTH_SHORT).show();
        }
    }
    
  • 1
    #initialize in main activity 
        path = Environment.getExternalStorageDirectory()
                + "/images/make_machine_example.jpg"; #
         ImageView image=(ImageView)findViewById(R.id.image);
     //--------------------------------------------------||
    
     public void FromCamera(View) {
    
        Log.i("camera", "startCameraActivity()");
        File file = new File(path);
        Uri outputFileUri = Uri.fromFile(file);
        Intent intent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, 1);
    
    }
    
    public void FromCard() {
        Intent i = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, 2);
    }
    
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == 2 && resultCode == RESULT_OK
                && null != data) {
    
            Uri selectedImage = data.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 picturePath = cursor.getString(columnIndex);
            cursor.close();
    
            bitmap = BitmapFactory.decodeFile(picturePath);
            image.setImageBitmap(bitmap);
    
            if (bitmap != null) {
                ImageView rotate = (ImageView) findViewById(R.id.rotate);
    
            }
    
        } else {
    
            Log.i("SonaSys", "resultCode: " + resultCode);
            switch (resultCode) {
            case 0:
                Log.i("SonaSys", "User cancelled");
                break;
            case -1:
                onPhotoTaken();
                break;
    
            }
    
        }
    
    }
    
    protected void onPhotoTaken() {
        // Log message
        Log.i("SonaSys", "onPhotoTaken");
        taken = true;
        imgCapFlag = true;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4;
        bitmap = BitmapFactory.decodeFile(path, options);
        image.setImageBitmap(bitmap);
    
    
    }
    

相关问题