MediaRecorder在某些设备上启动失败(启动失败:-2147483648和-19)

时间:2013-12-31 06:54:51

标签: android camera mediarecorder video-recording

我已阅读有关MediaRecorder and followed the GUIDES on Android的所有内容。

好吧,它至少在API 8及更高版本上工作得很好,但我的最小SDK是14,所以我应该更好。

在我的设备上,三星Galaxy S3 Mini工作正常。其他一些配有Ice Cream Sandwitch的设备,但有些设备不是。他们崩溃了:

mediaRecorder.start()

我创建了一个录制视频的服务,这是我的代码(我在每个阶段所做的指导):

    @Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {

    //OPEN CAMERA
    int ncamara=0;
    qcamara=0;
    if(android.os.Build.VERSION.SDK_INT<9)
        camera = Camera.open();                                       
    else{
    try {
        ncamara = Camera.getNumberOfCameras();
        if (f.leer("camara", context).equals("frontal"))
            qcamara=10;
        else qcamara=20;
    } catch (Exception e) {}
    if (ncamara>=2 && qcamara == 10)
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);
    else if (ncamara>=2 && qcamara == 20)
        camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
    else
        camera = Camera.open();
    }
                                                                        //
    try {
        camera.setPreviewDisplay(surfaceHolder);
        camera.startPreview();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    //UNLOCK CAMERA
    camera.unlock();    
    mediaRecorder = new MediaRecorder();

    mediaRecorder.setCamera(camera);                                    //setCamera
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

                                                                        //setProfile
    if (f.leer("calidad", context).equals("alta") && qcamara !=10)
        mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_HIGH));
    else if (f.leer("calidad", context).equals("alta") && qcamara == 10)
        mediaRecorder.setProfile(CamcorderProfile.get(1, CamcorderProfile.QUALITY_LOW));
    else if (f.leer("calidad", context).equals("baja") && qcamara != 10)
    mediaRecorder.setProfile(CamcorderProfile.get(0, CamcorderProfile.QUALITY_LOW));
    else
        mediaRecorder.setProfile(CamcorderProfile.get(1, CamcorderProfile.QUALITY_LOW));

    mediaRecorder.setVideoSize(320, 240);   

    if (CameraRecorder.duracion>0)                                      // -- duration
    mediaRecorder.setMaxDuration(CameraRecorder.duracion * 1000);


    File dataDirectory = Environment.getExternalStorageDirectory();
    File fileDir = new File(dataDirectory, "/weddingR/");
    fileDir.mkdirs();
    mediaRecorder.setOutputFile(                                        //setOutputFile
            Environment.getExternalStorageDirectory()+"/weddingR/"+
            DateFormat.format("yyyy-MM-dd---kk-mm-ss", new Date().getTime())+
            ".mp4"
    );
    mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());  
    if (qcamara==10){ // FRONT CAMERA
        try { mediaRecorder.setOrientationHint(270); } catch (Exception e) {}
    } else { // BACK CAMERA
        try { mediaRecorder.setOrientationHint(90); } catch (Exception e) {}
    }
    try { 
        mediaRecorder.prepare();
        } catch (Exception e) {}
    mediaRecorder.setOnInfoListener(new OnInfoListener(){

        @Override
        public void onInfo(MediaRecorder mr, int what, int extra) {
            Log.d("INFO_ON", what + " " + extra + " ");
            nascosto=true;
            stopSelf();
        }
    });

    mediaRecorder.start();
}

例如,如果我设置mediaRecorder.setVideoFrameRate(20),它会在每台设备上崩溃。

我之前最常问的是某些设备工作正常但不是其他设备(例如,带有API 17或18的EMULATOR工作......带有API 15的设备可以正常工作,但EMULATOR API 15不起作用......)< / p>

我做错了什么?

提前致谢。


ANDROID MANIFEST PERMISSIONS

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

修改

在@Melquiades回答之后,我编辑了我的代码,现在捕获异常,没有异常被捕获。

另外,我想指出一些有趣的事情:我正在尝试使用API​​15模拟器,这种情况发生了:

  1. 当我设置mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());mediaRecorder.setOutputFile()之后)时,我会START FAILED -19
  2. 当我没有设置它时,我得到START FAILED -2147483648
  3. 但在我的三星中,它仍能正常工作......


    NEW EDIT (01/01/2014)新年快乐!!

    我尝试使用三星Galaxy S2 Plus(Android 4.1.2)并且它无法正常工作,但是在我的三星Galaxy S3 Mini上它(也是Android 4.1.2)......我变得疯狂。 / p>

1 个答案:

答案 0 :(得分:0)

调用mediaRecorder.prepare()时,你没有对捕获的异常做任何事情:

try { 
    mediaRecorder.prepare();
} catch (Exception e) { //empty??? }

不要做。这是一个不好的做法。如果有任何例外,你就不会知道。

在{}中放置一个Log.d(),看看在prepare()期间发生了什么。用您正在捕捉的所有例外情况来做。

从该指南:

// Step 6: Prepare configured MediaRecorder
try {
    mMediaRecorder.prepare();
} catch (IllegalStateException e) {
    Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
    releaseMediaRecorder();
    return false;
} catch (IOException e) {
    Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
    releaseMediaRecorder();
    return false;
}