两个onActivityResult冲突android



我有两个活动,TakePictureActivityChoosePicActivity,它们都导致PuzzleActivity

正如您所看到的,第一个活动启动了启动相机的意图,允许您拍照并启动PuzzleActivity

第二个活动访问图库,允许您选择图片并启动PuzzleActivity

PuzzleActivity中,方法createScaledBitmap被调用以生成位图。

这里是TakePictureActivity:

public class TakePictureActivity extends Activity {
String mCurrentPhotoPath;
static final int REQUEST_TAKE_PHOTO = 1;
public static final int DIALOG_PICASA_ERROR_ID = 0;
private static String DEBUG_TAG1 = "TakePictureA";
private Bitmap bitmap;
public static Uri imageUri;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.takepicture);
    dispatchTakePictureIntent();
}
//TODO createImageFile
   /* (non-Javadoc)
    * Creates a file for the picture with a collision-resistant name using date-time stamp.
    * Additionally, it saves the path to the picture in a member variable, mCurrentPhotoPath.
    */
   private File createImageFile() throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date(0));
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
        );
        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        Log.d(DEBUG_TAG1,"Current photo Path" + mCurrentPhotoPath);
        galleryAddPic();
        return image;
    }
 //TODO dispatchTakePictureIntent
   /* (non-Javadoc)
    * Starts an intent for the camera application.
    */
   private void dispatchTakePictureIntent() {
        Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // Ensure that there's a camera activity to handle the intent
        if (i.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                Log.d(DEBUG_TAG1,"try create iamge file");
                photoFile = createImageFile();
            } catch (IOException ex) {
                // Error occurred while creating the File
                Log.d(DEBUG_TAG1,"error");
            }
            // Continue only if the File was successfully created
            if (photoFile != null) {
                Log.d(DEBUG_TAG1,"photo file not null");
                i.putExtra(MediaStore.EXTRA_OUTPUT,
                        Uri.fromFile(photoFile));
                startActivityForResult(i, REQUEST_TAKE_PHOTO);
            }
        }
    }
   private void galleryAddPic() {
        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        File f = new File(mCurrentPhotoPath);
        Uri contentUri = Uri.fromFile(f);
        mediaScanIntent.setData(contentUri);
        this.sendBroadcast(mediaScanIntent);
    }
   @Override
   protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) {
      //super.onActivityResult(requestCode, resultCode, i);
      if (resultCode == RESULT_OK) {
          Log.d(DEBUG_TAG1,"TakePicture onActivityResult ");
         switch (requestCode) {
         case REQUEST_TAKE_PHOTO:
             imageUri = i.getData();
             Log.d(DEBUG_TAG1,"intent take pic: " + i);
             Intent i1 = new Intent(this, PuzzleActivity.class);
             startActivity(i1);
             break;
         } // end switch
      } // end if
   }
}

这里是ChoosePicActivity:

public class ChoosePicActivity extends Activity {
String mCurrentPhotoPath;
public static final int IMAGEREQUESTCODE = 8242008;
static final int REQUEST_TAKE_PHOTO = 1;
public static final int DIALOG_PICASA_ERROR_ID = 0;
private static String DEBUG_TAG1 = "ChoosePicA";
private Bitmap bitmap;
public static Uri imageUri;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    selectImageFromGallery();
}

/* (non-Javadoc)
    * Will start an intent for external Gallery app.  
    * Image returned via onActivityResult().
    */   
private void selectImageFromGallery() {
      Intent galleryIntent = new Intent(Intent.ACTION_PICK, 
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
      startActivityForResult(galleryIntent, IMAGEREQUESTCODE);
   }
 //TODO onActivityResult
   /* (non-Javadoc)
    * Run when Gallery app returns selected image.
    */
 @Override
   protected final void onActivityResult(final int requestCode, final int resultCode, final Intent i) {
      //super.onActivityResult(requestCode, resultCode, i);
      if (resultCode == RESULT_OK) {
          Log.d(DEBUG_TAG1,"ChoosePic onActivityResult ");
         switch (requestCode) {
         case IMAGEREQUESTCODE:
             imageUri = i.getData();
             Log.d(DEBUG_TAG1,"intent choose pic: " + i);
             Intent i1 = new Intent(this, PuzzleActivity.class);
             startActivity(i1);  
             break;
         } // end switch
      } // end if
   }
}

下面是谜题活动:

public final class PuzzleActivity extends Activity implements OnClickListener{
private Bitmap bitmap; // temporary holder for puzzle picture
public static Chronometer chrono;
static TextView tv1;
static EditText et1;
Button button;
private static Context mContext;

//TODO onCreate
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.board);
  mContext = this;
  tv1 = (TextView) findViewById(R.id.movecount_display);
  if(DecidePicActivity.choosepic){
      try {
          bitmap = createScaledBitmap(ChoosePicActivity.imageUri);
       } catch (FileNotFoundException e) {
          showDialog(DIALOG_PICASA_ERROR_ID);
       } catch (IOException e) {
          e.printStackTrace();
          finish();
       } catch (IllegalArgumentException e) {
          showDialog(DIALOG_PICASA_ERROR_ID);
       }
       createGameBoard(getGridSize());
  }
  else if(DecidePicActivity.takepic){
      try {
          bitmap = createScaledBitmap(TakePictureActivity.imageUri);
       } catch (FileNotFoundException e) {
          showDialog(DIALOG_PICASA_ERROR_ID);
       } catch (IOException e) {
          e.printStackTrace();
          finish();
       } catch (IllegalArgumentException e) {
          showDialog(DIALOG_PICASA_ERROR_ID);
       }
       createGameBoard(getGridSize());
  }
  TileView.moveDetector = new GestureDetectorCompat(this, new MyGestureListener());
  Button pauseButton = (Button) findViewById(R.id.pause_button);
  pauseButton.setOnClickListener(this); 

}

问题是:

我进入ChoosePicActivity,从图库中选择一张图片,开始进入PuzzleActivity,并用所选图片创建缩放位图。在这里之前一切都很好。

然后,PuzzleActivity完成,我到达TakePictureActivity,相机开始,我拍了一张照片,开始意图去PuzzleActivity,然后生成的缩放位图使用之前在ChoosePicActivity中选择的图像,留下最近拍摄的照片,这是应该用来生成缩放位图的照片。

另一方面,如果TakePictureActivity在之前没有启动ChoosePicActivity的情况下启动,则如预期的那样,所拍摄的图片用于生成缩放位图。

我希望我对自己的解释足够好,让你理解我的问题。有人能给我点光吗?

我不确定方法onActivityResult的两倍是否正确,或者是否有不同的线程冲突,或者方法i.getdata()在获得正确的Intent id时遇到了问题……我有点迷路了。

问题由DecidePicActivity.choosepicDecidePicActivity.takepic引起。

以前,DecidePicActivity的活动是这样的:

public class DecidePicActivity extends Activity implements OnClickListener{
static boolean takepic = false;
static boolean choosepic = false;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    setContentView(R.layout.decidepic);
    findViewById(R.id.take_pic_button).setOnClickListener(this);
    findViewById(R.id.choose_pic_button).setOnClickListener(this);
}
@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.take_pic_button:
            takepic = true;
            Intent i1 = new Intent(this, TakePictureActivity.class);
            startActivity(i1);
            break;
        case R.id.choose_pic_button:
            choosepic = true;
            Intent i2 = new Intent(this, ChoosePicActivity.class);
            startActivity(i2);
            break;
    }
}  

}

CCD_ 23和CCD_。

现在DecidePicActivity活动中的onClick是这样的:

@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.take_pic_button:
            takepic = true;
            choosepic = false;
            Intent i1 = new Intent(this, TakePictureActivity.class);
            startActivity(i1);
            break;
        case R.id.choose_pic_button:
            choosepic = true;
            takepic = false;
            Intent i2 = new Intent(this, ChoosePicActivity.class);
            startActivity(i2);
            break;
    }
}  

问题解决了!

最新更新