Камера 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);
}
Другие вопросы по тегам