問題: アクティビティ 1 には画像へのパスがあり、アクティビティ 1 がインテントを介して画像ファイルを送信している場合、アクティビティ 2 には別の画像への別のパスがあります。
コード アクティビティ 1:
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
imageFile = new File(outputFileUri.getPath());
} else if (requestCode == UPLOAD_REQUEST && resultCode == RESULT_OK) {
//Get the data back from the request in URI format (Path to file).
selectedImage = data.getData();
imageFile = new File(getRealPathFromURI(selectedImage));
} else if (resultCode == RESULT_CANCELED) {
return;
}
Intent menuIntent = new Intent(getApplicationContext(), MenuActivity.class);
menuIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
menuIntent.putExtra("username", username);
menuIntent.putExtra("latitude", latitude);
menuIntent.putExtra("longitude", longitude);
menuIntent.putExtra("imageFile", imageFile);
Log.d("ACTIVITY1 image", imageFile.getPath());//THIS LOG BELOW!!
try{
startActivity(menuIntent);
finish();
}
catch(ActivityNotFoundException e){
e.printStackTrace();
menuIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
startActivity(menuIntent);
finish();
}
}
Intent で try catch を行う理由は、このアクティビティがこのアクティビティとは別の用途に使用されているためです。コード アクティビティ 2:
...
@Override
public void onStart() {
super.onStart();
Bundle extras = getIntent().getExtras();
if (extras != null) {
username = extras.getString("username");
latitude = extras.getDouble("latitude");
longitude = extras.getDouble("longitude");
if(extras.get("imageFile") != null){
File imageFile = (File) extras.get("imageFile");
Log.d("ACTIVITY2 image", imageFile.getPath());//THIS LOG BELOW!!
toastContext = getApplicationContext();
params = new ArrayList();
params.add("upload");
params.add(username);
params.add(imageFile);
uploadImage = new UserFunctions(this);
uploadImage.execute(params);
}
}
}
POST 経由でファイルをサーバーに送信する ASyncTask があり、JSON が返されて通知が形成され、応答に従って更新されます。問題ありません。ユーザーがサインインしている場合はアクティビティ 2 が読み込まれ、サインインしていない場合は、後でユーザーがサインインしたときにアクティビティ 2 が呼び出されます。この問題は、アクティビティ 2 が buttonListener を介してアクティビティ 1 を読み込み、アクティビティ 1 が写真を撮るか、ファイルを持っている場合に発生します。選ばれました。アクティビティ 1 が決定すると、すぐにアクティビティ 2 を再度読み込み、新しい imageFile をインテントに渡します。アクティビティ 2 が読み込まれると、リクエストがサーバーに送信されます。返されるログは次のとおりです。 イメージが POST 経由で初めて送信されたとき:
DEBUG/ACTIVITY1 image(15559): /storage/emulated/0/DCIM/Camera/IMG_20130215_193022.jpg
次に、意図を介してアクティビティ 2 に渡されます...
DEBUG/ACTIVITY2 image(15559): /storage/emulated/0/DCIM/Camera/IMG_20130215_193022.jpg
2 回目、別の画像を選択するか、新しい写真を撮った後:
DEBUG/ACTIVITY1 image(15559): /storage/emulated/0/DCIM/Camera/IMG_20130214_212205.jpg
次に、意図を介してアクティビティ 2 に渡されます...
DEBUG/ACTIVITY2 image(15559): /storage/emulated/0/DCIM/Camera/IMG_20130215_193022.jpg
ASyncTask/onPostExecuteのリクエストがあれば投稿します!
ありがとう!
編集:アクティビティを明確にするためにAndroidマニフェストを追加しました:
<activity android:name=".ACTIVITY1" android:label="@string/app_name"
android:screenOrientation="portrait"/>
<activity android:name=".ACTIVITY2"
android:label="@string/app_name"
android:parentActivityName=".ACTIVITY1"
android:excludeFromRecents="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:screenOrientation="portrait">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ACTIVITY1"/>
</activity>