在我的应用程序中,可以选择从相机拍摄照片。我的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)
然后我在FragmentActivity中添加了onActivityResult方法,并用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保存活动的状态,然后......但是我的活动非常复杂,它无法恢复到以前的状态bcz它是主要的活动,很多片段被加载等等。 ..有什么解决方法吗?
我正在使用拥有Android HoneyComb 3.2的三星10英寸平板电脑。
编辑:
另外,我在清单中添加了android:configChanges="orientation"
。
答案 0 :(得分:1)
不,你无法保证你的活动一旦失去屏幕就不会被销毁。由于Camera应用程序请求Landscape而切换方向时确实会发生这种情况,但您无法掌握情况。用户可以选择再运行一个后台服务,或使用自定义IMAGE_CAPTURE提供程序,这将提供所有卡。另请参阅https://stackoverflow.com/a/20783313/192373。
如果您不能使用onSaveInstanceState(Bundle)
(或者即使可以),如果您提供应用内相机,尤其是带有片段的平板电脑,则对您的用户来说可能会有更好的体验。< / p>
答案 1 :(得分:1)
它不会破坏变量。但经过这么多天的研究LOL,我得到了一个解决我错误的方法。当我调试调试器时,方法会在拍照后调用它。
的onCreate() onActivityResult() onCeate() 的onResume() 只需将以下几行放在清单中就可以解决问题。这是由于相机配置的变化而发生的。窗口软输入模式。
<activity
android:name="packageName.Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" >