意图在Android相机或画廊之间进行select

我试图启动一个意图,从相机或Android的画廊select一个图像。 我检查了这个post,目前我的代码是接近工作:

private Intent getPickIntent() { final List<Intent> intents = new ArrayList<Intent>(); if (allowCamera) { setCameraIntents(intents, cameraOutputUri); } if (allowGallery) { intents.add(new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)); } if (intents.isEmpty()) return null; Intent result = Intent.createChooser(intents.remove(0), null); if (!intents.isEmpty()) { result.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents.toArray(new Parcelable[] {})); } return result; } private void setCameraIntents(List<Intent> cameraIntents, Uri output) { final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); final PackageManager packageManager = context.getPackageManager(); final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); for (ResolveInfo res : listCam) { final String packageName = res.activityInfo.packageName; final Intent intent = new Intent(captureIntent); intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); intent.setPackage(packageName); intent.putExtra(MediaStore.EXTRA_OUTPUT, output); cameraIntents.add(intent); } } 

当我设置allowCamera = true时,它工作正常。

当我设置allowGallery = true时,它显示下面的select器:

在这里输入图像说明

但是,如果我设置allowCamera = true,allowGallery = true,则显示的select器是:

在这里输入图像说明

如果您selectAndroid System则会显示第一个select器。

我想select器是这样的:

在这里输入图像说明

如何“扩展” Android System选项?

Solutions Collecting From Web of "意图在Android相机或画廊之间进行select"

在你的链接后,你可以find解决scheme。 与您的代码不同的是画廊意图是如何创build的:

 final Intent galleryIntent = new Intent(); galleryIntent.setType("image/*"); galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

不是用ACTION_PICK而是用ACTION_GET_CONTENT 。 看起来,如果单个ACTION_PICK在列表中(“容器意图”),则系统遍历它以显示该select的内容,但是一旦包括相机意图,它就不能再遍历了(因为有一个直接意图和一个容器意图)。

在这个答案的评论你find了ACTION_PICKACTION_GET_CONTENT之间的区别。

有一些build议使用自定义对话框的解决scheme。 但是这个对话框不会有标准图标(见这里的发展文档)。 所以我build议留在你的解决scheme,只是解决hierarchie问题。

 ## Intent to choose between Camera and Gallery Heading and can crop image after capturing from camera ## public void captureImageCameraOrGallery() { final CharSequence[] options = { "Take photo", "Choose from library", "Cancel" }; AlertDialog.Builder builder = new AlertDialog.Builder( Post_activity.this); builder.setTitle("Select"); builder.setItems(options, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub if (options[which].equals("Take photo")) { try { Intent cameraIntent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, TAKE_PICTURE); } catch (ActivityNotFoundException ex) { String errorMessage = "Whoops - your device doesn't support capturing images!"; } } else if (options[which].equals("Choose from library")) { Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, ACTIVITY_SELECT_IMAGE); } else if (options[which].equals("Cancel")) { dialog.dismiss(); } } }); dialog = builder.create(); dialog.getWindow().getAttributes().windowAnimations = R.style.dialog_animation; dialog.show(); } public void onActivityResult(int requestcode, int resultcode, Intent intent) { super.onActivityResult(requestcode, resultcode, intent); if (resultcode == RESULT_OK) { if (requestcode == TAKE_PICTURE) { picUri = intent.getData(); startCropImage(); } else if (requestcode == PIC_CROP) { Bitmap photo = (Bitmap) intent.getExtras().get("data"); Drawable drawable = new BitmapDrawable(photo); backGroundImageLinearLayout.setBackgroundDrawable(drawable); } else if (requestcode == ACTIVITY_SELECT_IMAGE) { Uri selectedImage = intent.getData(); String[] filePath = { MediaStore.Images.Media.DATA }; Cursor c = getContentResolver().query(selectedImage, filePath, null, null, null); c.moveToFirst(); int columnIndex = c.getColumnIndex(filePath[0]); String picturePath = c.getString(columnIndex); c.close(); Bitmap thumbnail = (BitmapFactory.decodeFile(picturePath)); Drawable drawable = new BitmapDrawable(thumbnail); backGroundImageLinearLayout.setBackgroundDrawable(drawable); } } } private void startCropImage() { try { Intent cropIntent = new Intent("com.android.camera.action.CROP"); cropIntent.setDataAndType(picUri, "image/*"); cropIntent.putExtra("crop", "true"); cropIntent.putExtra("aspectX", 1); cropIntent.putExtra("aspectY", 1); // indicate output X and Y cropIntent.putExtra("outputX", 256); cropIntent.putExtra("outputY", 256); // retrieve data on return cropIntent.putExtra("return-data", true); // start the activity - we handle returning in onActivityResult startActivityForResult(cropIntent, PIC_CROP); } catch (ActivityNotFoundException anfe) { // display an error message String errorMessage = "Whoops - your device doesn't support the crop action!"; Toast toast = Toast .makeText(this, errorMessage, Toast.LENGTH_SHORT); toast.show(); } } 
  Intent galleryintent = new Intent(Intent.ACTION_GET_CONTENT, null); galleryintent.setType("image/*"); Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); Intent chooser = new Intent(Intent.ACTION_CHOOSER); chooser.putExtra(Intent.EXTRA_INTENT, galleryintent); chooser.putExtra(Intent.EXTRA_TITLE, "Select from:"); Intent[] intentArray = { cameraIntent }; chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); startActivityForResult(chooser, REQUEST_PIC); 

您可能需要为此创build一个自定义对话框:

这是用户点击某个button时要调用的方法的代码:

 private void ChooseGallerOrCamera() { final CharSequence[] items = { "Take Photo", "Choose from Gallery", "Cancel" }; AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); 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); File f = new File(android.os.Environment .getExternalStorageDirectory(), "MyImage.jpg"); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); startActivityForResult(intent, REQUEST_CAMERA); } else if (items[item].equals("Choose from Gallery")) { Intent intent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); startActivityForResult( Intent.createChooser(intent, "Select File"), SELECT_FILE); } else if (items[item].equals("Cancel")) { dialog.dismiss(); } } }); builder.show(); } 

和处理onActivityResult()的代码:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { Bitmap mBitmap; if (requestCode == REQUEST_CAMERA) { File camFile = new File(Environment.getExternalStorageDirectory() .toString()); for (File temp : camFile.listFiles()) { if (temp.getName().equals("MyImage.jpg")) { camFile = temp; break; } } try { BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); mBitmap = BitmapFactory.decodeFile(camFile.getAbsolutePath(), btmapOptions); //Here you have the bitmap of the image from camera } catch (Exception e) { e.printStackTrace(); } } else if (requestCode == SELECT_FILE) { Uri selectedImageUri = data.getData(); String tempPath = getPath(selectedImageUri, MyActivity.this); BitmapFactory.Options btmapOptions = new BitmapFactory.Options(); mBitmap = BitmapFactory.decodeFile(tempPath, btmapOptions); //Here you have the bitmap of the image from gallery } } } public String getPath(Uri uri, Activity activity) { String[] projection = { MediaColumns.DATA }; Cursor cursor = activity .managedQuery(uri, projection, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } 

编辑:尝试使用这个:

 private void letUserTakeUserTakePicture() { Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(getTempFile(getActivity()))); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra (Intent.EXTRA_INITIAL_INTENTS, new Intent[]{takePhotoIntent}); startActivityForResult(chooserIntent, Values.REQ_CODE_TAKEPICTURE); }