2013-05-06 14 views
5

Meine Anwendung lädt JPGs von einer Website mit dem DownloadManager herunter und speichert sie im Verzeichnis /sdcard/Android/name.app/, um in mehreren Fragmenten in der Anwendung verwendet zu werden. Der Download funktioniert großartig, aber die JPGs sind in der Gallery-Anwendung sichtbar, was ich nicht möchte, da sie nur Assets für meine Anwendung sind. Ich kann nicht herausfinden, wie sie nicht in der Gallery-Anwendung angezeigt werden. Ich habe sogar versucht, Nomedia-Dateien zu den Verzeichnissen hinzuzufügen, wenn sie erstellt werden. Jede Hilfe wäre willkommen!Verhindern, dass der Medienscanner JPGs scannt, die mit dem DownloadManager auf Android heruntergeladen wurden? (Entwickler)

DownloadManager myDownloadManager = (DownloadManager) myActivity.getSystemService(Context.DOWNLOAD_SERVICE); 
    Request myRequest = new Request(Uri.parse(episodeArtLink)); 
    myRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN); 
    myRequest.setVisibleInDownloadsUi(false); 
    myRequest.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, myFilename); 
    myDownloadManager.enqueue(myRequest); 

Die Probleme scheinen verursacht werden, weil MediaScanner die Bilder auf die Systemdatenbank erweitert, obwohl ich es nicht gebeten haben.

Ich habe eine Test-App erstellt, die das Problem demonstriert. Wenn Sie auf die Schaltfläche Download klicken, wird das Google-Logo in der App angezeigt. Wenn Sie in die Galerie-App gehen, sollten Sie auch das Google-Logo in einer Galerie namens Download sehen. Wenn Sie auf Einstellungen -> Apps gehen und die Daten für Galerie und Medienspeicher löschen, ist das Google Logo verschwunden und wird nicht mehr in der Galerie angezeigt, da sich die Datei unter/sdcard/Android/data/befindet .nomedia-Datei. Sie können unter /sdcard/Android/data/com.example.downloadmanagertest/files/Download/ nachsehen, ob die Bilder noch auf dem Telefon sind. Auch nach einem Neustart werden die Bilder nicht in der Galerie angezeigt, wenn Sie die Daten für Galerie und Medienspeicher löschen. Ich habe dies sowohl auf einem Nexus 4 als auch auf einem Nexus 7 mit 4.2.2 getestet.

Quelle: https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

+0

Ich denke, dass diese Frage mehr "generisch" sein sollte. Ich hatte ein ähnliches Problem, als ich TomTom installierte: Tausende von Icons erschienen in meiner Galerie! Gibt es eine Möglichkeit, einen Ordner aus der Galerie "auszublenden"? – AndreaCi

+0

Dies ist nicht für eine Anwendung, die ich heruntergeladen habe, ist es für eine Anwendung, die ich entwickle. Ich möchte nicht, dass jeder, der die Anwendung heruntergeladen hat, selbstständig arbeiten muss. – notkevin

+0

Haben Sie versucht, Bilder in einen Ordner herunterzuladen, der keine Mediendatei enthält (Datei mit dem Namen .nomedia)? Diese Datei muss das Durchsuchen von Dateien im Ordner verhindern. –

Antwort

5

Lösung

Der Scanner Medien wird schließlich früher oder später scannen die Medienkarte für Medien und indizieren. Der erste intuitive Schritt besteht darin, den Scanner dazu zu verleiten, nicht zu wissen, dass die Datei eine Mediendatei ist. Dies kann durch Speichern der Bilder ohne die Erweiterung erreicht werden. Eine einfache Lösung wäre es, Notkevin an das Ende des Dateinamens anhängen. Einfach gesagt:

Statt

von
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, Uri.parse(downloadLink).getLastPathSegment()); 

verwenden

String filename = Uri.parse(downloadLink).getLastPathSegment() + "notkevin"; 
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, filename); 

Jedoch ist dies in Ihrem Fall nicht ausreichend, da Sie den Downloadmanager verwenden (nur eine Vermutung). Der Medienscanner weiß irgendwie von dem heruntergeladenen Objekt und der Tatsache, dass es ein Bild ist, und indiziert es somit. Um nicht zulassen es, verwenden setMimeType wie folgt aus:

myRequest.setMimeType("application/octet-stream"); 

PS: Es sind Möglichkeiten, um die Erweiterung zu ändern, um andere als du deine oder meinen Namen an das Ende des Dateinamens. Zum Beispiel könnten Sie die Dateinamen

String filename = hash(Uri.parse(downloadLink).getLastPathSegment()); 

public String hash(String victim) throws NoSuchAlgorithmException 
{ 
    MessageDigest md = MessageDigest.getInstance("SHA1"); 
    md.reset(); 
    byte[] buffer = victim.getBytes(); 
    md.update(buffer); 
    byte[] digest = md.digest(); 

    StringBuilder hexStr = new StringBuilder(); 
    for (int i = 0; i < digest.length; i++) { 
     hexStr.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return hexStr.toString(); 
} 
+1

Vielen Dank! Es scheint, dass Ihre Lösung das Problem gelöst hat. Ich habe am Ende die Dateien auf dem Gerät ohne die Erweiterung .jpg gespeichert. – notkevin

0

Präfix Ordnernamen mit einem Punkt (/sdcard/Android/name.app/.photos/). Wenn das nicht funktioniert, versuchen Sie, Ihren Ordner zu verbergen.

+0

Ich habe versucht, die Dateien in ein Verzeichnis wie .Fotos herunterzuladen, aber das funktioniert immer noch nicht. Obwohl ich "allowScanningByMediaScanner()" nicht gesetzt habe, fügt der DownloadManager die Dateien immer noch dem MediaScanner hinzu. Wenn ich den Speicher für die Medienspeicher-App lösche, werden die Bilder nicht erneut gefunden. Wie kann ich verhindern, dass der MediaScanner die Bilder beim Herunterladen sieht? – notkevin

0

https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java

Schauen Sie sich die Methoden mit Namen wie getphoto, GetBitmap in dem obigen Link Hash.Das LazyLoader github-Projekt verfügt über alle Methoden, die Sie verwenden müssen, um mithilfe von Vorschlägen in anderen Antworten Medien aus dem WEB in den Cache (Speicher, Dateisystem) zu bringen und Bitmaps zu verwenden, die Sie in Ihrer App benötigen.

In den Filesinks, in denen die Bitmaps persistent sind, nehmen Sie einfach fileNames an, die von Ihrem Medienscanner erkannt werden, wie von Ihren Modulen benötigt, ABER NICHT ERKENNEN.

das sollte es tun.

2

Ich habe seit ein paar Tagen bei diesem Problem gewesen. Ich habe fast jede Kombination aus dem Erstellen hidden directories, using different extensions, .nomedia Dateien in root and image directories directories, Erstellen der .nomediabefore the download, renaming directory (back and forth) versucht.

Leider scheint keiner von diesen für mich (auf dem Nexus 4) zu funktionieren. Nach meinem Verständnis führt der MediaScanner beim Booten des Telefons oder beim Einbinden des externen Speichers nur eine erneute Überprüfung durch. Bei einem Nexus 4 (oder einem anderen Gerät, das keinen SD-Kartensteckplatz hat) erfolgt diese Montage nur zur Bootzeit.

Dateien mit dem Android Download Manager heruntergeladen werden jedoch sofort gescannt (obwohl sie shouldn't sein) und in der Galerie platziert. Selbst wenn Sie die .nomedia Datei haben, enden sie immer noch in der Galerie. Das Deinstallieren der App hilft nicht, da Thumbnails immer noch zwischengespeichert werden (Sie können sie ohne Neustart entfernen, indem Sie den Cache und die Daten löschen und das Schließen der Galerie- und Medienspeicher-Apps in den Einstellungen erzwingen). Wenn Sie das Smartphone neu starten, überprüft Android den externen Speicher erneut, erkennt, dass eine .nomedia Datei vorhanden ist, und entfernt sie dann aus der Galerie.

Also dieser Neustart/Rescan irgendwie behebt das Problem. Aber wir wollen nicht ständig werden, um Benutzer zu fragen Sie das Telefon so, anstatt neu zu starten, was für mich gearbeitet wurde Android zu zwingen, den externen Speicher nach dem erfolgreichen Download mit neu scannen:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

Was ich von Darshan's Antwort auf ein bekam ähnliche Frage und Jon.

Ich richte einen Broadcast-Empfänger ein, um auf downloads zu hören, und wenn sie erfolgreich sind, sende ich die Sendung. Scheint zu funktionieren - heruntergeladene Bilder in meiner App erscheinen nicht mehr in der Galerie.

0

Sie können auch Ihren gesamten Ordner so einstellen, dass er vom Scanner nicht verändert wird, ohne dass Ihre Dateierweiterungen geändert werden müssen. Bitte beachten Sie die ".nomedia" -Datei in dieser link;

Verstecken Sie Ihre Dateien aus dem Media-Scanner

Fügen Sie eine leere Datei mit dem Namen .nomedia in externen Dateien Verzeichnis (man beachte den Punkt Präfix im Dateinamen). Dies verhindert, dass Medien Scanner von Mediendateien zu lesen und sie in anderen Anwendungen durch die Mediastor Content-Provider bereitstellt. Wenn Ihre Dateien jedoch wirklich privat für Ihre App sind, sollten Sie sie in einem privaten App-Verzeichnis speichern.