2016-02-08 75 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); 
} 
相關問題