Nexus 4 ne montrant pas les fichiers via MTP

J’essaie d’écrire simplement un simple fichier XML 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:

Capture d'écran

mais Windows ne le voit pas …:

Capture d'écran

adb shell sur l’annuaire 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 sous Windows?

Semble être un problème connu affectant l’access aux fichiers USB Android sur MTP . Le cache MTP est obsolète jusqu’au redémarrage du téléphone.

Une solution de contournement est la suivante:

  • Effacer les données de l’application “Media Storage”
  • Utilisez l’application SDrescan ou SD Scanner (fonctionne également sur Android 4.4 / 5, disponible sur F-Droid ) pour forcer la mise à jour

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


Note: Cela ne fonctionne pas pour Android 5.0.2: Après avoir effacé “Media Storage” et en utilisant un SD Rescanner, les dossiers apparaissent dans Windows 7 en tant que fichiers 4K non ouverts. La seule solution à ce stade consiste à effacer à nouveau Media Storage et à redémarrer le périphérique.

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

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

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

Sur Xperia Z ci-dessous, le code fonctionnait très bien:

  Ssortingng 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

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

 private void rescanFolder(Ssortingng dest) { // Scan files only (not folders); File[] files = new File(dest).listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isFile(); } }); Ssortingng[] paths = new Ssortingng[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 

La chose est que vous devez parsingr les fichiers uniquement (pas les dossiers) et puis répétez de manière récursive pour chaque dossier fubfolder

EDIT Par ailleurs, si vous ne souhaitez pas que les images soient ajoutées à votre album photo (mais uniquement à votre contenu sur le protocole mtp), pensez à placer un fichier .nomedia vide dans votre dossier avant de le réparsingr, comme ceci:

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

notice / stockage / émulé. Android 4.2 propose des fonctionnalités d’application / d’utilisateur émulées et géniales, par exemple une carte séparée / sdcard / pour chaque utilisateur. Essayez de déplacer le fichier dans / sdcard / au lieu de la carte SD émulée affichée.

Le code simple proposé pour interroger Comment puis-je rafraîchir MediaStore sur Android? effectue 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.

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 fonctionné sans problème pour moi:

1) Répertoire créé avec File.mkdir ().

2) Les fichiers copiés dans le répertoire et exécutez MediaScanner sur chaque fichier.

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

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

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

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

J’ai eu un problème similaire avec mon OneplusOne:

Après la mise à jour du logiciel (vers la version 6.0.1), je ne pouvais pas voir les images de ma caméra lors de la connexion à l’ordinateur (PTP et MTP). Les deux SDRescan et SDscanner de l’application n’ont eu aucun effet.

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

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

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

Facultatif et recommandé

  • Connectez l’appareil Android à l’aide du partage de connexion USB. Cela garantit une vitesse rapide grâce à la connexion filaire et garantit que les deux adresses IP sont visibles les unes des autres car elles sont toutes deux sur le même réseau.

Dans l’appareil Android

  • Installez un serveur SSH. SSHelper a fonctionné comme un charme
  • Exécutez SSHelper et accédez à l’onglet de configuration pour obtenir l’adresse IP, le port et le mot de passe. Dans l’exemple ci-dessous, ils sont 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 les nouvelles valeurs” après l’avoir modifié.

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. Changer l’adresse IP et le port en 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) username@192.168.1.5'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 de nombreux autres périphériques plus récents).
  • Il n’y avait pas d’option dans mon système d’exploitation (Android 6.0.1) pour effacer les données d’application “Media Storage”.
  • Les autres méthodes de partage de fichiers sur le réseau avaient leurs inconvénients. FTP n’assure pas l’intégrité des fichiers. Si la connexion est interrompue, elle écrase ou ignore tous les fichiers, de sorte que l’un des fichiers peut être incomplet. D’autres protocoles peuvent être difficiles à installer et d’autres applications peuvent utiliser des protocoles propriétaires.

Les réponses ci-dessus conviennent pour créer le fichier. Si vous supprimez ultérieurement le fichier et souhaitez que cette modification soit également prise en compte, vous pouvez effectuer l’une des opérations suivantes: couvrons d’abord deux solutions qui semblent fonctionner, mais qui poseront des problèmes sur certains appareils. Le premier consiste à parsingr 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 le faire:

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

Où dossier est égal à file.getParentFile (). Malheureusement, sur KitKat 4.4 et les versions ultérieures, une exception SecurityException sera lancée. Par conséquent, pour ces périphériques, vous pouvez supprimer directement depuis le Media Store:

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

J’ai testé celui-ci comme solution de contournement pour ACTION_MEDIA_MOUNTED ne fonctionnant pas sur KitKat, et cela fonctionne dans mes tests sur le Nexus 5.

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é des 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

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 Ssortingng[] { file.toSsortingng() }, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(Ssortingng path, Uri uri) { Log.i("ExternalStorage", "Scanned " + path + ":"); Log.i("ExternalStorage", "-> uri=" + uri); } });