2016-11-13 141 views
0

我需要幫助。我試圖用表面VIE實現自定義的攝像頭,但我堆疊成這個錯誤:Android ...未能連接到相機服務

Process: visionary.anselmo.camerademo, PID: 7464 
                      java.lang.RuntimeException: Fail to connect to camera service 
                      at android.hardware.Camera.<init>(Camera.java:496) 
                      at android.hardware.Camera.open(Camera.java:360) 
                      at visionary.anselmo.camerademo.CameraActivity.surfaceCreated(CameraActivity.java:149) 
                      at android.view.SurfaceView.updateWindow(SurfaceView.java:608) 
                      at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:160) 
                      at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2201) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:683) 
                      at android.view.Choreographer.doFrame(Choreographer.java:619) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857) 
                      at android.os.Handler.handleCallback(Handler.java:751) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:154) 
                      at android.app.ActivityThread.main(ActivityThread.java:6077) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

而且這裏去處理這個活動: 公共類CameraActivity擴展AppCompatActivity實現SurfaceHolder.Callback {

@SuppressWarnings("deprecation") 
private Camera camera; 
@InjectView(R.id.surface_view) 
SurfaceView surfaceView; 
@InjectView(R.id.btn_take_picture) 
ImageView take_picture; 
SurfaceHolder surfaceHolder; 
@SuppressWarnings("deprecation") 
Camera.PictureCallback pictureCallback; 
@SuppressWarnings("deprecation") 
ShutterCallback shutterCallback; 


@SuppressWarnings("deprecation") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.camera_activity); 
    ButterKnife.inject(this); 
    surfaceHolder = surfaceView.getHolder(); 
    // Install the surfaceHolder.Callback so we get notified when the underlying is created and destroyed 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    take_picture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      cameraImage(); 
     } 
    }); 
    pictureCallback = new Camera.PictureCallback() { 
     @Override 
     public void onPictureTaken(byte[] data, Camera camera) { 
      FileOutputStream outputStream; 
      File imageFile = getDirectory(); 
      if (!imageFile.exists() && !imageFile.mkdirs()) { 
       Toast.makeText(getApplicationContext(), 
         "Nao foi possivel criar o directorio para a imagem.", 
         Toast.LENGTH_SHORT) 
         .show(); 
       return; 
      } 
      SimpleDateFormat format = new SimpleDateFormat("yyyymmddhhmmss", Locale.ENGLISH); 
      String date = format.format(new Date()); 
      String photoFile = "Demo" + date + ".jpg"; 
      String fileName = imageFile.getAbsolutePath() + "/" + photoFile; 
      File picFile = new File(fileName); 
      try { 
       outputStream = new FileOutputStream(picFile); 
       outputStream.write(data); 
       outputStream.close(); 
      } catch (IOException ignored) { 
      } 
      Toast.makeText(getApplicationContext(), "Picture Saved", Toast.LENGTH_SHORT) 
        .show(); 

      refreshCamera(); 
      refreshGallery(picFile); 
     } 
    }; 
} 

private void refreshGallery(File file) { 
    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
    intent.setData(Uri.fromFile(file)); 
    sendBroadcast(intent); 
} 

private void refreshCamera() { 
    if (surfaceHolder.getSurface() == null) { 
     // Preview surfave does not exists 
     return; 
    } 
    // Stop the preview before making changes 
    try { 
     camera.stopPreview(); 
    } catch (Exception ignored) { 
    } 
    // Set the preview size, and make any resize, rotate or any reformmating changes here 
    // Start preview with new Settings 
    try { 
     camera.setPreviewDisplay(surfaceHolder); 
     camera.startPreview(); 
    } catch (Exception ignored) { 
    } 
} 

private File getDirectory() { 
    File dics = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM); 
    return new File(dics, "CameraActivity"); 
} 

    private void cameraImage() { 
    // Take the picture 
    camera.takePicture(null, null, pictureCallback); 
} 

@SuppressWarnings("deprecation") 
@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // Open the fuck'n Camera here 
    releaseCamera(); 

    camera = Camera.open(); 

    Camera.Parameters parameters; 
    parameters = camera.getParameters(); 

    // Modify the parameters 
    parameters.setPreviewFrameRate(20); 
    parameters.setPreviewSize(352, 288); 
    camera.setParameters(parameters); 
    camera.setDisplayOrientation(90); 

    try { 
     // The surface has been created, now tell the camera where to draw the preview 
     camera.setPreviewDisplay(surfaceHolder); 
    } catch (Exception ignored) { 
    } 
} 

    private void releaseCamera(){ 
    if(camera != null){ 
     camera.release(); 
     camera = null; 
    } 
} 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    refreshCamera(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // Stop the preview and release the camera 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
} 

}

幫助傢伙... 謝謝...

+0

通常,這意味着另一個應用程序正在使用相機。如果您的應用程序打開相機但未能正確關閉,則會發生這種情況。嘗試重新啓動設備並查看問題是否清除。 – CommonsWare

+0

@CommonsWare ...我使用的是android工作室模擬器,我關掉了設備並重新開始,但應用仍然暗戀...... –

+0

任何想法我該如何解決這個問題? –

回答

0

你可能東東d在運行時請求權限。有關此主題的更多信息,請參閱The Android Developers Homepage。 定位Android 6.0或更高版本時,需要運行時權限。

+0

這對我有效......謝謝@Jonas ... –