Проверить, поддерживается ли setOrientation()?
Я работаю над приложением, которое записывает видео. Это в основном завершено, но у меня странная проблема со старым Samsung Galaxy S1 (австралийская модель) под управлением 2.3.3 (API 10).
Когда я пытаюсь установить ориентацию через mMediaRecorder.setOrientationHint(90);
это вызывает исключение:
05-28 10:46:53.628: E/AndroidRuntime(6373): java.lang.RuntimeException: setParameter failed.
вместе с:
05-28 10:46:53.593: E/MediaRecorder(6373): setParameters(video-param-rotation-angle-degrees=90) failed: -2147483648
Что странно, так это то, что другие устройства, работающие на 3.2.2 (API 10), работают отлично, это только Samsung Galaxy S1, который, похоже, имеет нестандартную ОС, которая не поддерживает setOrientation(), как ожидалось.
Я в настоящее время использую try {} catch() {}
вокруг setOrientation()
, Это не элегантный способ справиться с этим правом? Лучше ли предварительно проверить, если setOrientation()
поддерживается устройством ТО, попробуйте настройку? Я не могу найти способ проверить эту поддержку.
Я проверил ( http://developer.android.com/reference/android/media/MediaRecorder.html) и не могу найти помощь, кроме API уровня 9, который я уже использую. т. е. пытаться установить ориентацию, только если уровень API 9 или выше
Вот целое исключение:
05-28 10:46:53.593: E/MediaRecorder(6373): setParameters(video-param-rotation-angle-degrees=90) failed: -2147483648
05-28 10:46:53.593: W/dalvikvm(6373): threadid=1: thread exiting with uncaught exception (group=0x40015578)
05-28 10:46:53.628: E/AndroidRuntime(6373): FATAL EXCEPTION: main
05-28 10:46:53.628: E/AndroidRuntime(6373): java.lang.RuntimeException: setParameter failed.
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.media.MediaRecorder.setParameter(Native Method)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.media.MediaRecorder.setOrientationHint(MediaRecorder.java:341)
05-28 10:46:53.628: E/AndroidRuntime(6373): at com.on3x.emergency.Recorder.prepareVideoRecorder(Recorder.java:223)
05-28 10:46:53.628: E/AndroidRuntime(6373): at com.on3x.emergency.Recorder.startRecording(Recorder.java:104)
05-28 10:46:53.628: E/AndroidRuntime(6373): at com.on3x.emergency.GUI.RecordActivity$1.onClick(RecordActivity.java:111)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.view.View.performClick(View.java:2538)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.view.View$PerformClick.run(View.java:9152)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.os.Handler.handleCallback(Handler.java:587)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.os.Handler.dispatchMessage(Handler.java:92)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.os.Looper.loop(Looper.java:123)
05-28 10:46:53.628: E/AndroidRuntime(6373): at android.app.ActivityThread.main(ActivityThread.java:3687)
05-28 10:46:53.628: E/AndroidRuntime(6373): at java.lang.reflect.Method.invokeNative(Native Method)
05-28 10:46:53.628: E/AndroidRuntime(6373): at java.lang.reflect.Method.invoke(Method.java:507)
05-28 10:46:53.628: E/AndroidRuntime(6373): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
05-28 10:46:53.628: E/AndroidRuntime(6373): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
05-28 10:46:53.628: E/AndroidRuntime(6373): at dalvik.system.NativeStart.main(Native Method)
А вот фактический код набора:
...
if (android.os.Build.VERSION.SDK_INT>=9) {
// attempt to rotate the video 90 degrees.
try {
mMediaRecorder.setOrientationHint(90);
Utils.logLine("orientation rotated 90", this, Utils.LOG_TYPE_DEBUG);
} catch (Exception e) {
Utils.logLine("error trying setOrientationHint"+ e.getMessage(), this, Utils.LOG_TYPE_ERROR, e);
}
} else {
Utils.logLine("orientation set skipped ", this, Utils.LOG_TYPE_DEBUG);
}
...
1 ответ
Если вы уверены, что с помощью этой команды можно настроить только ограниченное количество устройств, вы можете выполнить упреждающую проверку, проверив тип устройства. Иначе try
catch
блок - единственный способ справиться с этим.