2016-02-24 69 views
0

我試圖實現這個概念,通過前置攝像頭捕捉圖像。所以,我按照下面的網站http://www.vogella.com/tutorials/AndroidCamera/article.html的步驟,但我遇到的問題,同時點擊按鈕。你能幫我一下嗎?Android Front Camera無法打開

ImagePickActivity

public class ImagePickActivity extends Activity { 

    private Camera camera; 
    private int cameraId = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_pick); 

     if (!getPackageManager() 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
       Toast.makeText(this, "No camera on this device", Toast.LENGTH_LONG) 
        .show(); 
      } else { 
       cameraId = findFrontFacingCamera(); 
       if (cameraId < 0) { 
       Toast.makeText(this, "No front facing camera found.", 
        Toast.LENGTH_LONG).show(); 
       } else { 
       camera = Camera.open(cameraId); 
       } 
      } 
    } 

    public void onClick(View view) { 
      camera.takePicture(null, null, 
       new PhotoHandler(getApplicationContext())); 
      } 

     private int findFrontFacingCamera() { 
      int cameraId = -1; 
      // Search for the front facing camera 
      int numberOfCameras = Camera.getNumberOfCameras(); 
      for (int i = 0; i < numberOfCameras; i++) { 
       CameraInfo info = new CameraInfo(); 
       Camera.getCameraInfo(i, info); 
       if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { 
       Log.d("Camera", "Camera found"); 
       cameraId = i; 
       break; 
       } 
      } 
      return cameraId; 
      } 



     @Override 
     protected void onPause() { 
     if (camera != null) { 
      camera.release(); 
      camera = null; 
     } 
     super.onPause(); 
     } 
} 




public class PhotoHandler implements PictureCallback { 

     private final Context context; 

     public PhotoHandler(Context context) { 
     this.context = context; 
     } 

    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     // TODO Auto-generated method stub 

     File pictureFileDir = getDir(); 

     if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) { 

      Log.d("Camara", "Can't create directory to save image."); 
      Toast.makeText(context, "Can't create directory to save image.", 
       Toast.LENGTH_LONG).show(); 
      return; 
    } 


     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyymmddhhmmss"); 
     String date = dateFormat.format(new Date()); 
     String photoFile = "Picture_" + date + ".jpg"; 

     String filename = pictureFileDir.getPath() + File.separator + photoFile; 

     File pictureFile = new File(filename); 

     try { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
      Toast.makeText(context, "New Image saved:" + photoFile, 
       Toast.LENGTH_LONG).show(); 
     } catch (Exception error) { 
      Log.d("Camara", "File" + filename + "not saved: " 
       + error.getMessage()); 
      Toast.makeText(context, "Image could not be saved.", 
       Toast.LENGTH_LONG).show(); 
     } 
     } 

     private File getDir() { 
      File sdDir = Environment 
       .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
      return new File(sdDir, "CameraAPIDemo"); 
      } 
    } 

logcat的

FATAL EXCEPTION: main Process: com.frontcamera, 
java.lang.IllegalStateException: Could not execute method of the activity 
at android.view.View$1.onClick(View.java:3848) 
at android.view.View.performClick(View.java:4463) 
at android.view.View$PerformClick.run(View.java:18770) 
at android.os.Handler.handleCallback(Handler.java:808) 
at android.os.Handler.dispatchMessage(Handler.java:103) 
at android.os.Looper.loop(Looper.java:193) 
at android.app.ActivityThread.main(ActivityThread.java:5292) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:82) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at android.view.View$1.onClick(View.java:3843) 
Caused by: java.lang.RuntimeException: takePicture failed 
at android.hardware.Camera.native_takePicture(Native Method) 
at android.hardware.Camera.takePicture(Camera.java:1597) 
at android.hardware.Camera.takePicture(Camera.java:1542) 
at com.frontcamera.ImagePickActivity.onClick(ImagePickActivity.java:44) 
+0

在此處發佈您的代碼 –

+0

還會發布更多的logcat,以查看您的代碼中哪個點出現錯誤。 – pleft

回答

0

你必須讓相機預覽你叫takePicture之前。如果您希望在不顯示預覽的情況下拍攝照片,您可以製作這個技巧:顯示預覽,但不顯示在屏幕上。搜索論壇,因爲它已經在之前的stackoverflow上討論過。

+0

我已經使用了下面的意圖,Intent intent = new Intent(「android.media.action.IMAGE_CAPTURE」);但是它打開了後面的相機。如果有任何可用的意圖打開前置攝像頭。 – Vengat

+0

讓我清除它:我沒有說通過意圖打開默認的相機應用程序。我說如果你想在你的相機對象上成功調用takePicture,你必須顯示相機的預覽。在這裏閱讀關於這個:http://developer.android.com/training/camera/cameradirect.html – DDsix

+0

它清楚地說在文檔「調用startPreview()開始更新預覽表面。預覽必須開始之前,你可以採取圖片。」 – DDsix

0

爲您的清單添加權限。

<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
<uses-feature android:name="android.hardware.camera.autofocus" /> 


也看看這裏 - java.lang.RuntimeException: takePicture failed

+0

我不會推薦添加,除非你的應用程序的主要功能正在拍照 - >你可以爲你創建應用程序。如果您的應用還有其他一些功能,那麼您可以阻止使用沒有相機的設備的用戶安裝它並使用您的應用。在這種情況下,幾乎可以,因爲幾乎所有的設備都有相機。但這總的來說。 – DDsix

+0

我已經包含這些權限。 – Vengat

0

我認爲你是混合隱性和顯性意圖。

來自vogella的代碼是這樣做的: 顯示相機預覽並在單擊按鈕時拍攝圖片而不關閉應用程序。您的意圖是: Intent intent = new Intent(「android.media.action.IMAGE_CAPTURE」); 這是隱含的意圖,你讓用戶用他/她的選擇(Instagram,本機相機等)的應用程序拍照。這將從應用程序中消失,並在照片與照片數據一起拍攝時返回。

你應該首先決定做這些事情之一。