Sto scrivendo un'app per fotocamere e sto avendo un problema con l'S3. Ogni volta che inizio a registrare, il display va in spazzatura (vedi screenshot sotto). Poi, quando mi fermo registrazione ottengo un'eccezione:La visualizzazione video è confusa durante la registrazione su Galaxy S3
10-02 13:36:31.647: E/MediaRecorder(24283): stop failed: -1007
10-02 13:36:31.647: D/AndroidRuntime(24283): Shutting down VM
10-02 13:36:31.647: W/dalvikvm(24283): threadid=1: thread exiting with uncaught exception (group=0x40c49a68)
10-02 13:36:31.647: E/AndroidRuntime(24283): FATAL EXCEPTION: main
10-02 13:36:31.647: E/AndroidRuntime(24283): java.lang.RuntimeException: stop failed.
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.native_stop(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.media.MediaRecorder.stop(MediaRecorder.java:742)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.stopRecording(NewCameraActivity.java:178)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.toggleRecording(NewCameraActivity.java:189)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.myapp.android.ui.camera.NewCameraActivity.onClick(NewCameraActivity.java:97)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View.performClick(View.java:3565)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.view.View$PerformClick.run(View.java:14165)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.handleCallback(Handler.java:605)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Handler.dispatchMessage(Handler.java:92)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.os.Looper.loop(Looper.java:137)
10-02 13:36:31.647: E/AndroidRuntime(24283): at android.app.ActivityThread.main(ActivityThread.java:4514)
10-02 13:36:31.647: E/AndroidRuntime(24283): at java.lang.reflect.Method.invokeNative(Native Method)
10-02 13:36:31.647: E/AndroidRuntime(24283): at java.lang.reflect.Method.invoke(Method.java:511)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
10-02 13:36:31.647: E/AndroidRuntime(24283): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
10-02 13:36:31.647: E/AndroidRuntime(24283): at dalvik.system.NativeStart.main(Native Method)
ho testato la mia app sul Galaxy Nexus (4.1), Galaxy S2, Nexus S e Galaxy Tab 10.1. Tutti funzionano bene. Ho seguito development guidelines for video recording. Non capisco perché questo dispositivo sia così diverso dagli altri. Ecco cosa vedo sul dispositivo. La prima immagine è prima che inizi la registrazione. La seconda immagine è ciò che accade una volta che inizio la registrazione.
Ecco il mio codice per la preparazione e l'avvio l'oggetto MediaRecorder
:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.camera_action_ImageView:
int mode = getMode();
if (mode == MODE_PHOTO) {
focusThenTakePicture();
}
else if (mode == MODE_VIDEO) {
toggleRecording();
}
break;
}
}
private void startRecording() {
if (prepareRecorder()) {
getRecorder().start();
setRecording(true);
}
}
@TargetApi(9)
private boolean prepareRecorder() {
Camera camera = getCamera();
camera.unlock();
MediaRecorder recorder = new MediaRecorder();
setRecorder(recorder);
recorder.setCamera(camera);
recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
CamcorderProfile profile;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) {
profile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);
}
else {
profile = CamcorderProfile.get(getCameraId(), CamcorderProfile.QUALITY_HIGH);
}
recorder.setProfile(profile);
File outputFile = LocalMediaUtil.getOutputMediaFile(LocalMediaUtil.MEDIA_TYPE_VIDEO);
setRecorderOutputFile(outputFile);
recorder.setOutputFile(outputFile.toString());
recorder.setPreviewDisplay(getPreview().getHolder().getSurface());
try {
recorder.prepare();
}
catch (Exception e) {
camera.lock();
setRecorder(null);
return false;
}
return true;
}
private void stopRecording() {
MediaRecorder recorder = getRecorder();
recorder.stop();
releaseRecorder();
setRecording(false);
LocalMediaUtil.scanMedia(this, getRecorderOutputFile().toString(), 90);
setRecorderOutputFile(null);
}
private void toggleRecording() {
if (isRecording()) {
stopRecording();
}
else {
startRecording();
}
}
private void releaseRecorder() {
MediaRecorder recorder = getRecorder();
if (recorder != null) {
recorder.reset();
recorder.release();
setRecorder(null);
getCamera().lock();
}
}
Edit: Quindi questo ha qualcosa a che fare con la CamcorderProfile
fase di impostazione. Lo cambio in CamcorderProfile.QUALITY_LOW
e ha funzionato bene. Quindi, come posso avere un video ad alta risoluzione senza output confuso?
Edit2: Così con CamcorderProfile.QUALITY_LOW
impostato, non ottengo errori utilizzando il videoregistratore. Tuttavia, il video di output sembra molto simile allo screenshot confuso pubblicato sopra. Quindi cosa dà?
venderlo come iOS6-map-come fotocamera app – axis
Google bug report: http://code.google.com/p/android/issues/detail?id=38139&thanks=38139&ts=1349306102 –
@JasonRobinson Perché hanno chiuso il bug report? Avrei potuto almeno indicarti un'altra direzione o qualcosa del genere. È solo pigro. – ShadowScripter