我有两项活动,TakePictureActivity
和ChoosePicActivity
,它们都会导致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 ...我有点迷失。
答案 0 :(得分:0)
问题原因是DecidePicActivity.choosepic
和DecidePicActivity.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;
}
}
}
takepic
和choosepic
他们未正确重新初始化。
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;
}
}
问题解决了!