title: Detect orientation of image that is from URL
body: <p>I know how to detect and change orientation of image and that is captured from device using <code>ExifInterface</code>. Now I am thinking how can I detect image orientation that is from URL and not from device? </p>
  
  <p>For example I have an <strong>ImageLoader</strong> class that has <strong>DisplayImage function</strong> to set bitmap from URL to ImageView:</p>
  
  <p><strong>ImageLoader</strong></p>
  
  <pre><code>public class ImageLoader {
  
      MemoryCache memoryCache = new MemoryCache();
      FileCache fileCache;
      private Map&lt;ImageView, String&gt; imageViews = Collections
              .synchronizedMap(new WeakHashMap&lt;ImageView, String&gt;());
      ExecutorService executorService;
  
      public ImageLoader(Context context) {
          fileCache = new FileCache(context);
          executorService = Executors.newFixedThreadPool(5);
      }
  
      int stub_id;
  
      public void DisplayImage(String url,
      // int loader,
              ImageView imageView) {
          // stub_id = loader;
          imageViews.put(imageView, url);
          Bitmap bitmap = memoryCache.get(url);
          if (bitmap != null)
              imageView.setImageBitmap(bitmap);
          else {
              queuePhoto(url, imageView);
              // imageView.setImageResource(loader);
          }
      }
  
      private void queuePhoto(String url, ImageView imageView) {
          PhotoToLoad p = new PhotoToLoad(url, imageView);
          executorService.submit(new PhotosLoader(p));
      }
  
      private Bitmap getBitmap(String url) {
          File f = fileCache.getFile(url);
  
          // from SD cache
          Bitmap b = decodeFile(f);
          if (b != null)
              return b;
  
          // from web
          try {
              Bitmap bitmap = null;
              URL imageUrl = new URL(url);
              HttpURLConnection conn = (HttpURLConnection) imageUrl
                      .openConnection();
              conn.setConnectTimeout(30000);
              conn.setReadTimeout(30000);
              conn.setInstanceFollowRedirects(true);
              InputStream is = conn.getInputStream();
              OutputStream os = new FileOutputStream(f);
              Utils.CopyStream(is, os);
              os.close();
              bitmap = decodeFile(f);
  
              return bitmap;
          } catch (Exception ex) {
              ex.printStackTrace();
              return null;
          }
      }
  
      // decodes image and scales it to reduce memory consumption
      private Bitmap decodeFile(File f) {
          try {
              // decode image size
              BitmapFactory.Options o = new BitmapFactory.Options();
              o.inJustDecodeBounds = true;
              BitmapFactory.decodeStream(new FileInputStream(f), null, o);
  
              // Find the correct scale value. It should be the power of 2.
              final int REQUIRED_SIZE = 70;
              int width_tmp = o.outWidth, height_tmp = o.outHeight;
              int scale = 1;
              while (true) {
                  if (width_tmp / 2 &lt; REQUIRED_SIZE
                          || height_tmp / 2 &lt; REQUIRED_SIZE)
                      break;
                  width_tmp /= 2;
                  height_tmp /= 2;
                  scale *= 2;
              }
  
              // decode with inSampleSize
              BitmapFactory.Options o2 = new BitmapFactory.Options();
              o2.inSampleSize = scale;
              return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
          } catch (FileNotFoundException e) {
          }
          return null;
      }
  
      // Task for the queue
      private class PhotoToLoad {
          public String url;
          public ImageView imageView;
  
          public PhotoToLoad(String u, ImageView i) {
              url = u;
              imageView = i;
          }
      }
  
      class PhotosLoader implements Runnable {
          PhotoToLoad photoToLoad;
  
          PhotosLoader(PhotoToLoad photoToLoad) {
              this.photoToLoad = photoToLoad;
          }
  
          @Override
          public void run() {
              if (imageViewReused(photoToLoad))
                  return;
              Bitmap bmp = getBitmap(photoToLoad.url);
              memoryCache.put(photoToLoad.url, bmp);
              if (imageViewReused(photoToLoad))
                  return;
              BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
              Activity a = (Activity) photoToLoad.imageView.getContext();
              a.runOnUiThread(bd);
          }
      }
  
      boolean imageViewReused(PhotoToLoad photoToLoad) {
          String tag = imageViews.get(photoToLoad.imageView);
          if (tag == null || !tag.equals(photoToLoad.url))
              return true;
          return false;
      }
  
      // Used to display bitmap in the UI thread
      class BitmapDisplayer implements Runnable {
          Bitmap bitmap;
          PhotoToLoad photoToLoad;
  
          public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
              bitmap = b;
              photoToLoad = p;
          }
  
          public void run() {
              if (imageViewReused(photoToLoad))
                  return;
              if (bitmap != null)
                  photoToLoad.imageView.setImageBitmap(bitmap);
              else
                  photoToLoad.imageView.setImageResource(stub_id);
          }
      }
  
      public void clearCache() {
          memoryCache.clear();
          fileCache.clear();
      }
  
  }
  </code></pre>
  
  <p><strong>DisplayFunction</strong> which is called in an Activity to show Image in ImageView from URL:</p>
  
  <pre><code>                        image_url = http://xxxx/bla.png;
                          image = (ImageView) findViewById(R.id.image);
  
                         ImageLoader imgLoader = new ImageLoader(this);
  
                          imgLoader.DisplayImage(image_url, image);
  </code></pre>
  
  <hr>
  
  <p><strong>This is what I tried so far:</strong></p>
  
  <p>In <em>ImageLoader</em> class within DisplayImage method:</p>
  
  <pre><code>public void DisplayImage(String url,
      // int loader,
              ImageView imageView) {
          // stub_id = loader;
          imageViews.put(imageView, url);
          Bitmap bitmap = memoryCache.get(url);
          if (bitmap != null) {
  
              int w = bitmap.getWidth();
              int h = bitmap.getHeight();
  
              if (w &gt; h) {
                  m = 90;
  
                  matrix = new Matrix();
  
                  matrix.postRotate(m);
                  bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                          bitmap.getHeight(), matrix, true);
  
                  imageView.setImageBitmap(bitmap);
              } else {
  
                  imageView.setImageBitmap(bitmap);
              }
  
          } else {
              queuePhoto(url, imageView);
              // imageView.setImageResource(loader);
          }
      }
  </code></pre>