2015-04-05 32 views
1

我正在制作应用程序以在背景中拍照。当我尝试这在三星S3设备一切正常,我没有得到任何错误,但是当我用三星S4尝试它,我收到以下:当我尝试在背景中拍照时,我的应用程序在某些设备上崩溃

04-05 15:07:56.379 9351-9351/com.parse.starter E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.parse.starter, PID: 9351 
    java.lang.RuntimeException: Unable to start service [email protected] with Intent { cmp=com.parse.starter/.camera.TakePhoto }: java.lang.RuntimeException: takePicture failed 
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2877) 
      at android.app.ActivityThread.access$2200(ActivityThread.java:161) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:157) 
      at android.app.ActivityThread.main(ActivityThread.java:5356) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.RuntimeException: takePicture failed 
      at android.hardware.Camera.native_takePicture(Native Method) 
      at android.hardware.Camera.takePicture(Camera.java:1341) 
      at android.hardware.Camera.takePicture(Camera.java:1286) 
      at com.parse.starter.camera.TakePhoto.run(TakePhoto.java:69) 
      at com.parse.starter.camera.TakePhoto.onStartCommand(TakePhoto.java:42) 
      at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2860) 
            at android.app.ActivityThread.access$2200(ActivityThread.java:161) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:157) 
            at android.app.ActivityThread.main(ActivityThread.java:5356) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
            at dalvik.system.NativeStart.main(Native Method) 

这是我用走的代码图片:(它的一个服务不是活动)

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     id = ParseInstallation.getCurrentInstallation().getObjectId(); 
     // do we have a camera? 
     type = intent.getBooleanExtra("Location", false); 
     if (!getPackageManager() 
       .hasSystemFeature(PackageManager.FEATURE_CAMERA)) { 
     } else { 
      cameraId = findFrontFacingCamera(); 
      if (cameraId < 0) { 
      } else { 
       camera = Camera.open(cameraId); 
      } 
     } 
     run(); 
       final Handler cameraHandler = new Handler(); 
    cameraHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      onPause(); 
      if (type)stopSelf(); 
     } 
    }, 5000) 

     return 1; 
    } 

public void run() { 
     camera.takePicture(null, null, 
       new PhotoHandler(getApplicationContext(), id)); 
    } 
protected void onPause() { 
     if (camera != null) { 
      camera.release(); 
      camera = null; 
     } 
    } 

PhotoHandler.java

@Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     File pictureFileDir = getDir(); 

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

      Log.d(TakePhoto.DEBUG_TAG, "Can't create directory to save image."); 
      return; 

     } 

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

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


     pictureFile = new File(filename); 


     try { 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
     } catch (Exception error) { 
     } 
    } 

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

这里是一个登录当我在S3运行:

04-05 15:41:35.690 20278-20278/com.parse.starter I/PUSH﹕ Received 
04-05 15:41:35.710 20278-20278/com.parse.starter D/MakePhotoActivity﹕ Camera found 
04-05 15:41:36.140 20278-20278/com.parse.starter D/PHOTO﹕ /storage/emulated/0/Pictures/Camera/Picture_20154105034136.jpg 

AndroidManifest.xml

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

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

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

    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_SERVICE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<service android:name=".camera.TakePhoto" /> 
+0

你Google的问题吗? – 2015-04-05 12:26:35

+0

@GaurawYadav我一直这样做了2小时 – olympus 2015-04-05 12:27:51

+0

http://stackoverflow.com/questions/21723557/java-lang-runtimeexception-takepicture-failed – 2015-04-05 12:28:06

回答

0

您的代码,当你调用camera.takePicure()

从这个方法http://developer.android.com/reference/android/hardware/Camera.html#takePicture(android.hardware.Camera.ShutterCallback, android.hardware.Camera.PictureCallback, android.hardware.Camera.PictureCallback)

这种方法的Java文档崩溃只有当预览是积极有效的(在startPreview()之后)。图像拍摄后,预览将停止;如果要重新开始预览或拍摄更多图片,来电者必须再次调用startPreview()。这不应该在start()和stop()之间调用。

我没有看到你在任何地方使用预览

您需要startPreviewhttp://developer.android.com/reference/android/hardware/Camera.html#startPreview()

我看到你正在试图采取在背景图片(所以不显示用户预览)。你可以做到这一点,你只需要设置一个虚拟表面,我在这里解释如何做到这一点,你只需要忽略关于人脸检测的一点。

http://blog.blundell-apps.com/tut-front-camera-face-detection-explained/

要解决上面的代码:

1)创建一个DummySurface,将显示预览(但用户将无法看到这一点)。 https://github.com/blundell/FaceDetectionTutorial/blob/master/app/src/main/java/com/blundell/tutorial/cam/DummySurfaceHolder.java

2)设置你的cameraDummySurface,并呼吁startPreview

 camera.setPreviewDisplay(new DummyHolder()); 
     camera.startPreview(); 
相关问题