用于从图库或相机中选择图像的对话框

Ser*_*lov 111 android

是否有一种标准方式来调用对话框,选择从相机中选择图像还是从图库中获取(如内置电话簿或Skype)?

我已经看了这个,但代码打开了画廊,没有建议从相机中选择它.

设备:三星Galaxy Tab
Android:2.3.3

Sha*_*wal 178

下面的代码可用于拍摄和挑选照片以及选择照片或拍照.只需显示带有两个选项的对话框,并在选择时使用相应的代码.

从相机拍照:

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePicture, 0);//zero can be replaced with any action code (called requestCode)
Run Code Online (Sandbox Code Playgroud)

要从图库中选择照片:

Intent pickPhoto = new Intent(Intent.ACTION_PICK,
           android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(pickPhoto , 1);//one can be replaced with any action code
Run Code Online (Sandbox Code Playgroud)

onActivityResult 码:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    switch(requestCode) {
    case 0:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            imageview.setImageURI(selectedImage);
        }

    break; 
    case 1:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            imageview.setImageURI(selectedImage);
        }
    break;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在清单文件中添加此权限:

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

  • 使用ACTION_IMAGE_CAPTURE我收到imageReturnedIntent.getData()== null为什么? (20认同)
  • 不需要Camera权限,因为它会打开默认应用程序. (18认同)
  • 根据官方文档 https://developer.android.com/training/camera/photobasics 拍照不会将图像保存在从意图 getData() 返回的 Uri 中。您只能从结果意图中获取缩略图(intent.getBundle().get("data))。在调用 startActivityForResult 之前,可以将全尺寸图像写入为此目的准备的文件。 (3认同)
  • @Jeremy没错,不错.如果您根本没有权限,则可以使用它.因为打开相机不是你的应用程序.细微差别在于,如果您拥有该权限并且用户拒绝了该权限,那么使用此"Intent"作为后备将抛出SecurityException.更多信息:https://plus.google.com/+AndroidDevelopers/posts/e9kyM7VXajz (2认同)
  • 现在需要相机权限才能打开相机意图@tasomaniac (2认同)

Mar*_*sco 53

我已经合并了一些解决方案,以便从Gallery或Camera中选择一个完整的util.这些是ImagePicker util gist的功能(也在Github lib中):

  • 合并了Gallery和Camera resquests的意图.
  • 调整所选大图像的大小(例如:2500 x 1600)
  • 如果需要,旋转图像

截图:

ImagePicker开始意图

编辑:这是一个代码片段,用于将Gallery和Camera应用程序合并为Intent.你可以在ImagePicker util gist(也在Github lib中)看到完整的代码:

public static Intent getPickImageIntent(Context context) {
    Intent chooserIntent = null;

    List<Intent> intentList = new ArrayList<>();

    Intent pickIntent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra("return-data", true);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(context)));
    intentList = addIntentsToList(context, intentList, pickIntent);
    intentList = addIntentsToList(context, intentList, takePhotoIntent);

    if (intentList.size() > 0) {
        chooserIntent = Intent.createChooser(intentList.remove(intentList.size() - 1),
                context.getString(R.string.pick_image_intent_text));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentList.toArray(new Parcelable[]{}));
    }

    return chooserIntent;
}

private static List<Intent> addIntentsToList(Context context, List<Intent> list, Intent intent) {
    List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(intent, 0);
    for (ResolveInfo resolveInfo : resInfo) {
        String packageName = resolveInfo.activityInfo.packageName;
        Intent targetedIntent = new Intent(intent);
        targetedIntent.setPackage(packageName);
        list.add(targetedIntent);
    }
    return list;
}
Run Code Online (Sandbox Code Playgroud)

  • 它很完美,马里奥.非常感谢!我在三星GT-I9100,一台LG L7上进行了测试,但是当我们尝试将相机中的图像放入带有Android 6的Nexus 6中时,它会失败.解决方案是将它添加到ImagePicker.java中的58行: boolean isCamera =(imageReturnedIntent == null || imageReturnedIntent.getData()== null);` (3认同)

Van*_*Jr. 19

这个库使它变得简单.

只需致电:

PickImageDialog.on(MainActivity.this, new PickSetup(BuildConfig.APPLICATION_ID));
Run Code Online (Sandbox Code Playgroud)

然后让您的Activity实现IPickResult并覆盖以下方法.

@Override
public void onPickResult(PickResult r) {
    if (r.getError() == null) {
        imageView.setImageBitmap(r.getBitmap());

        //or

        imageView.setImageURI(r.getUri());
    } else {
        //Handle possible errors
        //TODO: do what you have to do with r.getError();
    }
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*hil 10

您可以实现此代码以从库或相机中选择图像: -

private ImageView imageview;
private Button btnSelectImage;
private Bitmap bitmap;
private File destination = null;
private InputStream inputStreamImg;
private String imgPath = null;
private final int PICK_IMAGE_CAMERA = 1, PICK_IMAGE_GALLERY = 2;
Run Code Online (Sandbox Code Playgroud)

现在,在按钮单击事件上,您可以调用选择图像的方法.这是内部活动的onCreate.

imageview = (ImageView) findViewById(R.id.imageview);
btnSelectImage = (Button) findViewById(R.id.btnSelectImage);

//OnbtnSelectImage click event...
btnSelectImage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectImage();
        }
    });
Run Code Online (Sandbox Code Playgroud)

在你的活动之外的oncreate.

// Select image from camera and gallery
private void selectImage() {
    try {
        PackageManager pm = getPackageManager();
        int hasPerm = pm.checkPermission(Manifest.permission.CAMERA, getPackageName());
        if (hasPerm == PackageManager.PERMISSION_GRANTED) {
            final CharSequence[] options = {"Take Photo", "Choose From Gallery","Cancel"};
            android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(activity);
            builder.setTitle("Select Option");
            builder.setItems(options, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int item) {
                    if (options[item].equals("Take Photo")) {
                        dialog.dismiss();
                        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(intent, PICK_IMAGE_CAMERA);
                    } else if (options[item].equals("Choose From Gallery")) {
                        dialog.dismiss();
                        Intent pickPhoto = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(pickPhoto, PICK_IMAGE_GALLERY);
                    } else if (options[item].equals("Cancel")) {
                        dialog.dismiss();
                    }
                }
            });
            builder.show();
        } else
            Toast.makeText(this, "Camera Permission error", Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        Toast.makeText(this, "Camera Permission error", Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    inputStreamImg = null;
    if (requestCode == PICK_IMAGE_CAMERA) {
        try {
            Uri selectedImage = data.getData();
            bitmap = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bytes);

            Log.e("Activity", "Pick from Camera::>>> ");

            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
            destination = new File(Environment.getExternalStorageDirectory() + "/" +
                    getString(R.string.app_name), "IMG_" + timeStamp + ".jpg");
            FileOutputStream fo;
            try {
                destination.createNewFile();
                fo = new FileOutputStream(destination);
                fo.write(bytes.toByteArray());
                fo.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            imgPath = destination.getAbsolutePath();
            imageview.setImageBitmap(bitmap);

        } catch (Exception e) {
            e.printStackTrace();
        }
    } else if (requestCode == PICK_IMAGE_GALLERY) {
        Uri selectedImage = data.getData();
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 50, bytes);
            Log.e("Activity", "Pick from Gallery::>>> ");

            imgPath = getRealPathFromURI(selectedImage);
            destination = new File(imgPath.toString());
            imageview.setImageBitmap(bitmap);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public String getRealPathFromURI(Uri contentUri) {
    String[] proj = {MediaStore.Audio.Media.DATA};
    Cursor cursor = managedQuery(contentUri, proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}
Run Code Online (Sandbox Code Playgroud)

最后,最后添加摄像头并将外部存储权限写入AndroidManifest.xml

它对我很有用,希望它也适合你.


Igo*_*pov 7

我认为由你来决定选择对话框.对于画廊,你会使用这些代码,并相机试试这个.