2

我在主板上安裝了Android 6.0的Moto X Pure 2015。在更新到Android 6之前,我在外部存儲器上獲取最後捕獲圖像的縮略圖的代碼工作正常。更重要的是,該代碼適用於我測試過的所有設備(幾十個)。我無法本地化Android 6中發生的變化,以這種方式破壞我的代碼。所有動態權限都被授予,並且「寫入外部存儲」。所以,這就是我所做的縮略圖。 首先,我查詢光標並獲得第一創辦文件的_id(媒體 - 它只是一些數據的容器,包括建立圖像的_id):Images.Thumbnails.getThumbnail on Android 6 for sd-card返回null

 Uri baseUri = Images.Media.EXTERNAL_CONTENT_URI; 
     Uri query = baseUri.buildUpon().appendQueryParameter("limit", "1").build(); 
     String[] projection = new String[] { ImageColumns._ID, ImageColumns.ORIENTATION, ImageColumns.DATE_TAKEN }; 

     String selection = ImageColumns.DATA + " like '%" + dirName + "%' AND " + ImageColumns.MIME_TYPE 
       + "='image/jpeg'"; 
     String order = ImageColumns.DATE_TAKEN + " DESC," + ImageColumns._ID + " DESC"; 

     Cursor cursor = null; 

     try 
     { 
      cursor = resolver.query(query, projection, selection, null, order); 
      if (cursor != null && cursor.moveToFirst()) 
      { 
       final long id = cursor.getLong(0); 
       externalMedia = new Media(id, cursor.getInt(1), cursor.getLong(2), ContentUris.withAppendedId(
         baseUri, id)); 
      } 
     } finally 
     { 
      if (cursor != null) 
      { 
       cursor.close(); 
      } 
     } 

現在,我試圖讓位圖與該_id圖像(externalMedia容器包含ID):

Bitmap bitmap = Images.Thumbnails.getThumbnail(resolver, externalMedia.id, Images.Thumbnails.MICRO_KIND, null); 

和位圖是空((((

我沒有發現來自Android的5 ContentResolver的和Images.Thumbnails部分Android中6的任何變化所以我現在米卡住這個問題。

+0

看起來您需要在運行時請求權限: 請參閱:http://stackoverflow.com/a/33618259/5778152 –

+0

我在運行時在應用程序啓動時請求所有必需的權限。我已經檢查了兩次讀\寫入外部存儲權限 - 它被授予。 – Grinchman

回答

0

我有類似的問題,並找到解決方案,我使用觀察員模式。

public interface IPhotoSavedObserver { 
    void onPhotoSaved(String path, Bitmap bitmap); 
} 

類圖片型號

public ImageModel(String path){ 
    this.mPath = path; 
    Bitmap bitmap = BitmapFactory.decodeFile(path); 
    ThumbnailSizeProvider sizeProvider = ThumbnailSizeProvider.getInstance(); 
    mThumbNail = ThumbnailUtils.extractThumbnail(bitmap,sizeProvider.getWidth(),sizeProvider.getHeight()); 
} 

public Bitmap getThumbNail() { 

    return mThumbNail; 
} 

public void initThumbnail(){ 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bitmap = BitmapFactory.decodeFile(mPath); 
      for(int i=0;i<10;i++) { 
       if (bitmap == null) { 
        try { 
         Thread.sleep(400); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        bitmap = BitmapFactory.decodeFile(mPath); 
       } 
       if(bitmap!=null) { 
        ThumbnailSizeProvider sizeProvider = ThumbnailSizeProvider.getInstance(); 
        mThumbNail = ThumbnailUtils.extractThumbnail(bitmap, sizeProvider.getWidth(), sizeProvider.getHeight()); 
        PhotoSavedObservable.getInstance().notifyObservers(getPath(), mThumbNail); 
        i=10; 
       } 
      } 
     } 
    }); 
    t.start(); 
} 
在我的適配器在getView方法

 ImageModel iModel = mItems.get(position); 
     mImagesMap.put(iModel.getPath(),imgView); 
     Bitmap thumb = iModel.getThumbNail(); 
     if(thumb == null) 
      iModel.initThumbnail(); 
     else 
      imgView.setImageBitmap(thumb); 

適配器從IPhotoSavedObserver

繼承
@Override 
public void onPhotoSaved(String path, final Bitmap bitmap) { 
    if(mImagesMap.containsKey(path)){ 
     final ImageView imgView = mImagesMap.get(path); 
     Activity activity = (Activity) getContext(); 
     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       imgView.setImageBitmap(bitmap); 
      } 
     }); 
    } 
} 

和所有工作正常:)