各位大大我真心觉得恶心了。
在双摄像头(前后)上我调用Camera,可以实现预览,摄像头切换等等。可是同样的代码放在小米手机、htcg10 等等,就出现不了预览,另外说一句,我的程序用MediaRecorder进行视频录像的。
我的代码如下:

解决方案 »

  1.   


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

  2.   

    /**
     * 开始录制视频
     */
    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 ;
    }
       
    }
      

  3.   

    /**
     * 开始录制视频
     */
    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 ;
    }
       
    }
      

  4.   

    兼容性问题,Android框架被这些手机厂商改得够乱的,在小米或者HTC上不能实现时,是否有什么错误提示?