我需要帮助。我正在尝试使用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;
}
}
帮助那些人...... 感谢...
答案 0 :(得分:0)
您可能需要在运行时请求权限。有关此主题的更多信息,请参阅The Android Developers Homepage。 在定位Android 6.0或更高版本时,需要请求运行时权限。