2

У меня есть Moto X Pure 2015 с Android 6.0 на доске. Перед обновлением до Android 6 мой код получения миниатюры последнего снятого изображения на внешнем хранилище отлично работает. Более того, этот код работает на всех проверенных мной устройствах (несколько десятков). Я не могу локализовать то, что было изменено в Android 6, чтобы таким образом сломать мой код. Все динамические разрешения предоставляются и «пишите на внешнее хранилище». Итак, вот что я делаю, чтобы получить эскиз. Сначала я запрашиваю курсор и получить _id первого основанного файла (Media - это просто контейнер некоторых данных, в том числе _id из основанного изображения):Images.Thumbnails.getThumbnail на Android 6 для файла на SD-карте возвращается 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 контейнер содержит это идентификатор):.

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

и растровый равна нулю ((((

я не нашел каких-либо изменений в Android 6 из Android 5 в ContentResolver и Images.Thumbnails частей Так что теперь я m застрял в этом вопросе.

+0

Кажется, вам нужно запросить разрешение во время выполнения: См. Http://stackoverflow.com/a/33618259/5778152 –

+0

Я запрашиваю все необходимые разрешения во время выполнения в начале приложения. Я дважды проверял чтение \ запись на внешнее хранилище - он предоставляется. – Grinchman

ответ

0

У меня была аналогичная проблема и найдено решение, я использую шаблон наблюдателя.

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

класс Image Модель

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); 
      } 
     }); 
    } 
} 

И все работает правильно :)