Android ...无法连接到相机服务

时间:2016-11-13 21:27:58

标签: android

我需要帮助。我正在尝试使用Surface vie实现自定义相机,但我陷入了这个错误:

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;
}

}

帮助那些人...... 感谢...

1 个答案:

答案 0 :(得分:0)

您可能需要在运行时请求权限。有关此主题的更多信息,请参阅The Android Developers Homepage。 在定位Android 6.0或更高版本时,需要请求运行时权限。