2015-11-25 55 views
0

我希望有人可以幫助我解決這個問題,因爲我是一個Java的主要noob,我已經嘗試了很多代碼,但似乎沒有工作。發生什麼事情是,當我在縱向視圖中打開我的應用程序時,它會在橫向視圖中顯示圖像。爲什麼肖像查看照片水平顯示?

但是,如果我在橫向視圖中打開應用程序,並將其照片顯示在橫向上......應該如何。

我該如何解決這個縱向視圖呢?

這是主要活動的Java

package com.makingmemad.apk; 

import android.app.Activity; 
import android.content.ContentResolver; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
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.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 

import java.io.File; 
import java.io.IOException; 
import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Locale; 

public class MainActivity extends Activity { 

    private String mFileUri; 
    private final Context mContext = this; 

    @ 
    Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button btnbutton1 = (Button) findViewById(R.id.button1); 
     btnbutton1.setOnClickListener(new OnClickListener() { 

      @ 
      Override 
      public void onClick(View v) { 
       Uri uri = createPictureFile(); 
       mFileUri = uri.getEncodedPath(); 
       Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
       startActivityForResult(intent, 100); 
      } 
     }); 
    } 

    @ 
    Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == 100 && resultCode == RESULT_OK) { 
      if (mFileUri != null) { 
       Intent intent = new Intent(mContext, SecondActivity.class); 
       intent.putExtra("filepath", mFileUri); 
       startActivity(intent); 
      } 
     } 
    } 

    private static File getOutputMediaFile(int type) { 

     File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "DCIM/Camera"); 

     if (!mediaStorageDir.exists()) { 
      if (!mediaStorageDir.mkdirs()) { 
       return null; 
      } 
     } 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); 
     File mediaFile; 
     if (type == 1) { // image 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); 
     } else if (type == 2) { // video 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator + "VID_" + timeStamp + ".mp4"); 
     } else { 
      return null; 
     } 

     return mediaFile; 
    } 

    public Uri createPictureFile() { 
     String storageState = Environment.getExternalStorageState(); 
     if (storageState.equals(Environment.MEDIA_MOUNTED)) { 
      File pictureDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
      pictureDir = new File(pictureDir, "MyApp"); 

      // Create the storage directory if it does not exist 
      if (!pictureDir.exists()) { 
       if (!pictureDir.mkdirs()) { 
        Log.d("user", "failed to create directory"); 
        return null; 
       } 
      } 

      //Create a media file name 
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
      String fileName = pictureDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"; 
      File imageFile = new File(fileName); 

      // Convert to URI and return 
      return Uri.fromFile(imageFile); 
     } else { 
      Log.d("user", "No media mounted"); 
      return null; 
     } 
    } 
} 

這是我acitivty_main.xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:background="@drawable/bg" 
tools:context="com.MYAPPNAME.apk.MainActivity" > 

<Button 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/textView1" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="86dp" 
    android:text="LET&apos;S BEGIN" 
    android:textSize="20dp" 
    android:textStyle="bold" 
    android:typeface="serif" /> 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="72dp" 
    android:text="Before you begin, PLEASE NOTE that this game is intended for entertainment purposes only." 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:textColor="#fff" 
    android:textSize="24dp" 
    android:textStyle="bold" /> 

</RelativeLayout> 

這是我SecondActivity.java文件

package com.MYAPPNAME.apk; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.widget.ImageView; 

import java.io.File; 

public class SecondActivity extends Activity { 

    @ 
    Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_second); 

     Intent intent = getIntent(); 
     String filepath = intent.getStringExtra("filepath"); 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 8; // down sizing image as it throws OutOfMemory   Exception for larger images 
     filepath = filepath.replace("file://", ""); // remove to avoid  BitmapFactory.decodeFile return null 
     File imgFile = new File(filepath); 
     if (imgFile.exists()) { 
      ImageView imageView = (ImageView) findViewById(R.id.imageView1); 
      Bitmap bitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(), options); 
      imageView.setImageBitmap(bitmap); 

     } 
    } 
} 

這是我activity_second.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:background="@drawable/bg" 
tools:context="com.MYAPPNAME.apk.SecondActivity" > 

<ImageView 
    android:id="@+id/imageView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="185dp" 
    android:layout_alignParentRight="true"/> 

</RelativeLayout> 

這是我ExifUtil文件

package com.MYAPPNAME.apk; 

import java.io.IOException; 
import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.os.Build; 


public class ExifUtil { 



    public Bitmap rotateBitmap(String path) { 
     Bitmap myBitmap = BitmapFactory.decodeFile(path); 
     return ExifUtil.rotateBitmap(path, myBitmap); 
    } 


    /** 
    * @see http://sylvana.net/jpegcrop/exif_orientation.html 
    */ 
    public static Bitmap rotateBitmap(String src, Bitmap bitmap) { 
     try { 
      int orientation = getExifOrientation(src); 

      if (orientation == 1) { 
       return bitmap; 
      } 

      Matrix matrix = new Matrix(); 
      switch (orientation) { 
       case 2: 
        matrix.setScale(-1, 1); 
        break; 
       case 3: 
        matrix.setRotate(180); 
        break; 
       case 4: 
        matrix.setRotate(180); 
        matrix.postScale(-1, 1); 
        break; 
       case 5: 
        matrix.setRotate(90); 
        matrix.postScale(-1, 1); 
        break; 
       case 6: 
        matrix.setRotate(90); 
        break; 
       case 7: 
        matrix.setRotate(-90); 
        matrix.postScale(-1, 1); 
        break; 
       case 8: 
        matrix.setRotate(-90); 
        break; 
       default: 
        return bitmap; 
      } 

      try { 
       Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
       bitmap.recycle(); 
       return oriented; 
      } catch (OutOfMemoryError e) { 
       e.printStackTrace(); 
       return bitmap; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return bitmap; 
    } 

    private static int getExifOrientation(String src) throws IOException { 
     int orientation = 1; 

     try { 
      /** 
      * if your are targeting only api level >= 5 
      * ExifInterface exif = new ExifInterface(src); 
      * orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
      */ 
      if (Build.VERSION.SDK_INT >= 5) { 
       Class <? > exifClass = Class.forName("android.media.ExifInterface"); 
       Constructor <? > exifConstructor = exifClass.getConstructor(new Class[] { 
        String.class 
       }); 
       Object exifInstance = exifConstructor.newInstance(new Object[] { 
        src 
       }); 
       Method getAttributeInt = exifClass.getMethod("getAttributeInt", new Class[] { 
        String.class, int.class 
       }); 
       Field tagOrientationField = exifClass.getField("TAG_ORIENTATION"); 
       String tagOrientation = (String) tagOrientationField.get(null); 
       orientation = (Integer) getAttributeInt.invoke(exifInstance, new Object[] { 
        tagOrientation, 1 
       }); 
      } 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 

     return orientation; 
    } 
} 

回答

0

你必須告訴你方位的圖像EXIF數據。在將其設置爲imageview之前,必須根據exif數據旋轉圖像。 這裏的代碼,你可以使用,這樣使用

public Bitmap rotateBitmap(String path) { 
    Bitmap myBitmap = BitmapFactory.decodeFile(path); 
    return ExifUtil.rotateBitmap(path, myBitmap); 
} 

新ExifUtil.java文件

package com.makingmemad.apk; 

import java.io.IOException; 
import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.os.Build; 


public class ExifUtil { 


    /** 
    * @see http://sylvana.net/jpegcrop/exif_orientation.html 
    */ 
    public static Bitmap rotateBitmap(String src, Bitmap bitmap) { 
     try { 
      int orientation = getExifOrientation(src); 

      if (orientation == 1) { 
       return bitmap; 
      } 

      Matrix matrix = new Matrix(); 
      switch (orientation) { 
       case 2: 
        matrix.setScale(-1, 1); 
        break; 
       case 3: 
        matrix.setRotate(180); 
        break; 
       case 4: 
        matrix.setRotate(180); 
        matrix.postScale(-1, 1); 
        break; 
       case 5: 
        matrix.setRotate(90); 
        matrix.postScale(-1, 1); 
        break; 
       case 6: 
        matrix.setRotate(90); 
        break; 
       case 7: 
        matrix.setRotate(-90); 
        matrix.postScale(-1, 1); 
        break; 
       case 8: 
        matrix.setRotate(-90); 
        break; 
       default: 
        return bitmap; 
      } 

      try { 
       Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
       bitmap.recycle(); 
       return oriented; 
      } catch (OutOfMemoryError e) { 
       e.printStackTrace(); 
       return bitmap; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return bitmap; 
    } 

    private static int getExifOrientation(String src) throws IOException { 
     int orientation = 1; 

     try { 
      /** 
      * if your are targeting only api level >= 5 
      * ExifInterface exif = new ExifInterface(src); 
      * orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
      */ 
      if (Build.VERSION.SDK_INT >= 5) { 
       Class <? > exifClass = Class.forName("android.media.ExifInterface"); 
       Constructor <? > exifConstructor = exifClass.getConstructor(new Class[] { 
        String.class 
       }); 
       Object exifInstance = exifConstructor.newInstance(new Object[] { 
        src 
       }); 
       Method getAttributeInt = exifClass.getMethod("getAttributeInt", new Class[] { 
        String.class, int.class 
       }); 
       Field tagOrientationField = exifClass.getField("TAG_ORIENTATION"); 
       String tagOrientation = (String) tagOrientationField.get(null); 
       orientation = (Integer) getAttributeInt.invoke(exifInstance, new Object[] { 
        tagOrientation, 1 
       }); 
      } 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 

     return orientation; 
    } 
} 
+0

嗨Noev,我想實現這個代碼,但我不知道在哪裏把它放在我的主要活動或第二次活動我試圖把它放在兩個,但它似乎並沒有改變任何東西。如果你能幫助更好地理解它應該去哪裏,那將是最好的!:) – Essentialz

+0

創建一個名爲ExifUtil的單獨的類,它應該包含rotateBitmap方法和getExifOrientation。然後使用rotateBitmap無論你需要像這樣旋轉你的位圖imageView.setImageBitmap(rotateBitmap(imgPath)); – noev

+0

hi noev如果你查看頂部,你可以看到我創建的新的ExifUtil類,我試圖把這個代碼ImageView.setImageBitmap(rotateBitmap(imgPath));在我的SecondActivity.java文件中的其他ImageView imageView代碼的上方和下方,但imgPath下總是有紅線,如果我將imgPath更改爲文件路徑,rotateBitmap變爲紅色:S – Essentialz