«Сфотографировать и представить его» в портретном режиме на Samsung Galaxy S

Я пытаюсь просто сделать снимок и представить его в ImageView с моей галактикой samsung s. Он отлично работает, когда я делаю это на ландшафте, но не на портрете. Я не получаю никаких ошибок или исключений – просто ничего не получаю … Существует много вопросов по этой теме, и это кажется проблематичным (что-то касательно ориентации камеры), но не дает окончательного решения для простой " Сделать снимок и представить его "код. Вот мой (проблемный) код, который не работает:

private void setUpListeners() { takePicture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { Intent cameraIntent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); } }); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == CAMERA_PIC_REQUEST) { Log.d("onActivityResult", "CAMERA_PIC_REQUEST returned"); dishImage = (Bitmap) data.getExtras().get("data"); if (dishImage==null) Log.d("onActivityResult", "dishImage==null"); imageView = (ImageView) findViewById(R.id.dishinfodishimageview); imageView.setImageBitmap(dishImage); imageView.setVisibility(View.VISIBLE); takePicture.setVisibility(View.GONE); (new UploadImage()).execute(null); } } else { Log.e("onActivityResult", "no able to presenting the picture of the dish"); } 

}

Мне просто нужен код, который работает (на любом устройстве) или исправление для моего кода … thx.

Solutions Collecting From Web of "«Сфотографировать и представить его» в портретном режиме на Samsung Galaxy S"

Причина, по которой onCreate() вызывается, заключается в том, что, когда вы вызываете активность камеры во время портретной ориентации, она изменит ориентацию и уничтожит предыдущую активность. После завершения onActivityResult() ваша деятельность будет воссоздана.

Одним из решений этой проблемы является указание манифеста игнорировать изменения в изменении ориентации, вы можете сделать это, используя следующее:

 <activity android:name=".MyMainActivity" android:configChanges="orientation" android:label="@string/app_name" /> 

Если вы используете API начинается с уровня 13, вы можете рассмотреть screenSize для манифеста configChanges.

Я могу только предложить взломать эту проблему. Сохраните результаты в общих настройках в onActivityResult() и во время onCreate загрузите свой контент из общих настроек. Я знаю, что это плохое решение, но это заставит вас идти, пока вы не найдете лучшего ответа. И не забудьте очистить свои общие настройки, как только вы закончите, иначе ваша деятельность будет всегда инициализироваться старыми данными.

Попробуйте следующий код .. он работал для меня с Samsung Galaxy S2 Вставьте следующий код в onActivityResult ()

 ExifInterface exif = new ExifInterface(cameraimagename); String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; int rotationAngle = 0; System.out.println("orientation is : "+orientation); System.out.println("ExifInterface.ORIENTATION_ROTATE_90 : "+ExifInterface.ORIENTATION_ROTATE_90); System.out.println("ExifInterface.ORIENTATION_ROTATE_180 : "+ExifInterface.ORIENTATION_ROTATE_180); System.out.println("ExifInterface.ORIENTATION_ROTATE_270 : "+ExifInterface.ORIENTATION_ROTATE_270); if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; System.out.println("Rotation Angle is : "+rotationAngle); Matrix matrix = new Matrix(); // matrix.setRotate(rotationAngle, (float) photo.getWidth() / 2, (float) photo.getHeight() / 2); matrix.postRotate(rotationAngle); Bitmap rotatedBitmap=null; try { rotatedBitmap = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Легко определить ориентацию изображения и заменить растровое изображение, используя:

  /** * Rotate an image if required. * @param img * @param selectedImage * @return */ private static Bitmap rotateImageIfRequired(Context context,Bitmap img, Uri selectedImage) { // Detect rotation int rotation=getRotation(context, selectedImage); if(rotation!=0){ Matrix matrix = new Matrix(); matrix.postRotate(rotation); Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); img.recycle(); return rotatedImg; }else{ return img; } } /** * Get the rotation of the last image added. * @param context * @param selectedImage * @return */ private static int getRotation(Context context,Uri selectedImage) { int rotation =0; ContentResolver content = context.getContentResolver(); Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { "orientation", "date_added" },null, null,"date_added desc"); if (mediaCursor != null && mediaCursor.getCount() !=0 ) { while(mediaCursor.moveToNext()){ rotation = mediaCursor.getInt(0); break; } } mediaCursor.close(); return rotation; } в  /** * Rotate an image if required. * @param img * @param selectedImage * @return */ private static Bitmap rotateImageIfRequired(Context context,Bitmap img, Uri selectedImage) { // Detect rotation int rotation=getRotation(context, selectedImage); if(rotation!=0){ Matrix matrix = new Matrix(); matrix.postRotate(rotation); Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); img.recycle(); return rotatedImg; }else{ return img; } } /** * Get the rotation of the last image added. * @param context * @param selectedImage * @return */ private static int getRotation(Context context,Uri selectedImage) { int rotation =0; ContentResolver content = context.getContentResolver(); Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { "orientation", "date_added" },null, null,"date_added desc"); if (mediaCursor != null && mediaCursor.getCount() !=0 ) { while(mediaCursor.moveToNext()){ rotation = mediaCursor.getInt(0); break; } } mediaCursor.close(); return rotation; } 

Чтобы избежать нехватки памяти с большими изображениями, я рекомендую вам перемасштабировать изображение, используя:

 private static final int MAX_HEIGHT = 1024; private static final int MAX_WIDTH = 1024; public static Bitmap decodeSampledBitmap(Context context, Uri selectedImage) throws IOException { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; InputStream imageStream = context.getContentResolver().openInputStream(selectedImage); BitmapFactory.decodeStream(imageStream, null, options); imageStream.close(); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, MAX_WIDTH, MAX_HEIGHT); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; imageStream = context.getContentResolver().openInputStream(selectedImage); Bitmap img = BitmapFactory.decodeStream(imageStream, null, options); img= rotateImageIfRequired(img, selectedImage); return img; } 

Невозможно использовать ExifInterface для получения ориентации, поскольку проблема с ОС Android: https://code.google.com/p/android/issues/detail?id=19268