【问题标题】:Android IMAGE_CAPTURE returns RESULT_CANCELEDAndroid IMAGE_CAPTURE 返回 RESULT_CANCELED
【发布时间】:2016-02-12 07:57:18
【问题描述】:

我正在尝试使用MediaStore.ACTION_IMAGE_CAPTURE Intent 拍摄个人资料照片。

启动意图的代码:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File myPicture = new File(OfflineApp.getAppContext().getFilesDir() + "/" + getResources().getString(R.string.contact_photos_dir), getResources().getString(R.string.my_photo_file_name));
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(myPicture));
startActivityForResult(cameraIntent, REQUEST_CODE_TAKE_PHOTO);

还有 onActivityResult 部分:

case REQUEST_CODE_TAKE_PHOTO:
    if (resultCode == RESULT_OK) {
        String path = new File(OfflineApp.getAppContext().getFilesDir() + "/" + getResources().getString(R.string.contact_photos_dir), getResources().getString(R.string.my_photo_file_name)).getAbsolutePath();
        ContactManager.getInstance().updateMyImage(path);
    }
    break;

但是,结果代码总是RESULT_CANCELED,只有我提供MediaStore.EXTRA_OUTPUT,即使文件不存在。

【问题讨论】:

    标签: android android-intent android-camera mediastore


    【解决方案1】:

    好的。发现问题了。

    由于 Camera Intent 正在启动 Camera 应用程序,它无法访问我的应用程序文件夹。通过传递外部文件夹文件并将其复制到我的本地文件夹来修复它。

    干杯。

    【讨论】:

    • 您能与我们分享您的代码解决方案吗?它只是改变这一点: File myPicture = new File(OfflineApp.getAppContext().getFilesDir() + "/" + getResources().getString(R.string.contact_photos_dir), getResources().getString(R.string.我的照片文件名));谢谢
    【解决方案2】:

    您可以让相机应用程序将图像保存在这样的外部文件中,然后稍后使用那里的图像

    private void captureImage() {
        // You can pass an external file Uri to the intent to which the camera app can write
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // File file = new File(getCacheDir(), IMAGE_FILENAME); // this doesn't work as the camera app doesn't have permission to this apps cache dir
        // File file = new File("/sdcard/image.jpg"); // avoid hardcoding file names
        File file = new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAME);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
    
        // intent.setData(Uri.fromFile(file));
        // intent.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, REQUEST_CODE_CAPTURE_IMAGE);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE_CAPTURE_IMAGE){
                File file = new File(Environment.getExternalStorageDirectory(), IMAGE_FILENAME);
                Uri uri = Uri.fromFile(file);
                mImagePath = uri.getPath();
                String extension = MimeTypeMap.getFileExtensionFromUrl(mImagePath);
                if(extension != null){
                    mImageMIMEType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                } else {
                    mImageMIMEType = "image/jpg"; // fallback, also a best guess
                }
                // use image here
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

      改用这个文件:

          File storageDir =  context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
          try {
               File myPicture = File.createTempFile(String.valueOf(DateUtils.nowInMillis()), you_extension, storageDir);
          } catch (Exception e) {
               e.printStackTrace();
          }
      

      【讨论】:

        猜你喜欢
        • 2020-03-06
        • 2017-01-27
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 2019-08-03
        • 2016-05-18
        • 2018-08-07
        相关资源
        最近更新 更多