В моем приложении есть возможность делать снимки с камеры. Мой FragmentActivity
работает только в портретном режиме. В моем Fragment
, когда пользователь нажимает кнопку, я запускаю приложение камеры, используя:
private void pickFromCamera() {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
try {
File file = new File(createImageFile());
if(!file.exists()) {
file.createNewFile();
}
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
} catch (Exception e) {
e.printStackTrace();
}
startActivityForResult( intent , ACTION_REQUEST_CAMERA );
}
и в onActivityResult
фрагмента я делаю это:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
super.onActivityResult(requestCode, resultCode, data);
if ( resultCode == Activity.RESULT_OK ) {
switch ( requestCode ) {
case ACTION_REQUEST_GALLERY:
.....
case ACTION_REQUEST_CAMERA:
if(cameraImageFilePath == null) {
// show error message and return
}
addImage(cameraImageFilePath);
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
но я столкнулся со странной проблемой здесь. На телефонах работает нормально. На планшете это работает, когда снимок сделан в ландшафтном режиме, а кнопка сохранения нажата в приложении камеры. Но если я сфотографирую в портретном режиме и нажму кнопку «Сохранить», мое приложение вылетит. Вот вывод logcat:
09-18 17:00:09.960: E/AndroidRuntime(13701): FATAL EXCEPTION: main
09-18 17:00:09.960: E/AndroidRuntime(13701): java.lang.RuntimeException: Unable to resume activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=null} to activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2291)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2319)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1839)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3191)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.access$600(ActivityThread.java:122)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1031)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.os.Handler.dispatchMessage(Handler.java:99)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.os.Looper.loop(Looper.java:132)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.main(ActivityThread.java:4126)
09-18 17:00:09.960: E/AndroidRuntime(13701): at java.lang.reflect.Method.invokeNative(Native Method)
09-18 17:00:09.960: E/AndroidRuntime(13701): at java.lang.reflect.Method.invoke(Method.java:491)
09-18 17:00:09.960: E/AndroidRuntime(13701): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
09-18 17:00:09.960: E/AndroidRuntime(13701): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
09-18 17:00:09.960: E/AndroidRuntime(13701): at dalvik.system.NativeStart.main(Native Method)
09-18 17:00:09.960: E/AndroidRuntime(13701): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=196708, result=-1, data=null} to activity {com.dstudios.napa/com.dstudios.napa.HomeActivity}: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.deliverResults(ActivityThread.java:2821)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2278)
09-18 17:00:09.960: E/AndroidRuntime(13701): ... 13 more
09-18 17:00:09.960: E/AndroidRuntime(13701): Caused by: java.lang.NullPointerException
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:152)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.Activity.dispatchActivityResult(Activity.java:4581)
09-18 17:00:09.960: E/AndroidRuntime(13701): at android.app.ActivityThread.deliverResults(ActivityThread.java:2817)
Затем я добавил метод onActivityResult в FragmentActivity и окружил супервызов блоком try catch следующим образом:
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
// TODO Auto-generated method stub
try {
super.onActivityResult(arg0, arg1, arg2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Теперь происходит то, что исключение перехватывается, и сбой не происходит, но моя деятельность перезапускается. Я знаю, что есть способ сохранить состояние активности, используя onSavedInstanceState, а затем... но моя активность очень сложная, ее нельзя восстановить до прежнего состояния, потому что это основная активность, и загружается много фрагментов и т. д. .. Есть ли обходной путь для этого? Я использую 10-дюймовый планшет Samsung с Android HoneyComb 3.2. Редактировать: Кроме того, я добавил android:configChanges="orientation"
в манифест.