1

我使用 SurfaceView 录制视频,在 HTC 和 SAMSUNG 设备上运行良好,但在 MIUI 设备上无法运行,并抛出异常如下:04-28 11:45:12.869: E/MediaRecorder(28941): setOutputFormat 在无效状态下调用: 4 04-28 11:45:12.869: W/System.err(28941): java.lang.IllegalStateException 04-28 11:45:12.869: W/System.err(28941): 在 android.media.MediaRecorder。 setOutputFormat(Native Method) 04-28 11:45:12.869: W/System.err(28941): at com.dream.gushihui.TakeVideoActivity.onClick(TakeVideoActivity.java:416) 04-28 11:45:12.869: W /System.err(28941): 在 android.view.View.performClick(View.java:2486) 04-28 11:45:12.869: W/System.err(28941): 在 android.view.View$PerformClick。运行(View.java:9130)04-28 11:45:12.869:W/System.err(28941):在 android.os.Handler.handleCallback(Handler.java:587)04-28 11:45:12.869: W / System.err(28941):在 android.os.Handler.dispatchMessage(Handler.java:92) 04-28 11:45:12.869: W/System.err(28941): 在 android.os.Looper.loop(Looper.java:130) 04- 28 11:45:12.869: W/System.err(28941): 在 android.app.ActivityThread.main(ActivityThread.java:3703) 04-28 11:45:12.869: W/System.err(28941): 在java.lang.reflect.Method.invokeNative(Native Method) 04-28 11:45:12.869: W/System.err(28941): at java.lang.reflect.Method.invoke(Method.java:507) 04- 28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 04-28 11:45:12.869: W/System。错误(28941):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)04-28 11:45:12.869:W/System.err(28941):在 dalvik.system.NativeStart.main (本机方法)错误(28941):在 android.os.Looper.loop(Looper.java:130)04-28 11:45:12.869:W/System.err(28941):在 android.app.ActivityThread.main(ActivityThread.java :3703) 04-28 11:45:12.869: W/System.err(28941): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-28 11:45:12.869: W/System.err( 28941): 在 java.lang.reflect.Method.invoke(Method.java:507) 04-28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller .run(ZygoteInit.java:866) 04-28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 04-28 11 :45:12.869:W / System.err(28941):在dalvik.system.NativeStart.main(本机方法)错误(28941):在 android.os.Looper.loop(Looper.java:130)04-28 11:45:12.869:W/System.err(28941):在 android.app.ActivityThread.main(ActivityThread.java :3703) 04-28 11:45:12.869: W/System.err(28941): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-28 11:45:12.869: W/System.err( 28941): 在 java.lang.reflect.Method.invoke(Method.java:507) 04-28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller .run(ZygoteInit.java:866) 04-28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 04-28 11 :45:12.869:W / System.err(28941):在dalvik.system.NativeStart.main(本机方法)869: W/System.err(28941): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-28 11:45:12.869: W/System.err(28941): 在 java.lang.reflect。 Method.invoke(Method.java:507) 04-28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 04 -28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 04-28 11:45:12.869: W/System.err (28941):在 dalvik.system.NativeStart.main(本机方法)869: W/System.err(28941): 在 java.lang.reflect.Method.invokeNative(Native Method) 04-28 11:45:12.869: W/System.err(28941): 在 java.lang.reflect。 Method.invoke(Method.java:507) 04-28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 04 -28 11:45:12.869: W/System.err(28941): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 04-28 11:45:12.869: W/System.err (28941):在 dalvik.system.NativeStart.main(本机方法)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 04-28 11:45:12.869: W/System.err(28941): 在 dalvik.system.NativeStart.main(Native Method)在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624) 04-28 11:45:12.869: W/System.err(28941): 在 dalvik.system.NativeStart.main(Native Method)

enter code here
public class TakeVideoActivity extends Activity implements OnClickListener,SurfaceHolder.Callback {

    private static final int REQUEST_CODE_GET_LOCAL_VIDEO = 11;
    //默认录制视频的时长-3分钟
    private static final int DEFAULT_RECORD_TIME = 180;

    private TextView mTextViewControlLight, mTextViewControlCamera, mTextViewBack, 
                        mTextViewChooseLocalVideo, mTextViewControlVideo, mTextViewRecordPrompt;
    private SurfaceView surfaceview;// 显示视频的控件
    // 用来显示视频的一个接口,我靠不用还不行,也就是说用mediarecorder录制视频还得给个界面看
    // 想偷偷录视频的同学可以考虑别的办法。。嗯需要实现这个接口的Callback接口
    private SurfaceHolder surfaceHolder;
    //获取屏幕的宽和高,用于设置视频的尺寸大小
    private int screenWidth, screenHight;
    private MediaRecorder mediarecorder;// 录制视频的类

    private boolean isRecording = false;
    public static String VIDEO_RECORD_PATH = Environment.getExternalStorageDirectory().toString()+"/12fou/videoRecord/";
//  public static String VIDEO_TEMP_NAME = "video_tmp.mp4";
    private String videoName;

    private AlertDialog dialog;

    private Camera camera;
    //闪光灯是否开启
    private boolean isFlashLight = false;
    //当前的camera是否是前置摄像头
    private boolean isFacingCamera = false;

    private TextView mTextViewRecordTime;
    private Timer timer = new Timer();
    //视频剩余的时间
    private int recordRemainTime = 0;

    private boolean isSuccess = false;
    private String message = "";

    private ProgressDialog mProgressDialog;

    private final static int UPLOAD_VIDEO_END = 1;
    private static final int SHOW_PROGRESS_DIALOG = 2;
    private static final int DISMISS_PROGRESS_DIALOG = 3;

    private Handler myHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case SHOW_PROGRESS_DIALOG:
                try {
                    if (mProgressDialog != null) {
                        if (mProgressDialog.isShowing()) {
                            mProgressDialog.dismiss();
                        }
                        mProgressDialog = null;
                    }
                    mProgressDialog = new ProgressDialog(TakeVideoActivity.this);
                    mProgressDialog.setIndeterminate(true);
                    mProgressDialog.setCancelable(false);
                    mProgressDialog.setMessage((String) msg.obj);
                    mProgressDialog.show();
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }

                break;

            case DISMISS_PROGRESS_DIALOG:
                try {
                    if ((mProgressDialog != null)
                            && mProgressDialog.isShowing())
                        mProgressDialog.dismiss();
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }

                break;

            case UPLOAD_VIDEO_END:
                try {
                    if(isSuccess){
                        Utils.showToast(TakeVideoActivity.this, "上传视频成功");

                    }else{
                        Utils.showToast(TakeVideoActivity.this, message);
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
                break;

            default:
                break;
            }
        }

    };

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 选择支持半透明模式,在有surfaceview的activity中使用。  
        getWindow().setFormat(PixelFormat.TRANSLUCENT); 

        setContentView(R.layout.take_video_activity);

        initViews();

        DisplayMetrics displayMetrics = new DisplayMetrics(); 
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
        screenWidth = displayMetrics.widthPixels;
        screenHight = displayMetrics.heightPixels;
        System.out.println("****screen width="+screenWidth+",screen hight="+screenHight);

//        initValues();
    }

    private void initViews(){
        mTextViewControlLight = (TextView) findViewById(R.id.textview_control_light);
        mTextViewControlCamera = (TextView) findViewById(R.id.textview_control_camera);
        mTextViewBack = (TextView) findViewById(R.id.textview_back);
        mTextViewChooseLocalVideo = (TextView) findViewById(R.id.textview_choose_local_video);
        mTextViewControlVideo = (TextView) findViewById(R.id.textview_video_control);
        mTextViewRecordPrompt = (TextView) findViewById(R.id.textview_record_prompt);
        mTextViewRecordTime = (TextView) findViewById(R.id.textview_record_time);

        surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);
        SurfaceHolder holder = surfaceview.getHolder();// 取得holder
        holder.addCallback(this); // holder加入回调接口
        // setType必须设置,要不出错.
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.setKeepScreenOn(true);

        mTextViewControlLight.setOnClickListener(this);
        mTextViewControlCamera.setOnClickListener(this);
        mTextViewBack.setOnClickListener(this);
        mTextViewChooseLocalVideo.setOnClickListener(this);
        mTextViewControlVideo.setOnClickListener(this);
    }

    private void initValues(){
        try {
            camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
            if(camera != null){
                Camera.Parameters parameters = camera.getParameters();
                parameters.setRotation(90);
                if(isFlashLight)
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                else
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(parameters);
                camera.setDisplayOrientation(90);//摄像图旋转90度
                camera.unlock();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
        /*try {
            camera = Camera.open();
            if(camera != null){
                Camera.Parameters parameters = camera.getParameters();
                parameters.setRotation(90);
                if(isFlashLight)
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                else
                    parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(parameters);
                camera.setDisplayOrientation(90);//摄像图旋转90度
                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }*/
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        try {
            if(camera != null){
                camera.stopPreview();
                camera.release();
                camera = null;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        surfaceview = null;
        surfaceHolder = null;
        mediarecorder = null;
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        try {
            Intent intent;
            switch (v.getId()) {
            case R.id.textview_back: //返回
                try {
                    if (mediarecorder != null) {
                        // 停止录制
                        mediarecorder.stop();
                        // 释放资源
                        mediarecorder.release();
                        mediarecorder = null;
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
                finish();
                break;

            case R.id.textview_control_light: //控制是否开启闪光灯
                if (isFlashLight) {
                    turnOffFlashLight();
                } else {
                    turnOnFlashLight();
                }
                break;

            case R.id.textview_control_camera: //控制是前置还是后置摄像头
                controlCamera();
                break;

            case R.id.textview_record_prompt: //摄像机如何放置的提示信息

                break;

            case R.id.textview_choose_local_video: //选择本地视频
                intent = new Intent(Intent.ACTION_GET_CONTENT);
                intent.setType("video/*");
                startActivityForResult(intent, REQUEST_CODE_GET_LOCAL_VIDEO);
                break;

            case R.id.textview_video_control: //控制是拍摄还是暂停录视频
                if(isRecording){//现在在录制,暂停录制
                    try {
                        if (mediarecorder != null) {
                            // 停止录制
                            mediarecorder.stop();
                            // 释放资源
                            mediarecorder.release();
                            mediarecorder = null;
                            File file4 = new File(VIDEO_RECORD_PATH+videoName);
//                          File file4 = new File(Environment.getExternalStorageDirectory().toString()+"/delete_red_bg.png");
                            if(file4.exists()){
                                /*AlertDialog.Builder builder = new AlertDialog.Builder(TakeVideoActivity.this);
                                builder.setTitle("属性");
                                builder.setItems(R.array.take_video_menu_option, new DialogInterface.OnClickListener() {

                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        // TODO Auto-generated method stub
                                        switch (which) {
                                        case 0: //预览

                                            break;

                                        case 1: //上传
                                            final Intent intent = new Intent();
                                            intent.setClass(TakeVideoActivity.this, UploadVideoActivity.class);
                                            intent.putExtra(UploadVideoActivity.INTENT_KEY_FILE_PATH, VIDEO_RECORD_PATH+videoName);
                                            startActivity(intent);
                                            break;

                                        case 2: //放弃

                                            break;

                                        default:
                                            break;
                                        }
                                    }
                                });
                                dialog = builder.create();
                                dialog.setCancelable(false);
                                dialog.show();*/
                                intent = new Intent();
                                intent.setClass(TakeVideoActivity.this, UploadVideoActivity.class);
                                intent.putExtra(UploadVideoActivity.INTENT_KEY_FILE_PATH, VIDEO_RECORD_PATH+videoName);
                                startActivity(intent);
                            }
                        }
                        mTextViewControlVideo.setBackgroundResource(R.drawable.tabbar_camera_recording);
                        showViewWhenRecordEnd();
                        isRecording = false;
                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                }else{//未录视频,开始录视频
                    mTextViewRecordPrompt.setVisibility(View.GONE);
                    videoName = getDateString()+".mp4";
                    mediarecorder = new MediaRecorder();// 创建mediarecorder对象
                    mediarecorder.setOrientationHint(90);////视频旋转90度
                    try {
                        if(camera != null){
                            camera.stopPreview();
                            camera.release();
                            camera = null;
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                        e.printStackTrace();
                    }
                    if(isFacingCamera)
                        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
                    else
                        camera = Camera.open();
                    if(camera != null){
                        Camera.Parameters parameters = camera.getParameters();
                        parameters.setRotation(90);
                        if(isFlashLight)
                            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                        else
                            parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                        camera.setParameters(parameters);
                        camera.setDisplayOrientation(90);//摄像图旋转90度
                        camera.unlock();
                        mediarecorder.setCamera(camera);
                    }

                    /*recordVideo();
                    isRecording = true;*/
                    /*if(camera != null){
                        camera.unlock();
                        mediarecorder.setCamera(camera);
                    }*/
                    // 设置录制视频源为Camera(相机)
                    mediarecorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);

                    mediarecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
                    CamcorderProfile cpHigh = CamcorderProfile.get(CamcorderProfile.QUALITY_LOW);
                    mediarecorder.setProfile(cpHigh);

                    // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
                    mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                    mediarecorder.setMaxDuration(180000); //Set max duration 300 sec
                    mediarecorder.setMaxFileSize(20000000); // Set max file size 20M
                    // 设置录制的视频编码h263 h264
                    mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
                    // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
//                   mediarecorder.setVideoSize(176, 144);
                    // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
//                  mediarecorder.setVideoFrameRate(24);
                    mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
                    // 设置视频文件输出的路径
                    File file = new File(VIDEO_RECORD_PATH+videoName);
                    if(!file.exists())
                        file.mkdirs();
                    file.delete();
                    mediarecorder.setOutputFile(VIDEO_RECORD_PATH+videoName);
                    try {
                        // 准备录制
                        mediarecorder.prepare();
                        // 开始录制
                        mediarecorder.start();
                        isRecording = true;
                        mTextViewControlVideo.setBackgroundResource(R.drawable.tabbar_camera_stop);
                        hideViewWhenRecording();
                        recordRemainTime = DEFAULT_RECORD_TIME;
                        timer.schedule(task, 1000, 1000);
                    } catch (IllegalStateException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                break;



            default:
                break;
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    private void recordVideo(){
        try {
             mediarecorder = new MediaRecorder();// 创建mediarecorder对象 
             // 设置录制视频源为Camera(相机) 
             mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
             // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4 
             mediarecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
             // 设置录制的视频编码h263 h264 
             mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); 
             // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错 
             mediarecorder.setVideoSize(176, 144); 
             // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错 
             mediarecorder.setVideoFrameRate(20); 
             mediarecorder.setPreviewDisplay(surfaceHolder.getSurface()); 
             // 设置视频文件输出的路径 
             mediarecorder.setOutputFile(VIDEO_RECORD_PATH+videoName); 
             try { 
                 // 准备录制 
                 mediarecorder.prepare(); 
                 // 开始录制 
                 mediarecorder.start(); 
             } catch (IllegalStateException e) { 
                 // TODO Auto-generated catch block 
                 e.printStackTrace(); 
             } catch (IOException e) { 
                 // TODO Auto-generated catch block 
                 e.printStackTrace(); 
             } 
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    /**
     * 将当前的时间转换成为年月日时分秒毫秒 的格式
     * @return
     */
    private String getDateString(){
        Date current = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String s = sdf.format(current);
        return s; 
    }

    /**
     * 调整camera是指不会选择90度
     * @param activity
     * @param cameraId
     * @param camera
     */
    public static void setCameraDisplayOrientation ( Activity activity ,
              int cameraId , android.hardware.Camera camera ) {
        try {
            android.hardware.Camera.CameraInfo info =
                      new android.hardware.Camera.CameraInfo();
             android.hardware.Camera.getCameraInfo( cameraId , info);
              int rotation = activity.getWindowManager ().getDefaultDisplay ().getRotation ();
              int degrees = 0 ;
              switch ( rotation ) {
                  case Surface.ROTATION_0 : degrees = 0 ; break ;
                  case Surface.ROTATION_90 : degrees = 90 ; break ;
                  case Surface.ROTATION_180 : degrees = 180 ; break ;
                  case Surface.ROTATION_270 : degrees = 270 ; break ;
              }

              int result ;
              if ( info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT ) {
                 result = ( info.orientation + degrees ) % 360 ;
                 result = ( 360 - result ) % 360 ;   // compensate the mirror
              } else {   // back-facing
                 result = ( info.orientation - degrees + 360 ) % 360 ;
              }
             camera.setDisplayOrientation( result );
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

    /**
     * 设置开启或者关闭闪光灯
     * @param isEnable
     */
    private void setFlashlightEnabled(boolean isEnable) {
        try {
            Method method = Class.forName("android.os.ServiceManager")
                    .getMethod("getService", String.class);
            IBinder binder = (IBinder) method.invoke(null,new Object[] { "hardware" });
            IHardwareService localhardwareservice = IHardwareService.Stub
                    .asInterface(binder);
            localhardwareservice.setFlashlightEnabled(isEnable);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 打开闪光灯
     */
    private void turnOnFlashLight(){
        try {
            if(camera == null)
                camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
            Camera.Parameters mParameters;  
            mParameters = camera.getParameters();  
            mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);  
            camera.setParameters(mParameters);  
            isFlashLight = true;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    /**
     * 关闭闪光灯
     */
    private void turnOffFlashLight(){
        try {
            Camera.Parameters mParameters;
            camera.reconnect();
            mParameters = camera.getParameters();  
            mParameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);  
            camera.setParameters(mParameters);  
//            camera.release(); 
            isFlashLight = false;
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
//      super.onBackPressed();

    }

    /**
     * 控制前置或后置摄像头的切换
     * http://www.cnblogs.com/stay/archive/2011/06/24/2089129.html
     */
    private void controlCamera(){
        try {
            try {
                if(camera != null){
                    camera.stopPreview();
                    camera.release();
                    camera = null;
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD){
                //2.3以上的手机
                Utils.logDebug("*****camera number="+Camera.getNumberOfCameras());
                for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
                    CameraInfo info = new CameraInfo();
                    Camera.getCameraInfo(i, info);
                    Utils.logDebug("*****camera info="+info.facing);
                    if (!isFacingCamera && info.facing == CameraInfo.CAMERA_FACING_FRONT) {// 这就是前置摄像头,亲。
                        camera = Camera.open(i);
                        isFacingCamera = true;
                        break;
                    }else if(isFacingCamera && info.facing == CameraInfo.CAMERA_FACING_BACK){
//                      camera = Camera.open(i);
                        camera = Camera.open();
                        isFacingCamera = false;
                        break;
                    }
                }
            }else{
                //2.3及其以下的版本

            }
            if (camera == null) {
                camera = Camera.open();
            }
            try {
                if(camera != null){
                    Camera.Parameters parameters = camera.getParameters();
                    parameters.setRotation(90);
                    if(isFlashLight)
                        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                    else
                        parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                    camera.setParameters(parameters);
                    camera.setDisplayOrientation(90);//摄像图旋转90度
                    camera.setPreviewDisplay(surfaceHolder);
                    camera.startPreview();
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    }


    /**
     * 上传视频线程
     * @author Xiang Yong
     *
     */
    private class UploadVideoThread extends Thread{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            super.run();

            Message msg = new Message();
            msg.what = SHOW_PROGRESS_DIALOG;
            msg.obj = "视频上传中...";
            myHandler.sendMessage(msg);

            isSuccess = false;

            String videoUrl = "";
            try {
                String result = UploadFileThread.uploadFile("http://api.12fou.net/api.php/user/upvideo", VIDEO_RECORD_PATH+videoName, null);
                if(result != null && !"".equals(result)){
                    JSONObject jsonObject = new JSONObject(result);
                    String statu = jsonObject.getString("result");
                    if("true".equalsIgnoreCase(statu)){
                        videoUrl = jsonObject.getString("video");
                    }
                }

            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }

            myHandler.sendEmptyMessage(UPLOAD_VIDEO_END);

            myHandler.sendEmptyMessage(DISMISS_PROGRESS_DIALOG);

        }

    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        try {
            if(resultCode == RESULT_OK){
                switch (requestCode) {
                case REQUEST_CODE_GET_LOCAL_VIDEO: //获取本地视频
                    Uri uri = data.getData();
                    String path = getPath(uri);
                    Utils.logDebug("***on activity result data="+data.getData()+",path="+path);
                    if(path != null && !"".equals(path)){
                        Intent intent = new Intent();
                        intent.setClass(TakeVideoActivity.this, UploadVideoActivity.class);
                        intent.putExtra(UploadVideoActivity.INTENT_KEY_FILE_PATH, path);
                        startActivity(intent);
                    }else{
                        Utils.showToast(TakeVideoActivity.this, "文件不存在");
                    }
                    break;

                default:
                    break;
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }


    public String getPath(Uri uri) {
        try {
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            startManagingCursor(cursor);
            int column_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return "";
    }

    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                runOnUiThread(new Runnable() {
                    public void run() {
                        recordRemainTime--;
                        mTextViewRecordTime.setText(Utils.formatSecondToMMSS(recordRemainTime));
                        if(recordRemainTime < 0){
                            timer.cancel();
                            mTextViewControlVideo.performClick();
                        }
                    }
                });
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    };

    private void hideViewWhenRecording(){
        try {
            mTextViewChooseLocalVideo.setVisibility(View.INVISIBLE);
            mTextViewControlLight.setVisibility(View.GONE);
            mTextViewControlCamera.setVisibility(View.GONE);
            mTextViewRecordTime.setVisibility(View.VISIBLE);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }

    private void showViewWhenRecordEnd(){
        try {
            mTextViewChooseLocalVideo.setVisibility(View.VISIBLE);
            mTextViewControlLight.setVisibility(View.VISIBLE);
            mTextViewControlCamera.setVisibility(View.VISIBLE);
            mTextViewRecordTime.setVisibility(View.GONE);
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}
4

1 回答 1

2

在调用 mediarecorder.setProfile() 之后调用 mediarecorder.setOutputFormat()。setProfile() 还设置输出格式。这似乎导致了你的问题。

所以:要么使用 setProfile()。或者自己设置所有参数(OutputFormat、Size 等)。

于 2013-05-28T08:00:37.043 回答