具有多个选项的 Android 意图,即从图库中选择图像并使用前置摄像头捕获图像

Posted

技术标签:

【中文标题】具有多个选项的 Android 意图,即从图库中选择图像并使用前置摄像头捕获图像【英文标题】:Android intent with multiple option i.e , Pick image from gallary and capture image using front camera 【发布时间】:2015-04-09 07:56:28 【问题描述】:

选择/捕获图像后,我需要裁剪图像。

我已经完成了这个。但问题是当我切换到 android 最新版本(kitkat)时,裁剪意图无法正常工作。

我的代码

    private void picPhoto() 
    Intent pickIntent = new Intent();
    if (Build.VERSION.SDK_INT < 19) 
        pickIntent.setType("image/jpeg");
        pickIntent.setAction(Intent.ACTION_GET_CONTENT);
        pickIntent.putExtra("crop", "true");
     else 
        pickIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        pickIntent.addCategory(Intent.CATEGORY_OPENABLE);
        pickIntent.setType("image/jpeg");
        pickIntent.putExtra("crop", "true");
    
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, getFileDirectory());
    takePhotoIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);

    String pickTitle = "Select or take a new Picture";
    Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle);

    chooserIntent.putExtra
            (
                    Intent.EXTRA_INITIAL_INTENTS,
                    new Intent[]takePhotoIntent
            );

    startActivityForResult(chooserIntent, PICK_IMAGE);

谁能帮我举个例子吗?

【问题讨论】:

【参考方案1】:

我用这种方法裁剪了一张也在 kitkat 中工作的图片

@Override
    public void onActivityResult(int requestCode, int resultCode,
            final Intent data) 
 if (resultCode == Activity.RESULT_OK&&requestCode==1)   

                     performCrop(image_uri);



    private void performCrop(Uri picUri) 

        thePic = null;

        // take care of exceptions
        try 
            // call the standard crop action intent (the user device may not
            // support it)

            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            // indicate image type and Uri
            cropIntent.setDataAndType(picUri, "image/*");
            // set crop properties
            cropIntent.putExtra("crop", "true");
            // // indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 2);
            cropIntent.putExtra("aspectY", 1);
            // // // indicate output X and Y

            // retrieve data on return
            cropIntent.putExtra("return-data", true);
            // start the activity - we handle returning in onActivityResult
            startActivityForResult(cropIntent, 3);
        
        // respond to users whose devices do not support the crop action
        catch (ActivityNotFoundException anfe) 
            Toast toast = Toast.makeText(getActivity(),
                    "This device doesn't support the crop action!",
                    Toast.LENGTH_SHORT);
            toast.show();
         catch (OutOfMemoryError e) 
            System.out.println("out of memoryyy");
         catch (Exception e) 

            Display display = getActivity().getWindowManager()
                    .getDefaultDisplay();
            Point size = new Point();
            display.getSize(size);
            int width = size.x;
            int height = size.y;
            Intent cropIntent = new Intent("com.android.camera.action.CROP");
            // indicate image type and Uri
            cropIntent.setDataAndType(picUri, "image/*");
            // set crop properties
            cropIntent.putExtra("crop", "true");
            // // indicate aspect of desired crop
            cropIntent.putExtra("aspectX", 2);
            cropIntent.putExtra("aspectY", 1);
            // // indicate output X and Y
            cropIntent.putExtra("outputX", width);
            cropIntent.putExtra("outputY", 200);
            // retrieve data on return
            cropIntent.putExtra("return-data", true);
            // start the activity - we handle returning in onActivityResult
            startActivityForResult(cropIntent, 3);
        

    

【讨论】:

我认为这应该写在 OnActivityResult 中。我们不能像我上面的代码一样设置裁剪和画廊意图吗?感谢您的支持:) Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, 1);检查我的活动结果编辑 Karthika :) 我的意思是这个代码只有在调用画廊/相机意图后才能使用。我不想通过从 onactivty 结果调用来这样做。我的问题是我们可以像这样设置 Intent pickIntent =新意图(); pickIntent.setType("图片/jpeg"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); pickIntent.putExtra("crop", "true"); @AnoopM 当我使用它时,我从我的画廊中获得了一个包含图像的布局,然后单击其中一个图像,设备的cropimage 窗口将打开你想要除此之外的功能吗?跨度> 在查找功能而不是编码方式时很好..我似乎最好使用外部库来摆脱应用程序崩溃..谢谢你的时间:)【参考方案2】:

就是这样..

   private void picPhoto() 
    Intent pickIntent = new Intent();
    if (Build.VERSION.SDK_INT < 19) 
        pickIntent.setType("image/jpeg");
        pickIntent.setAction(Intent.ACTION_GET_CONTENT);
     else 
        pickIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        pickIntent.addCategory(Intent.CATEGORY_OPENABLE);
        pickIntent.setType("image/jpeg");
    
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, getFileDirectory());
    takePhotoIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);

    String pickTitle = "Select or take a new Picture";
    Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle);

    chooserIntent.putExtra
            (
                    Intent.EXTRA_INITIAL_INTENTS,
                    new Intent[]takePhotoIntent
            );

    startActivityForResult(chooserIntent, PICK_IMAGE);

所有功能都适用于 Api >14 即 Android 4.0 (ICE_CREAM_SANDWICH)。

    @TargetApi(Build.VERSION_CODES.KITKAT)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 

    if (resultCode == Activity.RESULT_OK) 
        if (requestCode == PICK_IMAGE && data != null && data.getData() != null) 
            Uri _uri = data.getData();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
                String wholeID = DocumentsContract.getDocumentId(_uri);
                // Split at colon, use second item in the array
                String id = wholeID.split(":")[1];
                String[] column = MediaStore.Images.Media.DATA;
                // where id is equal to
                String sel = MediaStore.Images.Media._ID + "=?";
                Cursor cursor = getActivity().getContentResolver().
                        query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                                column, sel, new String[]id, null);

                String filePath = "";
                int columnIndex = cursor.getColumnIndex(column[0]);
                if (cursor.moveToFirst()) 
                    filePath = cursor.getString(columnIndex);
                
                cursor.close();
                croppedPath = filePath;
             else 
                //User had pick an image.
                Cursor cursor = getActivity().getContentResolver().query(_uri, new String[]android.provider.MediaStore.Images.ImageColumns.DATA, null, null, null);
                cursor.moveToFirst();
                //Link to the image
                final String imageFilePath = cursor.getString(0);
                croppedPath = imageFilePath;
                cursor.close();
            
            if (croppedPath != null) 
                cropIntent(croppedPath, 5);
            
         else if (requestCode != 4 && requestCode == PICK_IMAGE && data == null) 
            cropIntent(getFileDirectory().getPath(), 4);
         else if (requestCode == 4) 
            editPhoto1.setImageBitmap(null);
            if (bmp != null) 
                bmp.recycle();
            
            setImagePicked(getFileDirectory().getPath(), 0);
         else if (requestCode == 5) 
            if (croppedPath != null) 
                editPhoto1.setImageBitmap(null);
                if (bmp != null) 
                    bmp.recycle();
                
                setImagePicked(getFileDirectory().getPath(), 0);
                croppedPath = null;
            
        
    


    super.onActivityResult(requestCode, resultCode, data);

裁剪方法

 private void cropIntent(String fileToCrop, int requestCode) 
    Uri filePath = Uri.fromFile(new File(fileToCrop));
    Intent cropIntent = new Intent("com.android.camera.action.CROP");
    //indicate image type and Uri
    cropIntent.setDataAndType(filePath, "image/*");
    cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, getFileDirectory());
    //set crop properties
    cropIntent.putExtra("crop", "true");
    //indicate aspect of desired crop
    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);
    startActivityForResult(cropIntent, requestCode);
    //start the activity - we handle returning in onActivityResult

【讨论】:

以上是关于具有多个选项的 Android 意图,即从图库中选择图像并使用前置摄像头捕获图像的主要内容,如果未能解决你的问题,请参考以下文章

从android中的意图选择器中选择选项(相机或画廊)后请求权限

如何在 Android 7.0 中从相机或图库中选择要裁剪的图像?

android 的默认图库和相机意图是不是适用于所有设备?

Android 应用程序在辅助 ACTION_PICK 意图后没有响应

Android:多个意图服务或一个具有多个意图的意图服务?

如何在 Android 11 中创建从图库中选择图像的意图?