【问题标题】:Two onActivityResult conflict android两个onActivityResult冲突android
【发布时间】:2015-02-15 11:18:40
【问题描述】:

我有两个活动,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 的情况下启动的,则所拍摄的图片将用于生成缩放位图,正如预期的那样。

我希望我对自己的解释足够好,以便您理解我的问题。有人可以给点灯吗?

我不确定是否有 2 次方法 onActivityResult 是否正确,或者是否有不同的线程冲突,或者方法 i.getdata() 可能无法获得正确的 Intent id...我有点失落。

【问题讨论】:

    标签: java android get onactivityresult


    【解决方案1】:

    问题是由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 它们未正确重新初始化。

    现在onClickDecidePicActivity活动是这样的:

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

    问题解决了!

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多