Nexus 4 zeigt keine Dateien über MTP an

79

Ich versuche einfach eine einfache XML-Datei auf die SD-Karte zu schreiben und habe festgestellt, 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:

Bildschirmfoto

aber Windows sieht es nicht ...:

Bildschirmfoto

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 los mit meinem Nexus 4? Warum versteckt es meine Sachen vor Windows?

Mondscheinkäse
quelle
Ich dachte, ich mache etwas falsch. Jetzt weiß ich, dass ich nicht allein bin.
NeverMind9

Antworten:

72

Scheint ein bekanntes Problem zu sein, das den Zugriff auf Android-USB-Dateien über MTP betrifft . Der MTP-Cache ist bis zu einem Neustart des Telefons veraltet.

Eine Problemumgehung ist:

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

Oder vermeiden Sie einfach die Verwendung von USB. Das Problem betrifft keine anderen Methoden für den Zugriff auf die Dateien. Versuchen Sie beispielsweise AirDroid , 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 zu öffnende 4K-Dateien angezeigt. Die einzige Lösung zu diesem Zeitpunkt besteht darin, den Medienspeicher erneut zu löschen und das Gerät neu zu starten

Kevin Panko
quelle
2
Installieren Sie SDrescan, führen Sie es aus: behoben! Vielen Dank
PiTheNumber
Das war vorher nicht so, aber heute schon. Übrigens sollte ein Neustart IDK funktionieren, warum es nicht funktioniert.
Muhammad Babar
Es ist seltsam, nachdem das Telefon dreimal neu gestartet wurde.
Muhammad Babar
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 zu öffnende 4K-Dateien angezeigt. Die einzige Lösung zu diesem Zeitpunkt besteht darin, den Medienspeicher erneut zu löschen und das Gerät neu zu starten.
Antonio
Dies funktionierte auch nicht unter Nexus 7 Android 4.4.2. Mein Mac meldet, dass mein benutzerdefiniertes Verzeichnis eine 4k-Datei ist.
Joe Lapp
44

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

Sathesh
quelle
11
Perfekt. Dies sollte die Lösung für diese Frage sein.
Zauberer
Diese Lösung funktioniert bei mir nicht auf einem Nexus 7, Android 4.4.2, das eine Verbindung zu einem Mac herstellt. Ich erstelle einen neuen Ordner im externen Speicher und speichere Dateien in diesem Ordner. Wenn ich dies nur für die Dateien im Ordner ausführe, zeigt der Mac nichts an. Wenn ich es auch in meinem neuen Verzeichnis ausführe, zeigt der Mac an, dass mein Verzeichnis eine 4k-Datei ist (und kein Verzeichnis). Ich habe auch versucht, context.sendBroadcast()ohne Wirkung anzurufen.
Joe Lapp
Ich habe nur mit Medienscans und Broadcast-Dateien herumgespielt, die im Standard-Download-Verzeichnis erstellt wurden, und sie wurden beim Herstellen einer Verbindung zum Mac nie angezeigt.
Joe Lapp
Ah. Dies ist mit onDestroy () nicht möglich. Es funktioniert, wenn ich es woanders mache. Ich kann es zum Zeitpunkt der Erstellung der Datei tun, aber dann zeigt der Desktop-Dateibrowser eine Größe von null Bissen an. Wenn ich die Datei kopiere, kopiert sie trotzdem die gesamte Datei.
Joe Lapp
Funktioniert mit 8.1. Gelöschte Dateien verschwinden erst nach dem Neustart. Damit werden mindestens geschriebene Dateien sofort im Dateibrowser des gemounteten Systems angezeigt.
Midson
5

Nachdem ich Stunden mit diesem Problem verbracht 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 nur Dateien scannen müssen (keine Ordner) und dann für jeden Fubfolder rekursiv wiederholen müssen

BEARBEITEN Wenn Sie nicht möchten, dass Bilder zu Ihrem Fotoalbum hinzugefügt werden (sondern nur Ihr Inhalt über das MTP-Protokoll angezeigt wird), müssen .nomediaSie vor dem erneuten Scannen eine leere Datei in Ihren Ordner legen:

new File(myFolder + File.separator + ".nomedia").createNewFile();
rescanFolder(myFolder);
lviggiani
quelle
Sehr nützliche Antwort, ich konnte es rekursiv verwenden und jetzt sehe ich alle neu erstellten Dateien über MTP. Wie geht man mit der Entbindung des Dienstes um? Ich erhalte die Meldung ServiceConnectionLeaked: "Die Aktivität hat ServiceConnection android.media.MediaScannerConnection@42164d98 durchgesickert, die ursprünglich hier gebunden war." Irgendeine Idee, wie man es löst, da MediaScannerConnection.scanFolder () statisch verwendet wird, gibt es keine Chance, den gebundenen Dienst zu trennen () ...
Andre
3

Auf dem Xperia Z hat der folgende Code einwandfrei funktioniert:

  String screenShotFile = "....";
  activity.sendBroadcast(new Intent(
        Intent.ACTION_MEDIA_MOUNTED, Uri
                .fromFile(screenShotFile)));

für 4.4+ verwenden:

activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                                Uri.fromFile(screenShotFile)));

(Leider erinnere ich mich nicht, ob ich es gut genug getestet habe)

http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html

marcinj
quelle
3

Die beste Problemumgehung für den in der akzeptierten Antwort erwähnten Fehler besteht darin, Daten mit SSH von einem Android-Betriebssystem auf einen anderen Computer / Server (Linux, MacOS, Windows) zu kopieren.

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

Optional und empfohlen

  • Schließen Sie das Android-Gerät über USB-Tethering an. Dies gewährleistet eine schnelle Geschwindigkeit aufgrund der Kabelverbindung und garantiert, 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 auf 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 Option zum Löschen der App-Daten für "Medienspeicher".
  • Andere Methoden zum Freigeben von Dateien über das Netzwerk hatten ihre Nachteile. FTP gewährleistet nicht die Integrität der Dateien. Wenn die Verbindung getrennt wird, werden alle Dateien entweder ü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.
Bio-Anwalt
quelle
2

Bekanntmachung / Speicherung / emuliert. In Android 4.2 gibt es einige funky emulierte Dinge für den App- / Benutzerzugriff, zum Beispiel eine separate / sdcard / für jeden Benutzer. Versuchen Sie, die Datei nach / sdcard / anstelle der angezeigten emulierten SD-Karte zu verschieben.

Adam Weld
quelle
11
Alles ist /storage/emulated/legacysowieso ein Link zu , der selbst ein Link ist, zu /mnt/shell/emulated/0dem die Datei enthält.
Moonlightcheese
2

Der einfache Code, der zur Frage vorgeschlagen wurde Wie kann ich MediaStore unter Android aktualisieren? führt das erforderliche Update von MediaStore durch, wenn es aufgerufen wird, nachdem ich eine Datei in einem externen Speicher abgelegt habe. Der Inhalt meines Nexus 4 wird im Windows 7-Datei-Explorer sofort aktualisiert.

stephan
quelle
Ich habe gerade erfahren, dass die Aktualisierung möglicherweise irgendwann eingestellt wird.
stephan
1

Ich musste ein Verzeichnis erstellen und einige Beispieldateien für meine App kopieren. Nach vielen Experimenten und Recherchen hat das folgende Verfahren für mich 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.

Chebyr
quelle
Das Scannen sowohl des Verzeichnisses als auch der erstellten Datei hat bei mir funktioniert. Sie können die beiden Aufrufe auch kombinieren, indem Sie ein String [] -Array aus zwei Elementen vorbereiten, in dem sowohl die Datei als auch das übergeordnete Element aufgelistet sind. Siehe auch stackoverflow.com/a/25086535/911550
parvus
1

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 der SDRescan als auch der SDscanner der App hatten keine Auswirkung.

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 Herstellen einer Verbindung zum 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.

Michael Saiz
quelle
0

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, können Sie einen der folgenden Schritte ausführen: Lassen Sie uns zunächst zwei Lösungen behandeln, die anscheinend funktionieren, bei einigen Geräten jedoch Probleme verursachen. Der erste besteht darin, die gelöschte Datei zu scannen:

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 Folgendes tun, wenn Sie mit <4.4 KitKat arbeiten:

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder)));

Wobei Ordner gleich file.getParentFile () ist. Unter KitKat 4.4 und höher wird leider eine SecurityException ausgelöst. Bei diesen Geräten können Sie versuchen, sie 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 Programm als Problemumgehung für ACTION_MEDIA_MOUNTED getestet, das nicht mit KitKat funktioniert, und es funktioniert in meinen Tests auf dem Nexus 5.

Lernen Sie OpenGL ES
quelle
0

Vor kurzem hatte ich das gleiche Problem, aber einige zusätzliche Nachforschungen haben geholfen, versteckte Dateien zu finden. Es scheint, dass Google einige Änderungen an 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

Aray Karjauv
quelle
0

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