Камера Android не возвращает фотографию в основное действие, когда я поворачиваю экран в приложении камеры, и мое основное действие не выполняется
Это мой первый пост, и пока я новичок в Android, это сообщество пока что великолепно.
Вот проблема, которую я имею с моим относительно простым приложением.
У меня есть вид изображения на моей основной деятельности. При нажатии на изображение откроется приложение "Камера". Я могу сделать снимок, и приложение камеры вернет это изображение и установит его в качестве изображения в представлении изображения.
Основная активность завершится сбоем, когда я начну в одной ориентации и сделаю снимок в другой. Пример: я вначале открываю основной вид деятельности в вертикальной ориентации, открываю приложение камеры, переключаюсь в горизонтальный вид и делаю снимок. Когда приложение камеры пытается вернуть изображение, происходит сбой основной активности. Приложение не падает, когда все действия используются в одной и той же ориентации.
Я склонен полагать, что это либо способ сохранения изображения, либо то, что в onResume основное действие не имеет достаточно времени, чтобы переключиться на новую ориентацию и получить изображение до его сбоя.... или, может быть, это просто разрушает картину, когда основная деятельность возобновляется.
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;
}
}
2 ответа
Android перезапускает основное действие при изменении ориентации, поэтому вам нужно отключить или обработать это. Вы можете узнать больше здесь: Как отключить изменение ориентации на Android?
Принятый ответ - плохая практика, см. Почему бы не использовать всегда android:configChanges="клавиатура скрытая | ориентация"?,
Лучше было бы сохранить переменную mCurrentPhotoPath.
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("filepath", mCurrentPhotoPath);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
mCurrentPhotoPath = state.getString("filepath");
super.onRestoreInstanceState(state);
}