两个onActivityResult冲突android

时间:2015-02-15 11:18:41

标签: java android get onactivityresult

我有两项活动,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
   }

}

这是PuzzleActivity:

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的2次是否正确,或者是否存在不同的线程冲突,或者方法i.getdata()无法获得正确的Intent 1}} id ...我有点迷失。

1 个答案:

答案 0 :(得分:0)

问题原因是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;
    }
}  

}

takepicchoosepic他们未正确重新初始化。

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

@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;
    }
}  

问题解决了!