2012-09-25 52 views
6

Uygulamamı Android 2.2 ile HTC Desire'da test ediyorum. ve tam da istediğim gibi çalışır. Sherlock paketlerini daha eski cihazlarda olduğu gibi aynı stilde kullanıyorum.EXIF ​​yönlendirme verilerini onurlandırmayan Android cihazlarla nasıl baş edilir?

AVD'm en son android kullanacak şekilde ayarlanmış ve ayrıca tamam görünüyor. Daha sonra Samsung Galaxy S2'ye yerleştirdim ve kamera ve galeri görüntüleri ile çalışırken yanlış yönlendiriliyorlar. Bu Samsung (kamera uygulaması, android kendi kendine) bir şey yok veya EXIF ​​kontrol eder ve benim görüntüleri yanlış yönlendirir. Portre görüntüleri yatay olarak yüklenir ve manzara resimleri dikey olarak yüklenir.

  1. Sanırım EXIF'i bir şekilde kontrol etmeli ve görüntüleri oldukları gibi yüklemek için göz ardı etmem gerekiyor mu?
  2. Daha büyük sorun: benzer bir sorun yaratacak başka aygıtların (bazı HTC, bazı HUAWEI bazıları) olup olmadığını nasıl anlarsınız? Tüm android cihazların, 4 ekran boyutu grubuna sahip olmanın aynı şekilde davranacağını sanmıştım ...

Tnx. Herhangi bir kod olmadan neler olup bittiğini söylemek zor.

cevap

4

Bulduğum en basit yol, EXIF ​​bilgilerini okumak ve görüntünün dönmeye ihtiyacı olup olmadığını kontrol etmektir. Eğer günlük rotationForImage işlevini "Hata EXIF ​​denetimi" göreceksiniz bir hata varsa

/** An URI and a imageView */ 
public void setBitmap(ImageView mImageView, String imageURI){ 
    // Get the original bitmap dimensions 
    BitmapFactory.Options options = new BitmapFactory.Options();    
    Bitmap bitmap = BitmapFactory.decodeFile(imageURI, options); 
    float rotation = rotationForImage(getActivity(), Uri.fromFile(new File(imageURI))); 

    if(rotation!=0){ 
     //New rotation matrix 
     Matrix matrix = new Matrix(); 
     matrix.preRotate(rotation); 
     mImageView.setImageBitmap(Bitmap.createBitmap(bitmap, 0, 0, reqHeight, reqWidth, matrix, true)); 
    } else { 
     //No need to rotate 
     mImageView.setImageBitmap(BitmapFactory.decodeFile(imageURI, options)); 
    } 
} 


/** Returns how much we have to rotate */ 
public static float rotationForImage(Context context, Uri uri) { 
     try{ 
      if (uri.getScheme().equals("content")) { 
       //From the media gallery 
       String[] projection = { Images.ImageColumns.ORIENTATION }; 
       Cursor c = context.getContentResolver().query(uri, projection, null, null, null); 
        if (c.moveToFirst()) { 
         return c.getInt(0); 
        }    
      } else if (uri.getScheme().equals("file")) { 
       //From a file saved by the camera 
        ExifInterface exif = new ExifInterface(uri.getPath()); 
        int rotation = (int) exifOrientationToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)); 
        return rotation; 
      } 
      return 0; 

     } catch (IOException e) { 
      Log.e(TAG, "Error checking exif", e); 
      return 0; 
     } 
} 

/** Get rotation in degrees */ 
private static float exifOrientationToDegrees(int exifOrientation) { 
     if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { 
      return 90; 
     } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { 
      return 180; 
     } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { 
      return 270; 
     } 
     return 0; 
} 

: Android'de ExifInterface sınıfına fazla okumak için: söyledi http://developer.android.com/intl/es/reference/android/media/ExifInterface.html

, burada bazı örnek kodudur.

+4

Yanıt, ExifInterface yöneltme verilerinin nasıl kontrol edileceğini açıklamakta iyidir, ancak bu asıl soru gibi görünmemektedir. 'Yönlendirme alanını doğru kaydetmeyen cihazlarla nasıl baş edersiniz?' sorunun jüsü gibi görünüyor. Bu cevap, yalnızca Android dokümanlarında açık bir şekilde açıklanan ExifInterface'den yönlendirme alanının nasıl alınacağını açıklar. –

+0

Benim için çalışmıyor. –

İlgili konular