gpt4 book ai didi

java - 当我在相机应用程序中旋转屏幕并且我的主要 Activity 失败时,Android 相机没有将照片返回到主要 Activity

转载 作者:行者123 更新时间:2023-11-29 20:57:09 26 4
gpt4 key购买 nike

这是我的第一篇文章,虽然我是 Android 的新手,但这个社区到目前为止一直很棒。

这是我在相对简单的应用程序中遇到的问题。

我有一个关于我的主要 Activity 的 ImageView 。 onClick, ImageView 将打开相机应用程序。我可以拍照,相机应用程序将返回该图片并将其设置为 ImageView 中的图片。

当我从一个方向开始并在另一个方向拍照时,主要 Activity 会崩溃。示例:我最初以垂直方向打开主要 Activity ,打开相机应用程序并切换到水平 View ,然后拍照。当相机应用程序尝试返回图片时,主 Activity 崩溃。当所有 Activity 都以相同方向使用时,应用程序不会崩溃。

我相信这要么是我保存图片的方式,要么是 onResume 的方式,主要 Activity 没有足够的时间切换到新方向并在崩溃前接收图片....或者当主要 Activity 恢复时,它可能只是破坏了图片。

public class mainActivity extends Activity {

static final int REQUEST_IMAGE_CAPTURE = 1;

//Declares variable of mImageView
ImageView mImageView;
String mCurrentPhotoPath;
//String activityOrientation;

File photoFile = null;

Uri uriFile;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//Setting mImageView to the UI ID of
mImageView = (ImageView) findViewById(R.id.imageViewLicense); // making mImageView = the license image view right now just to make sure the code works, I can add to later when adding the medical card

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey("cameraImageUri")) {
uriFile = Uri.parse(savedInstanceState.getString("cameraImageUri"));
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (uriFile != null) {
outState.putString("cameraImageUri", uriFile.toString());
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}


//Initialized the camera to take a picture then return the result of the picture


public void dispatchTakePictureIntent(View view)
{
//Create new intent
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

// Ensure that there's a camera activity to handle the intent
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
// Create the File where the photo should go

try {
photoFile = createImageFile();
} catch (IOException ex) {

}
// Continue only if the File was successfully created
if (photoFile != null) {

uriFile = Uri.fromFile(photoFile);

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
uriFile);
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}

//Method for rotating the image of the bitmap to the corrected orientation
private Bitmap adjustImageOrientation(Bitmap image) {
ExifInterface exif;
try {
exif = new ExifInterface(mCurrentPhotoPath);
int exifOrientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);

int rotate = 0;
switch (exifOrientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;

case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;

case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
}

if (rotate != 0) {
int w = image.getWidth();
int h = image.getHeight();

// Setting pre rotate
Matrix mtx = new Matrix();
mtx.preRotate(rotate);

// Rotating Bitmap & convert to ARGB_8888, required by tess
image = Bitmap.createBitmap(image, 0, 0, w, h, mtx, false);

}
} catch (IOException e) {
return null;
}
return image.copy(Bitmap.Config.ARGB_8888, true);
}
//The photo taken in the takePicture method is returned here
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// Get the dimensions of the View
int targetW = mImageView.getWidth();
int targetH = mImageView.getHeight();

// Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options();
bmOptions.inJustDecodeBounds = true;
BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
int photoW = bmOptions.outWidth;
int photoH = bmOptions.outHeight;

// Determine how much to scale down the image
int scaleFactor = Math.min(photoW/targetW, photoH/targetH);

// Decode the image file into a Bitmap sized to fill the View
bmOptions.inJustDecodeBounds = false;
bmOptions.inSampleSize = scaleFactor;



bmOptions.inPurgeable = true;

Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);


//Rotates the image to the proper orientation
Bitmap adjustedBitmap = adjustImageOrientation(bitmap);

//Sets the original imageview as picture taken.
mImageView.setImageBitmap(adjustedBitmap);


}

private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
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 = image.getAbsolutePath();
return image;
}


}

最佳答案

Android 会在方向改变时重新启动主要 Activity ,因此您需要禁用或处理它。您可以在这里找到更多信息:How do I disable orientation change on Android?

关于java - 当我在相机应用程序中旋转屏幕并且我的主要 Activity 失败时,Android 相机没有将照片返回到主要 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com