在Samsung Galaxy S上以肖像模式“拍照并呈现”

我正在尝试简单地拍摄一张照片,并用三星银河系统将其呈现在ImageView中。 当我在风景上做,而不是在肖像上,它工作的很好。 我没有得到任何错误或例外 – 只是没有得到任何东西…有关这个话题的很多问题,似乎是有问题的(关于相机方向的东西),但没有找出最终的解决scheme,一个简单的“拍照并呈现“代码。 这是我的(有问题的)代码不起作用:

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。

调用onCreate()的原因是因为在纵向定位时调用相机活动时,它会改变方向并破坏以前的活动。 完成onActivityResult() ,您的活动将被重新创build。

解决这个问题的一个办法是设置清单忽略方向变化的变化,你可以这样做:

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

如果您使用API​​以13级开始,则可以考虑screenSize作为configChanges清单。

我只能提出这个问题的破解。 将结果保存在onActivityResult()中的共享首选项中,并在onCreate从共享首选项加载您的内容。 我知道这是一个不好的解决scheme,但这会让你继续前进,直到find更好的答案。 一旦完成,不要忘记清除您的共享偏好,否则您的活动将始终使用旧数据进行初始化。

尝试下面的代码..它为我与三星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(); } 

很容易检测图像的方向,并使用以下代码replace位图:

  /** * 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; } 

为了避免出现大图片的记忆,我build议您使用以下命令重新缩放图像:

 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; } 

由于Android操作系统问题,使用ExifInterface获取方向是不正确的: https : //code.google.com/p/android/issues/detail? id = 19268