fille19 2017-10-12 03:00 采纳率: 0%
浏览 1924

相机预览按多任务键再返回应用黑屏问题,异常fail connect camera service

package com.yssh.myapplication;

import android.app.Activity;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MainActivity extends Activity implements SurfaceHolder.Callback{

private SurfaceView mCameraView; // 视频显示控件
private SurfaceHolder currentHolder = null;
private boolean mIsSufaceCreated = false;
private Camera mCamera;
private Camera.Size mSize;
public final int CAMERA_FACING_BACK = 0; // 0代表前置摄像头

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.video_frame);

  mCameraView = (SurfaceView) findViewById(R.id.surface_local);

  currentHolder = mCameraView.getHolder();// 取得holder
  currentHolder.addCallback(this); // holder加入回调接口
  //        // setType必须设置,要不出错.
  if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){
     currentHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
  }

}

@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
releaseCamera();
}

@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
releaseCamera();
}

@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
initCamera();
}

@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
mIsSufaceCreated = true;
currentHolder = arg0;
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
mIsSufaceCreated = false;
}

private void initCamera() {
//保证只有一个Camera对象
if (mCamera != null || !mIsSufaceCreated) {
return;
}
try{
mCamera = Camera.open(CAMERA_FACING_BACK);

     CameraSizeComparator sizeComparator = new CameraSizeComparator();
     Camera.Parameters parameters = mCamera.getParameters();

     if (mSize == null) {
        List<Camera.Size> vSizeList = parameters.getSupportedPreviewSizes();
        Collections.sort(vSizeList, sizeComparator);

        for (int num = 0; num < vSizeList.size(); num++) {
           Camera.Size size = vSizeList.get(num);

           if (size.width >= 800 && size.height >= 480) {
              this.mSize = size;
              break;
           }
        }
        mSize = vSizeList.get(0);

        List<String> focusModesList = parameters.getSupportedFocusModes();

        //增加对聚焦模式的判断
        if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
           parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        } else if (focusModesList.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
           parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        }
        mCamera.setParameters(parameters);
     }

     mCamera.setPreviewDisplay(currentHolder);
     mCamera.startPreview();
  }catch (Exception e){
     Log.d("mCamera", e.getMessage());
     e.printStackTrace();
  }

}

private class CameraSizeComparator implements Comparator {
public int compare(Camera.Size lhs, Camera.Size rhs) {
if (lhs.width == rhs.width) {
return 0;
} else if (lhs.width > rhs.width) {
return 1;
} else {
return -1;
}
}
}

private void releaseCamera() {
try {
if (mCamera != null) {
mCamera.setPreviewCallback(null);
mCamera.stopPreview();
mCamera.unlock();
mCamera.release();
}
} catch (RuntimeException e) {
} finally {
mCamera = null;
}
}
}

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2018-11-06 16:35
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制