1

ich diesen Code bin mit einem Bild kopieren mit documentFile.createFile()ContentResolver enthält nicht nur erstellt Bild in einer unmittelbaren Abfrage nach der Erstellung der Datei

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

Und das ist, wie ich Abfrage ContentResolver nach Bild erzeugt wird, zu Aktualisieren Sie sofort meine Bildergalerie mit dem Ergebnis der Abfrage, die Informationen zum neu erstellten Bild enthalten soll.

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

Aber sofortige Abfrage konnte neu erstelltes Bild nicht finden. Und wenn ich die Abfrage nach einem Moment erneut ausführen, ist das neu erstellte Bild im Ergebnis vorhanden.

Es scheint, dass Bereitstellung von Informationen für neu erstellte Bild dauert ContentResolver (wenn ContentResolver verantwortlich dafür ist) als würde im Hintergrund ausgeführt werden, während ich sofortige Abfrage ausführen.

Gibt es eine Methode oder einen Listener zu wissen, wenn das neu erstellte Bild von ContentResolver registriert wird?

+0

Kopieren Sie die Bilder in eine Async-Aufgabe oder in den Haupt-UI-Thread? – Rahulrr2602

+0

@ Rahulrr2602 Ja, siehe die Antwort. – Eftekhari

+0

Vielen Dank. Wenn ich die newcopyFile-Methode viele Male wiederhole, dann ist manchmal documentFileGoal gleich null. – Rahulrr2602

Antwort

1

Sie könnten this verwenden oder so habe ich einen Listener (Beobachter) zu ContentResolver c implementiert hanges, mit ContentObserver zu wissen, wann die richtige Zeit ist, um die Abfrage zum Abrufen des neu erstellten Bildes von ContentResolver zu starten.

Zuerst erstellen ContentObserver Klasse:

Diese Klasse wie der Name schon sagt uns, beobachtet keine inhaltlichen Veränderungen in der gewünschten Uri.

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

und am Ende des Kopiermethode Sie ContentObserver auf Ihre ContentResolver auf spezifische Uri einstellen könnten.

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

und vergessen Sie nicht, Ihren Beobachter abzumelden, sonst werden Sie Speicherleck Gesicht. Am liebsten wäre es am Ende meiner AsyncTask (onPostExecute).

getContentResolver().unregisterContentObserver(myObserver); 

Sie wählen könnten ContentObserver auf dem gewünschte Uri durch den gesamten App-Lebenszyklus haben, um zu benachrichtigen, wenn Medien wurden geändert, gelöscht oder eingefügt von außen oder innerhalb innerhalb der App.

Für diesen Ansatz könnten Sie Ihren Beobachter in der onResume() Lifecycle-Methode registrieren und die Registrierung in der onPause() Methode aufheben.

0

Leider i posted falscher Code

Wenn Sie Dateien auf Dateisystem Android fügen diese Dateien nicht automatisch von den MedaScanner abgeholt. Aber oft sollten sie sein.

So eine Datei Content-Provider

So manuell diesen Code verwenden, um hinzuzufügen: -

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

Weitere Methoden, dies zu tun und für Referenzbesuch dieser Seite: -

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

+0

Warum muss ich einen Artikel aus dem Medienspeicher löschen? Ich brauche nur einen Listener, damit 'ContentResolver' aktualisiert wird. – Eftekhari

+0

Datei wurde hinzugefügt, aber 'ContentProvider' war sich dessen nicht bewusst, was ich vermute, dass es aktiv ist (wahrscheinlich durchsucht alle Mediendateien und andere Sachen), um Informationen für neu erstellte Medien bereitzustellen. Ich brauchte also nur einen Observer ('ContentObserver'), um herauszufinden, wann' ContentResolver' mit dem neu erstellten Image fertig ist. Siehe meine Antwort und den angegebenen Link. Danke übrigens. – Eftekhari

Verwandte Themen