各位大大我真心觉得恶心了。
在双摄像头(前后)上我调用Camera,可以实现预览,摄像头切换等等。可是同样的代码放在小米手机、htcg10 等等,就出现不了预览,另外说一句,我的程序用MediaRecorder进行视频录像的。
我的代码如下:
在双摄像头(前后)上我调用Camera,可以实现预览,摄像头切换等等。可是同样的代码放在小米手机、htcg10 等等,就出现不了预览,另外说一句,我的程序用MediaRecorder进行视频录像的。
我的代码如下:
public class VideoRecordActivity extends BaseActivity implements Callback {
private SurfaceView surfaceView;
private ImageView mike;
private ImageView loudspeaker;
private ImageView switchVideo;
private ImageView recordVideo;
private ImageView goback;
private MediaRecorder recorder;
private ImageView line4;
private ImageView stopRecord;
private TextView time; private int count = 10;
private boolean run = false;
public static String fileName ;
private SurfaceHolder holder ;
private Camera mCamera;
private int numCamera;
private int cameraId;
private int cameraCurrentId;
private List<Size> mSupportedPreviewSizes;
Handler handler; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.video_record);
initUiComponents();
initParametersAndListener();
} /**
* 初始化控件
*/
private void initUiComponents() {
// TODO Auto-generated method stub
surfaceView = (SurfaceView) findViewById(R.id.surface_view);
mike = (ImageView) findViewById(R.id.mike);
loudspeaker = (ImageView) findViewById(R.id.voice);
switchVideo = (ImageView) findViewById(R.id.switch_video);
recordVideo = (ImageView) findViewById(R.id.record_video);
goback = (ImageView) findViewById(R.id.goback);
line4 = (ImageView) findViewById(R.id.line4);
stopRecord = (ImageView) findViewById(R.id.stop_record);
time = (TextView) findViewById(R.id.time);
handler = new Handler();
}
/**
* 参数设置,监听设置
*
*/
private void initParametersAndListener() {
// TODO Auto-generated method stub
holder = surfaceView.getHolder() ;
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holder.setKeepScreenOn(true);
holder.setFixedSize(320, 240); mike.setOnClickListener(mikeListener);
loudspeaker.setOnClickListener(loudspeakerListener);
switchVideo.setOnClickListener(switchVideoListener);
recordVideo.setOnClickListener(recordVideoListener);
goback.setOnClickListener(gobackListener);
stopRecord.setOnClickListener(stopRecordListener);
numCamera = Camera.getNumberOfCameras();
CameraInfo info = new CameraInfo();
for(int i = 0;i< numCamera;i++){
Camera.getCameraInfo(i, info);
if(info.facing == CameraInfo.CAMERA_FACING_BACK){
cameraId = i;
}
}
}
@Override
public void onResume() {
if(numCamera>1){
mCamera = Camera.open();
this.setCamera(mCamera);
cameraCurrentId = cameraId;
}else{
//禁掉切换摄像头按钮
switchVideo.setClickable(false);
}
super.onResume(); }
/**
* 麦克风设置
*/
private OnClickListener mikeListener = new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub }
}; /**
* 扬声器设置
*/
private OnClickListener loudspeakerListener = new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub }
}; /**
* 切换摄像头
*/
private OnClickListener switchVideoListener = new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
mCamera = Camera
.open((cameraCurrentId + 1) % numCamera);
cameraCurrentId = (cameraCurrentId + 1)
% numCamera;
switchCamera(mCamera);
mCamera.startPreview();
}
}; /**
* 录制
*/
private OnClickListener recordVideoListener = new OnClickListener() { @Override
public void onClick(View v) {
startRecorder();
recordVideo.setClickable(false);// 防止多次点击操作,因为系统开启摄像头需要一些时间
stopRecord.setClickable(true);
switchVideo.setClickable(false) ;//录制过程中,禁切换摄像头
}
}; /**
* 停止
*/
private OnClickListener stopRecordListener = new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopRecord();
// Intent intent = new Intent(VideoRecordActivity.this,VideoRecordConfirmActivity.class) ;
// startActivity(intent);
// VideoRecordActivity.this.finish();
}
}; /**
* 挂断
*/
private OnClickListener gobackListener = new OnClickListener() { @Override
public void onClick(View v) {
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
}
finish();
}
};
* 开始录制视频
*/
private void startRecorder() {
run = true;
try {
recorder = new MediaRecorder();
if(numCamera>1){//若是1个摄像头则直接录制
mCamera.unlock();//注意,要在MediaRecorder设置参数之前就调用unlock来获得camera的控制权
recorder.setCamera(mCamera);
}
prepareVideoRecorder();
recorder.start();
handler.postDelayed(task, 1000);
} catch (Exception e) {
e.printStackTrace();
} recordVideo.setVisibility(View.GONE);
line4.setVisibility(View.GONE);
goback.setVisibility(View.GONE);
stopRecord.setVisibility(View.VISIBLE);
time.setText(String.valueOf(count));
time.setVisibility(View.VISIBLE) ;
} /**
* 停止录制
*/
private void stopRecord() {
if (recorder != null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = 0;
// handler.post(task);
run = false;
recorder.stop();
recorder.release();
recorder = null;
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
count = 10 ;
}
private Runnable task = new Runnable() {
public void run() {
// TODO Auto-generated method stub
if (run) {
handler.postDelayed(this, 1000);
--count;
if(count<=-1){
stopRecord();
run = false;
time.setText("完成");
}else{
time.setText(String.valueOf(count));
}
Log.e("", "倒数 第 "+count+"秒");
}else{
run = false;
time.setText("完成");
Intent intent = new Intent(VideoRecordActivity.this,VideoRecordConfirmActivity.class) ;
startActivity(intent);
VideoRecordActivity.this.finish();
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
public void switchCamera(Camera camera) {
if(numCamera>1){//非一个摄像头
setCamera(camera);
try {
camera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
Camera.Parameters parameters = camera.getParameters();
surfaceView.requestLayout();
camera.setParameters(parameters);
}
}
public void setCamera(Camera camera) {
mCamera = camera;
if (mCamera != null) {
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();//获取硬件所支持的尺寸
surfaceView.requestLayout();
}
}
//准备录制视频
private boolean prepareVideoRecorder() {// recorder.reset();
recorder.setAudioSource(AudioSource.MIC);// 声音来源于mic
recorder.setVideoSource(VideoSource.CAMERA);// 视频来源于CAMERA
recorder.setOutputFormat(OutputFormat.MPEG_4);//设置视频输出格式为mp4
recorder.setAudioEncoder(AudioEncoder.AMR_NB);//设置声音的编码方式
recorder.setVideoEncoder(VideoEncoder.H264) ;//设置视频的编码方式
// recorder.setMaxFileSize(5120000);// 设置最大为1M
recorder.setVideoSize(320, 240);// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
// recorder.setVideoFrameRate(5);// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
//文件名称为 接收方id_系统时间
fileName = FriendDetailsActivity.touserId+"_"+System.currentTimeMillis()+".mp4" ;
File file = new File(ConstantValues.DOWNLOAD_VIDEO_FILE_PATH+fileName);
ConstantValues.videoRecordSavePath = file.getAbsolutePath() ;
Log.e("videoRecordSavePath", ConstantValues.videoRecordSavePath) ;
recorder.setOutputFile(file.getAbsolutePath());// 视频文件的输出位置
recorder.setPreviewDisplay(holder.getSurface()); try {
recorder.prepare();
} catch (Exception e) {
return false;
}
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if (mCamera != null){
Camera.Parameters parameters = mCamera.getParameters();
mCamera.setParameters(parameters);
mCamera.startPreview();
}
} @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
if (mCamera != null){
//启动预览
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
} catch (IOException e) {
mCamera.release();
mCamera = null;
}
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
}
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
@Override
public void onPause() {
stopRecord();
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
}
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
super.onPause();
}
//禁掉return键
public boolean onKeyDown(int keyCode,KeyEvent event) {
// 是否触发按键为back键
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return false ;
}
}
* 开始录制视频
*/
private void startRecorder() {
run = true;
try {
recorder = new MediaRecorder();
if(numCamera>1){//若是1个摄像头则直接录制
mCamera.unlock();//注意,要在MediaRecorder设置参数之前就调用unlock来获得camera的控制权
recorder.setCamera(mCamera);
}
prepareVideoRecorder();
recorder.start();
handler.postDelayed(task, 1000);
} catch (Exception e) {
e.printStackTrace();
} recordVideo.setVisibility(View.GONE);
line4.setVisibility(View.GONE);
goback.setVisibility(View.GONE);
stopRecord.setVisibility(View.VISIBLE);
time.setText(String.valueOf(count));
time.setVisibility(View.VISIBLE) ;
} /**
* 停止录制
*/
private void stopRecord() {
if (recorder != null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = 0;
// handler.post(task);
run = false;
recorder.stop();
recorder.release();
recorder = null;
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
count = 10 ;
}
private Runnable task = new Runnable() {
public void run() {
// TODO Auto-generated method stub
if (run) {
handler.postDelayed(this, 1000);
--count;
if(count<=-1){
stopRecord();
run = false;
time.setText("完成");
}else{
time.setText(String.valueOf(count));
}
Log.e("", "倒数 第 "+count+"秒");
}else{
run = false;
time.setText("完成");
Intent intent = new Intent(VideoRecordActivity.this,VideoRecordConfirmActivity.class) ;
startActivity(intent);
VideoRecordActivity.this.finish();
try {
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
public void switchCamera(Camera camera) {
if(numCamera>1){//非一个摄像头
setCamera(camera);
try {
camera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
Camera.Parameters parameters = camera.getParameters();
surfaceView.requestLayout();
camera.setParameters(parameters);
}
}
public void setCamera(Camera camera) {
mCamera = camera;
if (mCamera != null) {
mSupportedPreviewSizes = mCamera.getParameters().getSupportedPreviewSizes();//获取硬件所支持的尺寸
surfaceView.requestLayout();
}
}
//准备录制视频
private boolean prepareVideoRecorder() {// recorder.reset();
recorder.setAudioSource(AudioSource.MIC);// 声音来源于mic
recorder.setVideoSource(VideoSource.CAMERA);// 视频来源于CAMERA
recorder.setOutputFormat(OutputFormat.MPEG_4);//设置视频输出格式为mp4
recorder.setAudioEncoder(AudioEncoder.AMR_NB);//设置声音的编码方式
recorder.setVideoEncoder(VideoEncoder.H264) ;//设置视频的编码方式
// recorder.setMaxFileSize(5120000);// 设置最大为1M
recorder.setVideoSize(320, 240);// 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
// recorder.setVideoFrameRate(5);// 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
//文件名称为 接收方id_系统时间
fileName = FriendDetailsActivity.touserId+"_"+System.currentTimeMillis()+".mp4" ;
File file = new File(ConstantValues.DOWNLOAD_VIDEO_FILE_PATH+fileName);
ConstantValues.videoRecordSavePath = file.getAbsolutePath() ;
Log.e("videoRecordSavePath", ConstantValues.videoRecordSavePath) ;
recorder.setOutputFile(file.getAbsolutePath());// 视频文件的输出位置
recorder.setPreviewDisplay(holder.getSurface()); try {
recorder.prepare();
} catch (Exception e) {
return false;
}
return true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if (mCamera != null){
Camera.Parameters parameters = mCamera.getParameters();
mCamera.setParameters(parameters);
mCamera.startPreview();
}
} @Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
try {
if (mCamera != null){
//启动预览
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
} catch (IOException e) {
mCamera.release();
mCamera = null;
}
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
}
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
@Override
public void onPause() {
stopRecord();
if (recorder != null) {
recorder.stop();
recorder.release();
recorder = null;
}
if (mCamera != null){
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
super.onPause();
}
//禁掉return键
public boolean onKeyDown(int keyCode,KeyEvent event) {
// 是否触发按键为back键
if (keyCode == KeyEvent.KEYCODE_BACK) {
return true;
}
return false ;
}
}