繁体   English   中英

两个onActivityResult冲突android

[英]Two onActivityResult conflict 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
   }

}

这是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选择的图像,留下最近拍摄的图片,这是图片应该用它来生成缩放的位图。

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

我希望我能够解释自己对你理解我的问题有足够的好处。 有人可以解释一下吗?

我不确定onActivityResult方法的2倍是否正确,或者是否存在不同的线程冲突,或者方法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;
    }
}  

}

takepicchoosepic他们没有适当地重新初始化。

现在onClick in 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;
    }
}  

问题解决了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM