我花了一天时间处理这个问题。一开始我有很多泄漏,我解决了它们,但仍然不满意结果
该任务很简单,可以启动相机,拍照,将其保存到指定的路径,并在成功拍摄照片后获得活动结果。
看起来很简单。
让我来描述我的执行顺序
我有项目列表,当我点击任何项目全屏对话框出现时,通过回调活动通知用户想要拍照并按意图开始相机活动,拍摄照片并返回调用活动的结果。
有一些代码片段。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("ON ACTIVITY CREATE !!");
setContentView(R.layout.my_layout);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("ON ACTIVITY RESULT !!");
if (requestCode == PHOTO_REQUEST) {
if (resultCode == RESULT_OK) {
mAfterTakingPhoto = true;
mPreferences.edit().putBoolean("after_photo", mAfterTakingPhoto).apply();
}
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e("ON RESTORE INSTANCE");
mImagePath = savedInstanceState.getString("image_path");
Log.e("RESTORED VALUES " + mImagePath + " " + mAfterTakingPhoto);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e("ON SAVE INSTANCE");
outState.putString("image_path", mImagePath);
Log.e("SAVING VALUES " + mImagePath + " " + mAfterTakingPhoto);
}
@Override
protected void onResume() {
super.onResume();
Log.e("ON RESUME !!!" + " mAfterTaking a photo " + mAfterTakingPhoto);
mAfterTakingPhoto = mPreferences.getBoolean("after_photo", false);
}
@Override
protected void onDestroy() {
Log.e("ON ACTIVITY DESTROY");
// Do some cleanup stuff
super.onDestroy();
}
开始拍摄照片(对话回调)
@Override
public void onTakePhotoRequest() {
mImagePath = PHOTO_DIR.getAbsolutePath() + File.separator + filename;
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mImagePath));
startActivityForResult(cameraIntent, PHOTO_REQUEST);
}
有时候它很有效,当调用活动是活着的时候,但当它被破坏时会发生一些疯狂的事情。
以下是成功执行的日志。
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
com.example.app E/Log﹕ --ON SAVE INSTANCE
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --SAVING VALUES /mnt/sdcard/Pictures/photos/08_17_2015 02_28_02.jpg 32 false
com.example.app E/Log﹕ --ON ACTIVITY RESULT !!
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo true
这是奇怪的执行日志。
com.example.app E/Log﹕ --ON ACTIVITY CREATE !!
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --ON SAVE INSTANCE
com.example.app E/Log﹕ --SAVING VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON ACTIVITY DESTROY
com.example.app E/Log﹕ --ON ACTIVITY CREATE !!
com.example.app E/Log﹕ --ON RESTORE INSTANCE
com.example.app E/Log﹕ --RESTORED VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
com.example.app E/Log﹕ --ON ACTIVITY RESULT !!
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo true
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --List item count is : 60
com.example.app E/Log﹕ --Adapter item count is : 60
com.example.app E/Log﹕ --ON SAVE INSTANCE
com.example.app E/Log﹕ --SAVING VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON ACTIVITY DESTROY
com.example.app E/Log﹕ --ON ACTIVITY CREATE !!
com.example.app E/Log﹕ --ON RESTORE INSTANCE
com.example.app E/Log﹕ --RESTORED VALUES /storage/emulated/0/Pictures/photos/08_17_2015 02_45_18.jpg 10 false
com.example.app E/Log﹕ --ON RESUME !!! mAfterTaking a photo false
正如你所看到的,活动被破坏而不是再次创建,恢复,onActivityResult
等等,然后突然它被再次销毁并重新创建,但没有onActivityResult
回调,它使屏幕变黑几秒钟
此外,列表似乎重新创建了三次然后崩溃
有趣的事情,活动在拍照时不在背景中被破坏,但是在照片按钮点击(照相机活动正在关闭)。
我已经尝试了所有我知道的东西,我已禁用所有第三方库,并使此活动继承SherlockFragmentActivity
类。所以问题就在这里,但我不知道,几乎尝试了所有事情
请帮助解决这个问题,这里有什么问题或者这个错误。
我不知道该怎么做。
P.S。 BTW我正在使用Genymotion Emulator定制手机,我试过另一款索尼Xperia平板电脑没有这样的行为。