我得到异常java.lang.RuntimeException:重新打开相同的活动时无法连接到相机服务。 第一次代码工作正常而没有捕获视频文件(只有相机预览)。但是在完成MainActivity之后。如果我再次调用Mainactivity,那么对于mCamera = Camera.open(0);它会抛出异常 我检查了stackoverflow的问题,但没有解决方案适用于它。
代码
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, View.OnClickListener {
private VideoView videoView = null;
private MediaController mc = null;
private SurfaceHolder surfaceHolder;
private SurfaceView surfaceView;
public MediaRecorder mediaRecorder = new MediaRecorder();
private Camera mCamera;
private Button btnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
btnStart = (Button) findViewById(R.id.btnStart);
btnStart.setOnClickListener(this);
if (mCamera == null) {
mCamera = Camera.open(0);
Camera.Parameters params = mCamera.getParameters();
mCamera.setParameters(params);
mCamera.setDisplayOrientation(90);
}
}
@SuppressLint("NewApi")
protected void startRecording() throws IOException {
File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/myVideos");
if (!dir.exists()) {
dir.mkdirs();
}
Date date = new Date();
String fileName = "/rec" + date.toString().replace(" ", "_").replace(":", "_") + ".mp4";
File file = new File(dir, fileName);
mediaRecorder = new MediaRecorder();
mCamera.lock();
mCamera.unlock();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
mediaRecorder.setOutputFile(dir + fileName);
mediaRecorder.setOrientationHint(90);
mediaRecorder.prepare();
mediaRecorder.start();
refreshGallery(file);
}
private void refreshGallery(File file) {
Intent mediaScanIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.setData(Uri.fromFile(file));
sendBroadcast(mediaScanIntent);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (mCamera != null) {
try {
if (mCamera != null) {
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
mCamera.unlock();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
} else {
Toast.makeText(getApplicationContext(), "Camera not available!",
Toast.LENGTH_LONG).show();
finish();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnStart:
if (btnStart.getText().toString().equalsIgnoreCase("Start")) {
btnStart.setText("Stop");
try {
startRecording();
} catch (IOException e) {
String message = e.getMessage();
Log.i(null, "Problem " + message);
mediaRecorder.release();
e.printStackTrace();
}
} else {
btnStart.setText("Start");
mediaRecorder.stop();
mediaRecorder.release();
mediaRecorder = null;
}
break;
default:
break;
}
}
@Override
public void onDestroy()
{
super.onDestroy();
if(mCamera!=null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
}
@Override
public void onBackPressed()
{
Intent intent=new Intent(MainActivity.this,FirstActivityActivity.class);
startActivity(intent);
super.onBackPressed();
}
}
任何人都可以告诉我,代码有什么问题吗?
这里是logcat
FATAL EXCEPTION: main
Process: com.example.surfaceviewrecord, PID: 11717
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.surfaceviewrecord/com.example.surfaceviewrecord.MainActivity}:
java.lang.RuntimeException: Fail to connect to camera service
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
Caused by: java.lang.RuntimeException: Fail to connect to camera service
at android.hardware.Camera.<init>(Camera.java:647)
at android.hardware.Camera.open(Camera.java:489)
at com.example.surfaceviewrecord.MainActivity.onCreate(MainActivity.java:47)
at android.app.Activity.performCreate(Activity.java:6582)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1113)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2532)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2667)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1494)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5776)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
清单文件中的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
答案 0 :(得分:0)
您需要从marshmallow及以上版本应用运行时摄像头权限。所以在这里您没有相机许可,这就是发生此错误的原因。
请检查此Link
None
200
Process finished with exit code 0
请检查上面的代码并输入onDestroy()方法。