wake-up-neo.com

Nexus 4 zeigt keine Dateien über MTP an

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:

Screenshot

aber Windows sieht es nicht ...:

Screenshot

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?

76
moonlightcheese

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:

  • Löschen Sie die Daten der App "Media Storage"
  • Verwenden Sie den SDrescan oder den SD Scanner (funktioniert auch auf Android 4.4/5, verfügbar auf F-Droid =) App um ein Update zu erzwingen

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

71
Kevin Panko

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

43
Sathesh

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);
4
lviggiani

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

3
marcinj

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.

2
Adam Weld

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.

  • Stellen Sie sicher, dass das Gerät (Android) und der Computer (auf den Sie die Daten kopieren möchten) über die IP-Adresse oder den Hostnamen erreichbar sind, indem Sie sie beispielsweise mit demselben WLAN-Netzwerk verbinden.

Optional und empfohlen

  • Verbinden Sie das Android Gerät über USB-Tethering. Dies gewährleistet eine schnelle Geschwindigkeit aufgrund der Kabelverbindung und stellt sicher, dass beide IP-Adressen für einander sichtbar sind, da sich beide im selben Netzwerk befinden.

Im Android Gerät

  • Installieren Sie einen SSH-Server. SSHelper arbeitete wie ein Zauber
  • Führen Sie den SSHelper aus und rufen Sie die Registerkarte Konfiguration auf, um die IP-Adresse, den Port und das Kennwort abzurufen. Im folgenden Beispiel sind dies 192.168.1.5, 2222 und 'admin'.
  • Das Standardkennwort lautet admin. Wenn Sie es jedoch ändern möchten, klicken Sie nach dem Ändern auf die Schaltfläche "Server mit neuen Werten neu starten"

In der Maschine

  • Installieren Sie rsync. Wenn Ubuntu verwendet wird, ist es bereits standardmäßig installiert.
  • Öffnen Sie eine Shell und geben Sie den folgenden Befehl ein. Ändern Sie die IP-Adresse und den Port in Ihre Werte

rsync -avzhP --inplace --info=progress2 -e 'ssh -p 2222' 192.168.1.5:/storage/emulated/0/DCIM/Camera/ /home/username/path/to/pics/

  • sie erhalten die folgende Eingabeaufforderung, geben Sie Ihr Passwort ein

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:

  • Die Verwendung des USB-Speichermodus anstelle von MTP wird vom Gerät nicht unterstützt (wie bei vielen anderen neueren Geräten).
  • In meinem Betriebssystem (Android 6.0.1) gab es keine Möglichkeit, die App-Daten für "Media Storage" zu löschen.
  • Andere Methoden zum Freigeben von Dateien über das Netzwerk hatten ihre Nachteile. FTP stellt die Integrität der Dateien nicht sicher. Wenn die Verbindung getrennt wird, werden entweder alle Dateien überschrieben oder übersprungen, sodass eine der Dateien möglicherweise unvollständig ist. Andere Protokolle sind möglicherweise schwer zu installieren und andere Apps verwenden möglicherweise proprietäre Protokolle.
2

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.

2
stephan

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

1
Michael Saiz

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.

1
Chebyr

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

0
Aray

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

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.

0
Learn OpenGL ES