2013-03-28 1 views
2

Я использую две кнопки: btnShoot =, чтобы сделать снимок с камеры апи btnGallery = выбрать фотографию из галереиAndroid Предварительный просмотр изображений из галереи/камеры различного

Позже можно будет загрузить то сохранен img.

Следующий PhotoIntentActivity.java Я использую приложение для камеры и просматриваю изображение (imageView1). Теперь проблема заключается в том, что в портретном режиме изображение будет отображаться в -90 ° (просмотр и сохранение изображения в галерее).

package com.lo.android.photo; 

import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.List; 

import com.lo.android.R; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.hardware.Camera; 
import android.media.ExifInterface; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.Surface; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.database.Cursor; 



public class PhotoIntentActivity extends Activity { 

    private static int RESULT_LOAD_IMAGE = 1; 

    private static final int ACTION_TAKE_PHOTO_B = 1; 

    private static final String BITMAP_STORAGE_KEY = "viewbitmap"; 
    private static final String IMAGEVIEW_VISIBILITY_STORAGE_KEY = "imageviewvisibility"; 
    private ImageView mImageView; 
    private Bitmap mImageBitmap; 

    private String mCurrentPhotoPath; 

    private static final String JPEG_FILE_PREFIX = "IMG_"; 
    private static final String JPEG_FILE_SUFFIX = ".jpg"; 

    private AlbumStorageDirFactory mAlbumStorageDirFactory = null; 


    /* Photo album for this application */ 
    private String getAlbumName() { 
     return getString(R.string.album_name); 
    } 

    /* Photo directory for this application */ 
    private File getAlbumDir() { 
     File storageDir = null; 

     if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { 

      storageDir = mAlbumStorageDirFactory.getAlbumStorageDir(getAlbumName()); 

      if (storageDir != null) { 
       if (! storageDir.mkdirs()) { 
        if (! storageDir.exists()){ 
         Log.d("lo", "failed to create directory"); 
         return null; 
        } 
       } 
      } 

     } else { 
      Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE."); 
     } 

     return storageDir; 
    } 

    /* Photo file name for this application */ 
    private File createImageFile() throws IOException { 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; 
     File albumF = getAlbumDir(); 
     File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF); 
     return imageF; 
    } 

    private File setUpPhotoFile() throws IOException { 

     File f = createImageFile(); 
     mCurrentPhotoPath = f.getAbsolutePath(); 

     return f; 
    } 

    public Bitmap setPic() { 

     int orientation; 

     try { 
      if (mCurrentPhotoPath == null) { 
       return null; 
      } 

     /* There isn't enough memory to open up more than a couple camera photos */ 
     /* So pre-scale the target bitmap into which the file is decoded */ 
     /* Get the size of the ImageView */ 

     int targetW = mImageView.getWidth(); 
     int targetH = mImageView.getHeight(); 

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

     /* Figure out which way needs to be reduced less */ 
     int scaleFactor = 1; 
     if ((targetW > 0) || (targetH > 0)) { 
      scaleFactor = Math.min(photoW/targetW, photoH/targetH); 
     } 

     /* Set bitmap options to scale the image decode target */ 
     bmOptions.inJustDecodeBounds = false; 
     bmOptions.inSampleSize = scaleFactor; 
     bmOptions.inPurgeable = true; 

     /* Decode the JPEG file into a Bitmap */ 
     Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 

     ExifInterface exif = new ExifInterface(mCurrentPhotoPath); 

     orientation = exif 
       .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

     Log.e("ExifInteface .........", "rotation ="+orientation); 

//  exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90); 

     Log.e("orientation", "" + orientation); 
     Matrix m = new Matrix(); 

     if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { 
      m.postRotate(180); 
//   m.postScale((float) bm.getWidth(), (float) bm.getHeight()); 
      // if(m.preRotate(90)){ 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), 
        bitmap.getHeight(), m, true); 
      return bitmap; 
     } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
      m.postRotate(90); 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), 
        bitmap.getHeight(), m, true); 
      return bitmap; 
     } 
     else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { 
      m.postRotate(270); 
      Log.e("in orientation", "" + orientation); 
      bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), 
        bitmap.getHeight(), m, true); 
      return bitmap; 
     } 

     mImageView.setImageBitmap(bitmap); 
     mImageView.setVisibility(View.VISIBLE); 
     } catch (Exception e) { 
      return null; 
     } 
     return mImageBitmap; 
    } 


    private void galleryAddPic() { 
      Intent mediaScanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE"); 
      File f = new File(mCurrentPhotoPath); 
      Uri contentUri = Uri.fromFile(f); 
      mediaScanIntent.setData(contentUri); 
      this.sendBroadcast(mediaScanIntent); 
    } 

    private void dispatchTakePictureIntent(int actionCode) { 

     Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     switch(actionCode) { 
     case ACTION_TAKE_PHOTO_B: 
      File f = null; 

      try { 
       f = setUpPhotoFile(); 
       mCurrentPhotoPath = f.getAbsolutePath(); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       f = null; 
       mCurrentPhotoPath = null; 
      } 
      break; 

     default: 
      break;   
     } // switch 

     startActivityForResult(takePictureIntent, actionCode); 
    } 

    private void handleBigCameraPhoto() { 

     if (mCurrentPhotoPath != null) { 
      setPic(); 
      galleryAddPic(); 
      mCurrentPhotoPath = null; 
     } 

    } 

    Button.OnClickListener mTakePicOnClickListener = 
     new Button.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      dispatchTakePictureIntent(ACTION_TAKE_PHOTO_B); 
     } 
    }; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mImageView = (ImageView) findViewById(R.id.imageView1); 
     mImageBitmap = null; 

     /// gallery picture path /// 


     Button picBtn = (Button) findViewById(R.id.btnShoot); 
     setBtnListenerOrDisable( 
       picBtn, 
       mTakePicOnClickListener, 
       MediaStore.ACTION_IMAGE_CAPTURE 
     ); 

     Button btnGallery = (Button) findViewById(R.id.btnGallery); 
     btnGallery.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 

       Intent i = new Intent(
         Intent.ACTION_PICK, 
         android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

       startActivityForResult(i, RESULT_LOAD_IMAGE); 
      } 
     }); 







     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { 
      mAlbumStorageDirFactory = new FroyoAlbumDirFactory(); 
     } else { 
      mAlbumStorageDirFactory = new BaseAlbumDirFactory(); 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
     case ACTION_TAKE_PHOTO_B: { 
      if (resultCode == RESULT_OK) { 
       handleBigCameraPhoto(); 
      } 
      break; 
     } // ACTION_TAKE_PHOTO_B 
     } 
      if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK 
        && null != data) { 
       Uri selectedImage = data.getData(); 
       String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

       Cursor cursor = getContentResolver().query(selectedImage, 
         filePathColumn, null, null, null); 
       cursor.moveToFirst(); 

       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String picturePath = cursor.getString(columnIndex); 
       ImageView imageView = (ImageView) findViewById(R.id.imageView1); 
       imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
       cursor.close(); 
      } 

     }// switch 

    // Some lifecycle callbacks so that the image can survive orientation change 
    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     outState.putParcelable(BITMAP_STORAGE_KEY, mImageBitmap); 
     outState.putBoolean(IMAGEVIEW_VISIBILITY_STORAGE_KEY, (mImageBitmap != null)); 
     super.onSaveInstanceState(outState); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     mImageBitmap = savedInstanceState.getParcelable(BITMAP_STORAGE_KEY); 
     mImageView.setImageBitmap(mImageBitmap); 
     mImageView.setVisibility(
       savedInstanceState.getBoolean(IMAGEVIEW_VISIBILITY_STORAGE_KEY) ? 
         ImageView.VISIBLE : ImageView.INVISIBLE 
     ); 
    } 

    /** 
    * Indicates whether the specified action can be used as an intent. This 
    * method queries the package manager for installed packages that can 
    * respond to an intent with the specified action. If no suitable package is 
    * found, this method returns false. 
    * http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html 
    * 
    * @param context The application's environment. 
    * @param action The Intent action to check for availability. 
    * 
    * @return True if an Intent with the specified action can be sent and 
    *   responded to, false otherwise. 
    */ 
    public static boolean isIntentAvailable(Context context, String action) { 
     final PackageManager packageManager = context.getPackageManager(); 
     final Intent intent = new Intent(action); 
     List<ResolveInfo> list = 
      packageManager.queryIntentActivities(intent, 
        PackageManager.MATCH_DEFAULT_ONLY); 
     return list.size() > 0; 
    } 

    private void setBtnListenerOrDisable( 
      Button btn, 
      Button.OnClickListener onClickListener, 
      String intentName 
    ) { 
     if (isIntentAvailable(this, intentName)) { 
      btn.setOnClickListener(onClickListener);    
     } else { 
      btn.setText( 
       getText(R.string.cannot).toString() + " " + btn.getText()); 
      btn.setClickable(false); 
     } 
    } 

} 

Как использовать только один предварительный просмотр с правильным вращением в портретном режиме?

+0

http://stackoverflow.com/questions/3852154/android-camera-unexplainable-rotation-on-capture-for-some-devices-not-in-exif – Triode

ответ

2

попробовать это:

File photos = new File(selectedImagePath); 
       ExifInterface exif = null; 
       try { 
        exif = new ExifInterface(photos.getPath()); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       int orientation = exif.getAttributeInt(
         ExifInterface.TAG_ORIENTATION, 
         ExifInterface.ORIENTATION_NORMAL); 
       int angle = 0; 

       if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
        angle = 90; 
       } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { 
        angle = 180; 
       } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { 
        angle = 270; 
       } 
       Bitmap b; 
       Matrix mat = new Matrix(); 
       mat.postRotate(angle); 

       b = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), mat, true); 

затем установить этот "б" точечный рисунок, где вы хотите установить.

+0

@ user1735856 Сообщите мне, поможет ли это вам или нет и если это поможет вам принять его в качестве ответа. – Rahil2952

+0

сделаю, спасибо. На самом деле я не могу включить ваш код в свой код выше, отредактированный :-( – user1735856

+0

как новобранец, я много пытался его включить, но все не удается. Есть ли какой-нибудь пример, чтобы увидеть его в действии? – user1735856

Смежные вопросы