2016-02-08 76 views
3

我想用我的相机拍照。我只需要他们时间,所以我下面的:相机结果始终返回RESULT_CANCELED

private void takePicture() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (intent.resolveActivity(this.getActivity().getPackageManager()) != null) { 
     try { 
      this.imageFile = File.createTempFile("CROP_SHOT", ".jpg", this.getActivity().getCacheDir()); 

      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.imageFile)); 
      intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 

      this.startActivityForResult(intent, Globals.REQUEST_TAKE_PHOTO); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

不幸的是,结果代码RESULT_CANCELEDonActivityResult

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.v("PictureEdit", "onActivityResult"); 

    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == Activity.RESULT_OK) { 
     if(requestCode == Globals.REQUEST_TAKE_PHOTO) { 
      Log.v("PictureEdit", "onActivityResult take photo"); 

      this.startCropImage(Uri.fromFile(this.imageFile)); 
     } else if (requestCode == Globals.REQUEST_PICK_PHOTO) { 
      Log.v("PictureEdit", "onActivityResult pick photo"); 

      this.startCropImage(data.getData()); 
     } else if (requestCode == Globals.REQUEST_CROP_PHOTO) { 
      Log.v("PictureEdit", "onActivityResult crop photo"); 

      this.imageEncoded = data.getStringExtra(Globals.KEY_IMAGE_ENCODED); 

      this.imageView.setImageBitmap(Images.decodeImage(imageEncoded)); 
      this.buttonSave.setEnabled(true); 
     } else { 
      Log.v("PictureEdit", "onActivityResult requestCode: " + requestCode + ", result: " + resultCode); 
     } 
    } else { 
     Log.v("PictureEdit", "onActivityResult resultCode is not ok: " + resultCode); 
    } 
} 

每一个解决方案,我发现到目前为止的计算器,并在网上并没有解决我的问题。我用的是缓存目录创建一个临时文件:

File.createTempFile("CROP_SHOT", ".jpg", this.getActivity().getCacheDir()); 

,我有正确的权限:

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

采摘从我的智能手机的图像始终正常工作:

private void pickPicture() { 
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

    this.startActivityForResult(intent, Globals.REQUEST_PICK_PHOTO); 
} 

那么,为什么相机是否总是返回RESULT_CANCELED

它出现在搭载Android 6.0的Nexus 4和搭载Android 4.2的三星Galaxy S III上。

回答

10

我使用缓存目录创建一个临时文件:

首先,第三方相机应用无权对internal storage与您的应用程序的私有缓存目录工作。

其次,你不应该创建该文件。相机应用程序应该创建该文件。某些相机应用程序可能会感到困惑,并拒绝覆盖您的文件。

因此,创建一个指向external storage(例如getExternalCacheDir())位置的File对象,但不要创建该文件。使用该File对象作为您的EXTRA_OUTPUT值的基础。

另请注意,MediaStore.EXTRA_VIDEO_QUALITY用于录制视频;它对ACTION_IMAGE_CAPTURE没有意义。

+0

很大。 thx为这里所有的知识。 – Mulgard

+0

同意不应创建新文件。不知道为什么谷歌培训文档创建一个临时文件,然后创建相机应用程序将通过FileProvider使用的URI。 https://developer.android.com/training/camera/photobasics.html#TaskCaptureIntent – vman

+0

只是简单地实例化一个文件指向外部缓存目录没有帮助。当我们点击使用图片时,凸轮不响应。 – Debdeep

0

更好的解决方案是使用FileProvider。所以,你的应用程序不需要写入到外部存储任何许可,您的应用程序可以授予相机的写权限的

许可启动相机使用的应用程序文件夹:

Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
camera.putExtra(MediaStore.EXTRA_OUTPUT, getPhotoFile(context)); 
camera.addFlags(FLAG_GRANT_READ_URI_PERMISSION); 
camera.addFlags(FLAG_GRANT_WRITE_URI_PERMISSION); 

public static Uri getPhotoFile(Context context) { 
    File file = new File(context.getExternalCacheDir(), "camera.jpg"); 
    return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider.files", file); 
} 
相关问题