对话框从图库或相机中select图像

有没有一个标准的方式来调用对话框,select从相机中select一个图像或从画廊(如在内置的电话簿或Skype)?

我已经看了这个,但代码打开画廊没有build议从相机中select它。

设备:Samsung Galaxy Tab
Android:2.3.3

下面的代码可以用于拍照和挑选照片以及挑选照片或拍照。 只需显示一个对话框,并select两个选项,使用适当的代码。

从相机拍照:

Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(takePicture, 0);//zero can be replaced with any action code 

从图库中select照片:

 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 

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; } } 

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

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

我已经合并了一些解决scheme,以便从Gallery或Camera中选取一个图像。 这些是ImagePicker utilist的特性(也在Github lib中 ):

  • 合并意图图库和相机resquests。
  • 调整选定的大图像(例如:2500 x 1600)
  • 如果需要旋转图像

截图:

ImagePicker开始的意图

编辑 :这是一个代码片段,以获得一个合并的图库和相机应用程序的意图在一起。 您可以在ImagePicker utilist (也在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; } 

我认为这是由你来显示该对话框的select。 对于图库,您将使用该代码,对于相机,请尝试此操作 。

这个库使得它很简单。

请致电:

 PickImageDialog.on(MainActivity.this, new PickSetup(BuildConfig.APPLICATION_ID)); 

然后让你的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(); } } 

你可以实现这个代码从图库或相机中select图像:

 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; 

现在在button点击事件,你可以打电话给你select图像的方法。 这是在活动的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(); } }); 

在您的活动之外创build。

 // 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); } 

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

它对我很有用,希望它也适用于你。

如果你想从图库中获取图像或捕获图像,并将其设置为肖像模式的imageview,那么下面的代码将帮助你..

在onCreate()

 imageViewRound.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { selectImage(); } }); private void selectImage() { Constants.iscamera = true; final CharSequence[] items = { "Take Photo", "Choose from Library", "Cancel" }; TextView title = new TextView(context); title.setText("Add Photo!"); title.setBackgroundColor(Color.BLACK); title.setPadding(10, 15, 15, 10); title.setGravity(Gravity.CENTER); title.setTextColor(Color.WHITE); title.setTextSize(22); AlertDialog.Builder builder = new AlertDialog.Builder( AddContactActivity.this); builder.setCustomTitle(title); // builder.setTitle("Add Photo!"); builder.setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { if (items[item].equals("Take Photo")) { // Intent intent = new // Intent(MediaStore.ACTION_IMAGE_CAPTURE); Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); /* * File photo = new * File(Environment.getExternalStorageDirectory(), * "Pic.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, * Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); */ // startActivityForResult(intent,TAKE_PICTURE); Intent intents = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); intents.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // start the image capture Intent startActivityForResult(intents, TAKE_PICTURE); } else if (items[item].equals("Choose from Library")) { Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult( Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); } else if (items[item].equals("Cancel")) { dialog.dismiss(); } } }); builder.show(); } @SuppressLint("NewApi") @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case SELECT_PICTURE: Bitmap bitmap = null; if (resultCode == RESULT_OK) { if (data != null) { try { Uri selectedImage = data.getData(); String[] filePath = { MediaStore.Images.Media.DATA }; Cursor c = context.getContentResolver().query( selectedImage, filePath, null, null, null); c.moveToFirst(); int columnIndex = c.getColumnIndex(filePath[0]); String picturePath = c.getString(columnIndex); c.close(); imageViewRound.setVisibility(View.VISIBLE); // Bitmap thumbnail = // (BitmapFactory.decodeFile(picturePath)); Bitmap thumbnail = decodeSampledBitmapFromResource( picturePath, 500, 500); // rotated Bitmap thumbnail_r = imageOreintationValidator( thumbnail, picturePath); imageViewRound.setBackground(null); imageViewRound.setImageBitmap(thumbnail_r); IsImageSet = true; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } break; case TAKE_PICTURE: if (resultCode == RESULT_OK) { previewCapturedImage(); } break; } } @SuppressLint("NewApi") private void previewCapturedImage() { try { // hide video preview imageViewRound.setVisibility(View.VISIBLE); // bimatp factory BitmapFactory.Options options = new BitmapFactory.Options(); // downsizing image as it throws OutOfMemory Exception for larger // images options.inSampleSize = 8; final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), options); Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 500, 500, false); // rotated Bitmap thumbnail_r = imageOreintationValidator(resizedBitmap, fileUri.getPath()); imageViewRound.setBackground(null); imageViewRound.setImageBitmap(thumbnail_r); IsImageSet = true; Toast.makeText(getApplicationContext(), "done", Toast.LENGTH_LONG) .show(); } catch (NullPointerException e) { e.printStackTrace(); } } // for roted image...... private Bitmap imageOreintationValidator(Bitmap bitmap, String path) { ExifInterface ei; try { ei = new ExifInterface(path); int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: bitmap = rotateImage(bitmap, 90); break; case ExifInterface.ORIENTATION_ROTATE_180: bitmap = rotateImage(bitmap, 180); break; case ExifInterface.ORIENTATION_ROTATE_270: bitmap = rotateImage(bitmap, 270); break; } } catch (IOException e) { e.printStackTrace(); } return bitmap; } private Bitmap rotateImage(Bitmap source, float angle) { Bitmap bitmap = null; Matrix matrix = new Matrix(); matrix.postRotate(angle); try { bitmap = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); } catch (OutOfMemoryError err) { source.recycle(); Date d = new Date(); CharSequence s = DateFormat .format("MM-dd-yy-hh-mm-ss", d.getTime()); String fullPath = Environment.getExternalStorageDirectory() + "/RYB_pic/" + s.toString() + ".jpg"; if ((fullPath != null) && (new File(fullPath).exists())) { new File(fullPath).delete(); } bitmap = null; err.printStackTrace(); } return bitmap; } public static Bitmap decodeSampledBitmapFromResource(String pathToFile, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(pathToFile, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); Log.e("inSampleSize", "inSampleSize______________in storage" + options.inSampleSize); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFile(pathToFile, options); } public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { // Calculate ratios of height and width to requested height and // width final int heightRatio = Math.round((float) height / (float) reqHeight); final int widthRatio = Math.round((float) width / (float) reqWidth); // Choose the smallest ratio as inSampleSize value, this will // guarantee // a final image with both dimensions larger than or equal to the // requested height and width. inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; } return inSampleSize; } public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = managedQuery(uri, projection, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } private static File getOutputMediaFile(int type) { // External sdcard location File mediaStorageDir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), IMAGE_DIRECTORY_NAME); // Create the storage directory if it does not exist if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " + IMAGE_DIRECTORY_NAME + " directory"); return null; } } // Create a media file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); File mediaFile; if (type == MEDIA_TYPE_IMAGE) { mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); } else { return null; } return mediaFile; } public Uri getOutputMediaFileUri(int type) { return Uri.fromFile(getOutputMediaFile(type)); } 

希望这会帮助你…. !!!