2015-09-01 82 views
2

我打電話通過startActivityForResult我的相機android.provider.MediaStore.ACTION_IMAGE_CAPTUREandroid.provider.MediaStore.EXTRA_OUTPUT想要得到的全尺寸拍攝的圖像回到我的onActivityResultACTION_IMAGE_CAPTURE與EXTRA_OUTPUT將創建處理「處理媒體存儲錯誤」

但當下我點擊勾選後拍攝照片時,應該將照片傳回,我收到一條錯誤消息,該照片鬆散地轉換爲「相機錯誤 - 保存圖像或剪輯時出現問題」 - 我可以關閉對話框或將反饋發送給Google開發團隊。在這一刻

logcat的輸出是:

09-01 22:01:46.157 24523-24523/com.google.android.GoogleCamera E/CAM_FatalErrorHandler﹕ Handling Media Storage Failure: 
java.lang.Exception 
     at com.android.camera.FatalErrorHandlerImpl.onMediaStorageFailure(FatalErrorHandlerImpl.java:37) 
     at com.android.camera.PhotoModule.onError(PhotoModule.java:274) 
     at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1289) 
     at com.android.camera.PhotoModule$8.onClick(PhotoModule.java:593) 
     at android.view.View.performClick(View.java:4781) 
     at android.view.View$PerformClick.run(View.java:19873) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5289) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
     at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
09-01 22:01:46.158 24523-24523/com.google.android.GoogleCamera E/CAM_CameraUtil﹕ Show fatal error dialog 

我的代碼(清潔無關部分):

private File tmpFile; 
private Uri tmpFileURI; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 

    // TempFile needs to be created for the camera to store the fullsize captured image 
    // tmpFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + MainActivity.APP_BASE_FOLDER + "/tmp.jpg"); 
    try 
    { 
     tmpFile = File.createTempFile("my_app", ".jpg"); 
    } catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    tmpFileURI = Uri.fromFile(tmpFile); 

    chooseCamera.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 

      takePicture = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      takePicture.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, tmpFileURI); 
      startActivityForResult(takePicture, CreateModifiyEventFragment.CHOOSE_BY_CAMERA);//zero can be replaced with any action code 

     } 
    }); 


    chooseLibrary.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 

      pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(pickPhoto, CreateModifiyEventFragment.CHOOSE_BY_LIBRARY);//one can be replaced with any action code 

     } 
    }); 

} 

的看到常量聲明如下:

public final static int CHOOSE_BY_CAMERA = 1; 
public final static int CHOOSE_BY_LIBRARY = 0; 

的回調代碼是永遠不會到達的,所以我只是想讓你更多的代碼。 你可以看到我通過tmpFile和一個正常的外部存儲文件來試用它。

權限也

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

設置我不知道是什麼原因引發此錯誤或什麼,我錯過了。我用其他的答案來創建這個代碼,我沒有看到任何區別。

任何幫助將不勝感激。先謝謝了!

回答

4

File.createTempFile()不太可能在Android上給你一些有用的東西。更重要的是,你無法知道第三方相機應用程序是否可以在那裏寫入。選擇外部存儲位置(例如,getExternalFilesDir()Environment.getExternalStoragePublicDirectory()):

package com.commonsware.android.camcon; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import java.io.File; 

public class CameraContentDemoActivity extends Activity { 
    private static final int CONTENT_REQUEST=1337; 
    private File output=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    File dir= 
     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 

    output=new File(dir, "CameraContentDemo.jpeg"); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(output)); 

    startActivityForResult(i, CONTENT_REQUEST); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 

     i.setDataAndType(Uri.fromFile(output), "image/jpeg"); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
} 

而且,你不需要CAMERA許可,因爲你不拍照—你問一個第三方應用程序來拍照。

+0

我嘗試過'// tmpFile = new File(Environment.getExternalStorageDirectory()。getAbsolutePath()+ MainActivity.APP_BASE_FOLDER +「/tmp.jpg」);'正如你所看到的,同樣的錯誤。但'Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)似乎可以解決這個錯誤。你能告訴我爲什麼嗎?攝像機不能寫入第一個位置嗎? – LilaQ

+1

@LilaQ:永遠不要使用字符串連接來創建文件路徑。使用適當的'File'構造函數。我的猜測是,你在那裏得到了一個無效的路徑(例如,雙'/',缺少'/')。 – CommonsWare

+0

我註銷了路徑以確保它是有效的。或者是在我的應用程序之外考慮攝像頭,因此沒有對externalStorageDirectory的寫權限? – LilaQ