我已阅读有关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回答之后,我编辑了我的代码,现在捕获异常,没有异常被捕获。
另外,我想指出一些有趣的事情:我正在尝试使用API15模拟器,这种情况发生了:
mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface());
(mediaRecorder.setOutputFile()
之后)时,我会START FAILED -19
START FAILED -2147483648
但在我的三星中,它仍能正常工作......
NEW EDIT (01/01/2014)新年快乐!!
我尝试使用三星Galaxy S2 Plus(Android 4.1.2)并且它无法正常工作,但是在我的三星Galaxy S3 Mini上它(也是Android 4.1.2)......我变得疯狂。 / p>
答案 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;
}