Ich versuche, einfach eine einfache XML-Datei auf die SD-Karte zu schreiben. Dabei ist mir aufgefallen, dass mein Nexus 4 die Datei zwar schreibt, sie jedoch unter Windows 7 nicht über das MTP-Protokoll angezeigt werden kann.
code:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
CustomerQueryRqType customerQueryRequest = new CustomerQueryRqType();
Serializer serializer = new Persister();
File myFile = new File(Environment.getExternalStorageDirectory() + "/customerQueryRequest.xml");
try {
boolean created = myFile.createNewFile();
serializer.write(customerQueryRequest, myFile);
} catch (Exception e) {
e.printStackTrace();
}
}
Ich kann die Datei mit Astro File Manager auf dem Telefon selbst sehen:
aber Windows sieht es nicht ...:
adb Shell
im Verzeichnis zeigt:
ls -l
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Alarms
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Android
drwxrwxr-x root sdcard_rw 2012-11-21 19:30 DCIM
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Download
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Movies
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Music
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Notifications
drwxrwxr-x root sdcard_rw 2012-11-19 12:06 Pictures
drwxrwxr-x root sdcard_rw 1970-01-16 20:51 Podcasts
drwxrwxr-x root sdcard_rw 2012-11-19 13:22 Ringtones
drwxrwxr-x root sdcard_rw 2012-11-19 14:33 bluetooth
-rw-rw-r-- root sdcard_rw 79 2012-12-05 22:26 customerQueryRequest.xml
drwxrwxr-x root sdcard_rw 2012-11-20 02:50 data
-rw-rw-r-- root sdcard_rw 11394 2012-11-19 13:54 eightpen_custom_gestures
drwxrwxr-x root sdcard_rw 2012-11-19 13:17 media
Was ist mit meinem Nexus 4 los? Warum versteckt es meine Sachen vor Windows?
Scheint ein bekanntes Problem, das Android USB-Dateizugriff über MTP betrifft. Der MTP-Cache ist nicht mehr aktuell, bis das Telefon neu gestartet wird.
Ein Workaround ist:
Oder vermeiden Sie einfach die Verwendung von USB. Das Problem wirkt sich nicht auf andere Methoden für den Zugriff auf die Dateien aus. Versuchen Sie beispielsweise AirDroid , um Dateien zu übertragen.
Hinweis: Dies funktioniert nicht für Android 5.0.2: Nach dem Löschen von "Media Storage" und der Verwendung eines SD Rescanners werden die Ordner in Windows 7 als nicht öffnende 4K-Dateien angezeigt. Die einzige Lösung Es geht darum, Media Storage erneut zu löschen und das Gerät neu zu starten
Sie können den folgenden Code nach dem Schließen der Datei verwenden
MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);
Quelle: https://code.google.com/p/Android/issues/detail?id=38282
Nachdem ich mich stundenlang mit diesem Problem beschäftigt hatte, löste ich es folgendermaßen:
private void rescanFolder(String dest) {
// Scan files only (not folders);
File[] files = new File(dest).listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile();
}
});
String[] paths = new String[files.length];
for (int co=0; co< files.length; co++)
paths[co] = files[co].getAbsolutePath();
MediaScannerConnection.scanFile(activity, paths, null, null);
// and now recursively scan subfolders
files = new File(dest).listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
});
for (int co=0; co<files.length; co++)
rescanFolder(files[co].getAbsolutePath());
}
Die Sache ist, dass Sie scannen müssen nur Dateien (keine Ordner) und dann für jeden fub-Ordner rekursiv wiederholen
EDIT Wenn Sie nicht möchten, dass Bilder zu Ihrem Fotoalbum hinzugefügt werden (sondern nur Ihre Inhalte über das MTP-Protokoll angezeigt werden), denken Sie daran, sie zu platzieren ein leeres .nomedia
Datei in Ihrem Ordner, bevor Sie es erneut scannen, wie folgt:
new File(myFolder + File.separator + ".nomedia").createNewFile();
rescanFolder(myFolder);
Auf dem Xperia Z funktionierte der folgende Code einwandfrei:
String screenShotFile = "....";
activity.sendBroadcast(new Intent(
Intent.ACTION_MEDIA_MOUNTED, Uri
.fromFile(screenShotFile)));
ab 4.4 verwendung:
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
Uri.fromFile(screenShotFile)));
(Leider kann ich mich nicht erinnern, ob ich es gut genug getestet habe)
http://commonsware.com/blog/2013/11/06/Android-4p4-permission-regressions.html
bekanntmachung/Lagerung/emuliert. Android 4.2 enthält einige funky emulierte Dinge für den Zugriff pro App/Benutzer, z. B. eine separate/sdcard/für jeden Benutzer. Verschieben Sie die Datei nach/sdcard/anstelle der emulierten sdcard, die wird gezeigt.
Die beste Lösung für den in akzeptierte Antwort genannten Fehler ist das Kopieren von Daten von Android Betriebssystem auf einen anderen Computer/Server (Linux, MacOS, Windows) SSH.
Optional und empfohlen
Im Android Gerät
In der Maschine
rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/
SSHelper Version 8.5 Copyright 2014, P. Lutus Default password is "admin" (recommend: change it) [email protected]'s password: admin receiving incremental file list
Die anderen Vorschläge haben bei mir nicht funktioniert:
Der zur Beantwortung der Frage vorgeschlagene einfache Code Wie kann ich MediaStore auf Android aktualisieren? führt das erforderliche Update von MediaStore durch, wenn es aufgerufen wird, nachdem ich eine Datei auf einem externen Speicher abgelegt habe. Inhalte auf meinem Nexus 4 werden sofort im Windows 7-Datei-Explorer aktualisiert.
Hatte ein ähnliches Problem mit meinem OneplusOne:
Nach dem Software-Update (auf 6.0.1) konnte ich meine Kamerabilder beim Anschließen an den Computer (PTP und MTP) nicht sehen. Sowohl SDRescan als auch SDscanner der App hatten keine Wirkung.
Meine Lösung bestand darin, alle Bilder von DCIM mithilfe eines Terminals oder einer beliebigen Datei-Explorer-App auf dem Telefon in einen anderen Ordner zu kopieren. Beim Verbinden mit dem Computer konnte ich die kopierten Dateien sehen. Ich habe sie auf meinen Computer verschoben und meinen Kameraordner gelöscht. Keine dauerhafte Lösung, aber es hat das Problem für mich behoben, zumindest bis ich das nächste Backup mache. = D
Ich musste ein Verzeichnis erstellen und einige Beispieldateien für meine App kopieren. Nach vielen Experimenten und Recherchen hat bei mir folgendes Vorgehen einwandfrei funktioniert:
1) Erstelltes Verzeichnis mit File.mkdir ().
2) Kopieren Sie die Dateien in das Verzeichnis und führen Sie MediaScanner für jede Datei aus.
MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);
3) Führen Sie MediaScanner im Verzeichnis aus.
MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null);
Ergebnis: Die Dateien und das Verzeichnis werden sofort auf dem PC über MTP angezeigt.
Vor kurzem hatte ich das gleiche Problem, aber einige zusätzliche Nachforschungen halfen, versteckte Dateien zu finden. Es scheint, dass Google einige Änderungen in der Speicherstruktur vorgenommen hat. Alle diese Dateien wurden in einen anderen Ordner verschoben This Computer\HTC One\Internal Storage\storage\emulated\0
. Aber es ist seltsam, dass nicht alle Dateien verschoben wurden.
Android 4.4.2
In der Dokumentation hier müssen Sie MediaScannerConnection.scanFile aufrufen:
// Tell the media scanner about the new file so that it is
// immediately available to the user.
MediaScannerConnection.scanFile(this,
new String[] { file.toString() }, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
Log.i("ExternalStorage", "Scanned " + path + ":");
Log.i("ExternalStorage", "-> uri=" + uri);
}
});
Die obigen Antworten eignen sich gut zum Erstellen der Datei. Wenn Sie die Datei später löschen und möchten, dass diese Änderung auch übernommen wird, haben Sie folgende Möglichkeiten: Lassen Sie uns zunächst zwei Lösungen behandeln, die anscheinend funktionieren, auf einigen Geräten jedoch Probleme verursachen. Die erste ist das Scannen der gelöschten Datei:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
Dies funktioniert auf vielen Geräten für gelöschte Dateien, aber auf einigen Geräten wird tatsächlich eine neue 0-Byte-Datei erstellt, was wahrscheinlich nicht das ist, was Sie wollen. In diesem Fall können Sie mit KitKat <4.4 Folgendes tun:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder)));
Wobei Ordner gleich file.getParentFile () ist. Leider wird in KitKat 4.4 und höher eine SecurityException ausgelöst, sodass Sie für diese Geräte versuchen können, direkt aus dem Media Store zu löschen:
final Uri externalFilesUri = Files.getContentUri("external");
context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()});
Ich habe dieses als Workaround für ACTION_MEDIA_MOUNTED getestet, das nicht mit KitKat funktioniert, und es funktioniert in meinen Tests auf dem Nexus 5.