首先,我是Android開發新手,請耐心等待。在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
}
}
的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都不存在。
我已經添加了一些調試日誌行來跟蹤事件的順序。當我得到的不良行爲,這是輸出I得到:
- GetImageActivity - 的onCreate
- GetImageActivity - 呼叫相機活動
相機打開,一旦我拍攝的照片,它說:
- GetImageActivity - 的onCreate(再次)
- GetImageActivity - 呼叫相機活動
- GetImageActivity - onActivityResult
相機第二次打開。用戶拍攝另一張照片和:
- GetImageActivity - onActivityResult
- GUIActivity - onActivityResult
所以我的問題是,有什麼能引起GetImageActivity
被調用兩次?
我將修改代碼,使其更清晰。它在'GetImageActivity'類中說//處理結果,我實際上調用'setResult()'。需要注意的是,即使在第一次調用onActivityResult()方法之前,該活動也會再次創建。 –