web-dev-qa-db-fra.com

Nexus 4 ne montrant pas les fichiers via MTP

J'essaie simplement d'écrire un fichier XML simple sur la carte SD et j'ai remarqué que mon Nexus 4 écrit le fichier, mais il n'est pas visible via le protocole MTP sous Windows 7.

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

Je peux voir le fichier sur le téléphone lui-même avec Astro File Manager:

Screenshot

mais Windows ne le voit pas ...:

Screenshot

adb Shell sur le répertoire montre:

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

Que se passe-t-il avec mon Nexus 4? Pourquoi cache-t-il mes affaires à Windows?

76
moonlightcheese

Cela semble être un problème connu affectant Android Accès aux fichiers USB via MTP . Le cache MTP devient obsolète jusqu'au redémarrage du téléphone.

A solution de contournement est:

  • Effacer les données de l'application "Media Storage"
  • Utilisez le SDrescan ou le SD Scanner (fonctionne également sur Android 4.4/5, disponible sur le F-Droid =) app pour forcer une mise à jour

Ou évitez tout simplement d'utiliser l'USB. Le problème n'affecte pas les autres méthodes d'accès aux fichiers. Par exemple, essayez AirDroid pour transférer des fichiers.


Remarque: cela ne fonctionne pas pour Android 5.0.2: après avoir effacé "Stockage multimédia" et utilisé un rescanner SD, les dossiers apparaissent dans Windows 7 sous la forme de fichiers 4K inopérables. le point est d'effacer une fois de plus le stockage multimédia et redémarrer l'appareil

71
Kevin Panko

Vous pouvez utiliser le code suivant après la fermeture du fichier

MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);

Source: https://code.google.com/p/Android/issues/detail?id=38282

43
Sathesh

Après avoir passé des heures sur ce problème, j'ai résolu ce problème:

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

Le problème est que vous devez analyser fichiers uniquement (pas les dossiers), puis le répéter de manière récursive pour chaque dossier.

EDIT De plus, si vous ne voulez pas que des photos soient ajoutées à votre album photo (mais que votre contenu apparaisse via le protocole mtp), n'oubliez pas de placer un vide .nomedia fichier dans votre dossier avant de le réanalyser, comme ceci:

new File(myFolder + File.separator + ".nomedia").createNewFile();
rescanFolder(myFolder);
4
lviggiani

Sous Xperia Z, le code ci-dessous a parfaitement fonctionné:

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

pour 4.4+ utilisation:

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

(malheureusement, je ne me souviens pas si je l’ai assez bien testé)

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

3
marcinj

avis/stockage/émulé. Android 4.2 contient des options géniales d'accès par application/utilisateur, par exemple une carte distincte/sdcard/pour chaque utilisateur. Essayez de déplacer le fichier vers/sdcard/au lieu de la carte sd émulée est montré.

2
Adam Weld

La meilleure solution de contournement que j'ai trouvée pour le bogue mentionné dans le réponse acceptée consiste à copier les données de Android du système d'exploitation vers une autre machine/serveur (Linux, MacOS, Windows) à l'aide de SSH.

  • Assurez-vous que le périphérique (Android) et la machine (où vous souhaitez copier les données) sont accessibles par adresse IP ou nom d'hôte, par exemple en les connectant au même réseau wifi.

Facultatif et recommandé

  • Connectez le périphérique Android à l’aide du partage de connexion USB. Ceci garantit une vitesse élevée du fait de la connexion filaire et garantit que les deux adresses IP sont visibles l’une l’autre étant donné que les deux sont sur le même réseau.

Dans le périphérique Android

  • Installez un serveur SSH. SSHelper a travaillé comme un charme
  • Exécutez SSHelper et accédez à l’onglet Configuration pour obtenir l’adresse IP, le port et le mot de passe. Dans l'exemple ci-dessous, il s'agit de 192.168.1.5, 2222 et "admin".
  • Le mot de passe par défaut est admin, mais si vous décidez de le changer, cliquez sur le bouton "Redémarrer le serveur avec de nouvelles valeurs" après l'avoir changé.

Dans la machine

  • Installez rsync. Si vous utilisez Ubuntu, il est déjà installé par défaut.
  • Ouvrez un shell et tapez la commande suivante. Changez l'adresse IP et le port à vos valeurs

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

  • vous obtiendrez l'invite suivante, entrez votre mot de passe

SSHelper Version 8.5 Copyright 2014, P. Lutus Default password is "admin" (recommend: change it) [email protected]'s password: admin receiving incremental file list

Les autres suggestions n'ont pas fonctionné pour moi:

  • L'utilisation du mode de stockage USB au lieu de MTP n'est pas prise en charge par le périphérique (comme pour beaucoup d'autres périphériques plus récents).
  • Mon système d'exploitation (Android 6.0.1) ne permettait pas d'effacer les données de l'application "Stockage multimédia".
  • D'autres méthodes de partage de fichiers sur le réseau présentaient des inconvénients. FTP n'assure pas l'intégrité des fichiers. Si la connexion est interrompue, elle écrase ou ignore tous les fichiers. L'un des fichiers peut donc être incomplet. D'autres protocoles peuvent être difficiles à installer et d'autres applications peuvent utiliser des protocoles propriétaires.
2
Organic Advocate

Le code simple proposé à la question Comment puis-je actualiser MediaStore sur Android? fait la mise à jour nécessaire de MediaStore, si elle est appelée après avoir placé un fichier sur un stockage externe. Le contenu de mon Nexus 4 est actualisé instantanément dans l'explorateur de fichiers Windows 7.

2
stephan

Avait un problème similaire avec mon OneplusOne:

Après la mise à jour du logiciel (à la version 6.0.1), je ne pouvais pas voir les images de mon appareil photo lors de la connexion à l'ordinateur (PTP et MTP). SDRescan et SDscanner des deux applications n'ont eu aucun effet.

Ma solution consistait à copier toutes les images de DCIM dans un autre dossier à l'aide d'un terminal ou de n'importe quelle application de l'explorateur de fichiers du téléphone. Lors de la connexion à un ordinateur, j'ai pu voir les fichiers copiés. Je les ai déplacés vers mon ordinateur et j'ai effacé le dossier de mon appareil photo. Pas de solution permanente mais cela a résolu le problème pour moi au moins jusqu'à ce que je fasse la sauvegarde suivante. = D

1
Michael Saiz

Je devais créer un répertoire et copier des exemples de fichiers pour mon application. Après de nombreuses expériences et recherches, la procédure suivante a parfaitement fonctionné pour moi:

1) Répertoire créé en utilisant File.mkdir ().

2) Copiez les fichiers dans le répertoire et exécutez MediaScanner sur chaque fichier.

MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);

3) Exécutez MediaScanner sur le répertoire.

MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null);

Résultat: les fichiers et le répertoire apparaissent instantanément sur PC via MTP.

1
Chebyr

Récemment, j'ai rencontré le même problème, mais des recherches supplémentaires ont permis de trouver des fichiers cachés. Il semble que Google ait apporté quelques modifications à la structure de stockage. Tous ces fichiers ont été déplacés vers un autre dossier This Computer\HTC One\Internal Storage\storage\emulated\0. Mais il est étrange que tous les fichiers n'aient pas été déplacés.

Android 4.4.2

0
Aray

À partir de la documentation ici , vous devez appeler MediaScannerConnection.scanFile:

// 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

Les réponses ci-dessus conviennent à la création du fichier. Si vous supprimez ultérieurement le fichier et souhaitez que cette modification soit également prise en compte, vous pouvez procéder de l'une des manières suivantes: Voyons d'abord deux solutions qui semblent fonctionner, mais qui poseront des problèmes sur certains appareils. La première consiste à analyser le fichier supprimé:

context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));

Cela fonctionne sur de nombreux périphériques pour les fichiers supprimés, mais sur certains périphériques, un nouveau fichier de 0 octet sera créé, ce qui n'est probablement pas ce que vous voulez. Dans ce cas, si vous utilisez <4.4 KitKat, vous pouvez procéder comme suit:

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

Où folder est égal à file.getParentFile (). Malheureusement, sous KitKat 4.4 et versions ultérieures, une exception SecurityException sera levée. Pour ces périphériques, vous pouvez essayer de supprimer directement à partir du Media Store:

final Uri externalFilesUri = Files.getContentUri("external");
context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()});

J'ai testé celui-ci en guise de solution de contournement car ACTION_MEDIA_MOUNTED ne fonctionne pas sur KitKat, et cela fonctionne lors de mes tests sur le Nexus 5.

0
Learn OpenGL ES