1

Я использую этот код, чтобы скопировать изображение с помощью documentFile.createFile()ContentResolver не содержит только что созданный образ в немедленном запросе после создания файла

private void newcopyFile(File fileInput, String outputParentPath, 
          String mimeType, String newFileName) { 

     DocumentFile documentFileGoal = DocumentFile.fromTreeUri(this, treeUri); 

     String[] parts = outputParentPath.split("\\/"); 
     for (int i = 3; i < parts.length; i++) { 
      if (documentFileGoal != null) { 
       documentFileGoal = documentFileGoal.findFile(parts[i]); 
      } 
     } 
     if (documentFileGoal == null) { 
      Toast.makeText(MainActivity.this, "Directory not found", Toast.LENGTH_SHORT).show(); 
      return; 
     } 

     DocumentFile documentFileNewFile = documentFileGoal.createFile(mimeType, newFileName); 

     InputStream inputStream = null; 
     OutputStream outputStream = null; 
     try { 
      outputStream = getContentResolver().openOutputStream(documentFileNewFile.getUri()); 
      inputStream = new FileInputStream(fileInput); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 
     try { 
      if (outputStream != null) { 
       byte[] buffer = new byte[1024]; 
       int read; 
       if (inputStream != null) { 
        while ((read = inputStream.read(buffer)) != -1) { 
         outputStream.write(buffer, 0, read); 
        } 
       } 
       if (inputStream != null) { 
        inputStream.close(); 
       } 
       inputStream = null; 
       outputStream.flush(); 
       outputStream.close(); 
       outputStream = null; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

И это, как я запрашиваю ContentResolver после создания образа, чтобы немедленно обновите мою галерею изображений с результатом запроса, который должен содержать информацию о вновь созданном изображении.

cursorPhotos = MainActivity.this.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
        projectionsImages, 
        null, 
        null, 
        MediaStore.Images.Media.DATE_TAKEN + " DESC" 
      ); 

Но немедленный запрос не смог найти только что созданное изображение. И если я запустил запрос снова через мгновение, в результате получится новое созданное изображение.

Кажется, что информация для вновь созданного изображения занимает время для ContentResolver (если для этого отвечает ContentResolver), поскольку он будет работать в фоновом режиме, когда я запускаю немедленный запрос.

Есть ли способ или слушатель знать, когда только что созданное изображение зарегистрировано ContentResolver?

+0

Вы копируете изображения внутри задачи Async или основного потока пользовательского интерфейса? – Rahulrr2602

+0

@ Rahulrr2602 Да, см. Ответ. – Eftekhari

+0

Спасибо большое. Если я цикл цикл newcopyFile много раз, то иногда documentFileGoal имеет значение null. – Rahulrr2602

ответ

1

Вы можете использовать this, или так я использовал слушателя (наблюдателя) до ContentResolver c hanges, используя ContentObserver, чтобы узнать, когда подходящее время для запуска запроса для получения вновь созданного изображения с ContentResolver.

ContentObserver Сначала нужно создать класс:

Этот класс, как его имя говорит нам, отслеживающего изменения содержания в нашей желаемой Ури.

class MyObserver extends ContentObserver { 
    public MyObserver(android.os.Handler handler) { 
     super(handler); 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     this.onChange(selfChange, null); 
    } 

    @Override 
    public void onChange(boolean selfChange, Uri uri) { 
     //(SDK>=16) 
     // do s.th. 
     // depending on the handler you might be on the UI 
     // thread, so be cautious! 

     // This is my AsyncTask that queries ContentResolver which now 
     // is aware of newly created media file. 
     // You implement your own query here in whatever way you like 
     // This query will contain info for newly created image 
     asyncTaskGetPhotosVideos = new AsyncTaskGetPhotosVideos(); 
     asyncTaskGetPhotosVideos.execute(); 
    } 
} 

и в конце вашего метода копирования вы можете установить ContentObserver к вашему ContentResolver на конкретных Ури.

getContentResolver().registerContentObserver(
     MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
     true, 
     myObserver); 

и не забудьте отменить регистрацию своего наблюдателя, иначе вы столкнетесь с утечкой памяти. Я бы предпочел это в конце моей AsyncTask (onPostExecute).

getContentResolver().unregisterContentObserver(myObserver); 

Вы могли бы хотеть иметь ContentObserver на нужной Ури через весь ваш жизненный цикл приложения, чтобы уведомить, если Medias были изменены, удалены или вставлены снаружи или внутри внутри приложения.

Для этого подхода вы можете зарегистрировать своего наблюдателя в методе жизненного цикла onResume() и отменить его регистрацию в методе onPause().

0

К сожалению я отправил неверный код

При добавлении файлов в файловой системе Android, эти файлы не подхвачена MedaScanner автоматически. Но часто они должны быть.

Так, чтобы добавить файл поставщика контента вручную

Так используйте этот код: -

Intent intent = 
     new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
intent.setData(Uri.fromFile(file)); 
sendBroadcast(intent); 

Для более методов сделать это и для справки посещения этого сайта: -

http://www.grokkingandroid.com/adding-files-to-androids-media-library-using-the-mediascanner/

+0

Зачем мне нужно удалять предмет из магазина мультимедиа? Мне просто нужен прослушиватель для обновления ContentResolver. – Eftekhari

+0

Файл был добавлен, но «ContentProvider» не знал об этом, и я думаю, он активен (возможно, ищет все медиафайлы и другие материалы) для предоставления информации для вновь созданных носителей. Поэтому мне просто нужен Observer (ContentObserver), чтобы узнать, когда «ContentResolver» выполняется с получением вновь созданного изображения. См. Мой ответ и предоставленную ссылку. Спасибо, кстати. – Eftekhari

 Смежные вопросы

  • Нет связанных вопросов^_^