首先,我是 Android 开发新手,所以请耐心等待。
我将从用户界面开始,我有一个按钮,一旦您点击它,就会启动一个活动以获取结果。
public class GUIActivity extends Activity
@Override
public void onClick(....){
Intent intent = new Intent(getApplicationContext(), GetImageActivity.class);
intent.putExtra("action", FROM_CAMERA);
startActivityForResult(intent, GET_IMAGE);
}
@Override
onActivityResult(int requestCode, int resultCode, Intent data){
Log(TAG, "onActivityResult");
//handle result
}
}
The GetImageActivity
类是另外两个活动的包装,一个是从相机捕获图像,另一个是从图库中获取图像。它返回所选图像的 Uri 对象。
public class GetImageActivity extends Activity{
private Uri mediaUri;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Bundle extras = getIntent().getExtras();
int action = extras.getInt("action");
Log.d(TAG, "onCreate");
switch(action){
case FROM_CAMERA:
mediaUri = Uri.fromFile(new File(....));
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, mediaUri);
Log.d(TAG, "Calling camera activity"
startActivityForResult(intent, action);
break;
case FROM GALLERY:
//...
}
}
@Override
onActivityResult(int requestCode, int resultCode, Intent data){
Log.d(TAG, "onActivityResult");
switch(requestCode){
case FROM_CAMERA:
if(resultCode == Activity.RESULT_OK){
Intent data = new Intent();
data.putExtra("uri", mediaUri);
setResult(Activity.RESULT_OK, data);
finish();
}else{
Log.e(TAG, "Camera activity failed!");
setResult(Activity.RESULT_CANCELED);
finish();
}
break;
case FROM_GALLERY:
//...
}
}
}
这是用户单击按钮时预计会发生的情况:
- 相机活动应该开始。
- 一旦用户拍照,它应该将其 URI 发送回 GUI 类。
有时(通常有 50% 的机会)它会按预期工作,但其他时候会发生这种情况:
- 相机活动开始。
- 用户拍照。
- 相机活动再次开始。
- 用户可以拍摄另一张照片或返回。
- 无论哪种情况,返回 GUI 类的 URI 都不存在。
我添加了几行调试日志行来跟踪事件的顺序。当我出现不良行为时,这是我得到的输出:
- GetImageActivity - onCreate
- GetImageActivity - 调用相机活动
相机打开,当我拍完照片后,它会说:
- GetImageActivity - onCreate(再次)
- GetImageActivity - 调用相机活动
- 获取图像活动 - onActivityResult
相机第二次打开。用户拍摄另一张照片并:
- 获取图像活动 - onActivityResult
- GUIActivity - onActivityResult
所以我的问题是......什么可能导致GetImageActivity
被叫两次?