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:
mais Windows ne le voit pas ...:
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?
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:
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
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
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);
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
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é.
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.
Facultatif et recommandé
Dans le périphérique Android
Dans la machine
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
Les autres suggestions n'ont pas fonctionné pour moi:
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.
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
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.
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
À 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);
}
});
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.