Próbuję po prostu zapisać prosty plik XML na kartę SD i zauważyłem, że mój Nexus 4 zapisuje plik, ale nie można go przeglądać za pomocą protokołu MTP w systemie Windows 7.
kod:
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();
}
}
Widzę plik w telefonie za pomocą Astro File Manager:
ale Windows tego nie widzi ...:
adb shell
w katalogu pokazuje:
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
Co się dzieje z moim Nexusem 4? Dlaczego ukrywa moje rzeczy przed systemem Windows?
Odpowiedzi:
Wydaje się, że jest to znany problem wpływający na dostęp do plików USB w systemie Android przez protokół MTP . Pamięć podręczna MTP staje się nieaktualna do momentu ponownego uruchomienia telefonu.
Obejście jest:
Lub po prostu unikaj używania USB. Problem nie dotyczy innych metod uzyskiwania dostępu do plików. Na przykład spróbuj AirDroid do przesyłania plików.
Uwaga: to nie działa w systemie Android 5.0.2: po wyczyszczeniu „Media Storage” i użyciu skanera SD Rescanner foldery pojawiają się w systemie Windows 7 jako nieotwarte pliki 4K. Jedynym rozwiązaniem w tym momencie jest ponowne wyczyszczenie Media Storage i ponowne uruchomienie urządzenia
źródło
Możesz użyć następującego kodu po zamknięciu pliku
MediaScannerConnection.scanFile(this, new String[] { file.getAbsolutePath() }, null, null);
Źródło: https://code.google.com/p/android/issues/detail?id=38282
źródło
context.sendBroadcast()
bez skutku.Po spędzeniu godzin na tym problemie rozwiązałem tak:
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()); }
Chodzi o to, że musisz skanować tylko pliki (nie foldery), a następnie powtarzać rekurencyjnie dla każdego fubfolderu
EDYTUJ Ponadto, jeśli nie chcesz, aby zdjęcia były dodawane do albumu ze zdjęciami (ale tylko zawartość była wyświetlana w protokole mtp), pamiętaj, aby umieścić pusty
.nomedia
plik w folderze przed ponownym skanowaniem, na przykład:new File(myFolder + File.separator + ".nomedia").createNewFile(); rescanFolder(myFolder);
źródło
Najlepszym obejściem błędu wymienionego w zaakceptowanej odpowiedzi, jakie znalazłem, jest skopiowanie danych z systemu operacyjnego Android na inny komputer / serwer (Linux, MacOS, Windows) przy użyciu protokołu SSH.
Opcjonalne i zalecane
Na urządzeniu z Androidem
W maszynie
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
Inne sugestie nie zadziałały dla mnie:
źródło
Na Xperii Z poniższy kod działał dobrze:
String screenShotFile = "...."; activity.sendBroadcast(new Intent( Intent.ACTION_MEDIA_MOUNTED, Uri .fromFile(screenShotFile)));
do użytku w wersji 4.4+:
activity.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(screenShotFile)));
(niestety nie pamiętam, czy wystarczająco dobrze to przetestowałem)
http://commonsware.com/blog/2013/11/06/android-4p4-permission-regressions.html
źródło
zawiadomienie / przechowywanie / emulowane. Android 4.2 ma kilka funky emulowanych elementów dostępu do aplikacji / użytkownika, na przykład oddzielny / sdcard / dla każdego użytkownika. Spróbuj przenieść plik do / sdcard / zamiast wyświetlanej emulowanej karty sdcard.
źródło
/storage/emulated/legacy
, co samo w sobie jest linkiem do/mnt/shell/emulated/0
którego zawiera plik.Prosty kod zaproponowany do pytania Jak mogę odświeżyć MediaStore na Androidzie? wykonuje niezbędną aktualizację MediaStore, jeśli zostanie wywołana po umieszczeniu pliku w pamięci zewnętrznej. Zawartość mojego Nexusa 4 jest natychmiast odświeżana w eksploratorze plików Windows 7.
źródło
Musiałem utworzyć katalog i skopiować kilka przykładowych plików dla mojej aplikacji. Po wielu eksperymentach i badaniach następująca procedura zadziałała dla mnie bez zarzutu:
1) Utworzono katalog za pomocą File.mkdir ().
2) Skopiuj pliki do katalogu i uruchom MediaScanner na każdym pliku.
MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);
3) Uruchom MediaScanner w katalogu.
MediaScannerConnection.scanFile(context, new String[]{directory.getAbsolutePath()}, null, null);
Wynik: pliki i katalog pojawią się natychmiast na komputerze PC przez MTP.
źródło
Miałem podobny problem z moim OneplusOne:
Po aktualizacji oprogramowania (do wersji 6.0.1) nie widziałem zdjęć z aparatu po podłączeniu do komputera (PTP i MTP). Zarówno SDRescan, jak i SDscanner aplikacji nie przyniosły żadnego efektu.
Moim rozwiązaniem było skopiowanie wszystkich zdjęć z DCIM do innego folderu za pomocą terminala lub dowolnej aplikacji Eksplorator plików w telefonie. Po podłączeniu do komputera mogłem zobaczyć skopiowane pliki. Przeniosłem je na komputer i wyczyściłem folder aparatu. Brak trwałego rozwiązania, ale rozwiązało to problem przynajmniej do czasu wykonania następnej kopii zapasowej. = D
źródło
Powyższe odpowiedzi są wystarczające do tworzenia pliku. Jeśli później usuniesz plik i chcesz, aby ta zmiana również została odzwierciedlona, możesz wykonać jedną z następujących czynności; Omówmy najpierw dwa rozwiązania, które wydają się działać, ale mogą powodować problemy na niektórych urządzeniach. Pierwsza to przeskanowanie usuniętego pliku:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));
Działa to na wielu urządzeniach w przypadku usuniętych plików, ale na niektórych urządzeniach spowoduje utworzenie nowego pliku 0-bajtowego, co prawdopodobnie nie jest tym, czego chcesz. W takim przypadku, jeśli korzystasz z wersji <4.4 KitKat, możesz to zrobić:
context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.fromFile(folder)));
Gdzie folder jest równy file.getParentFile (). Niestety w KitKat 4.4 i nowszych wersjach spowoduje to wyrzucenie wyjątku SecurityException, więc w przypadku tych urządzeń możesz spróbować usunąć bezpośrednio z Media Store:
final Uri externalFilesUri = Files.getContentUri("external"); context.getContentResolver().delete(externalFilesUri, Files.FileColumns.DATA + "=?", new String[] {file.getAbsolutePath()});
Przetestowałem to jako obejście problemu ACTION_MEDIA_MOUNTED, który nie działa na KitKat, i działa w moich testach na Nexusie 5.
źródło
Ostatnio napotkałem ten sam problem, ale dodatkowe badania pomogły znaleźć ukryte pliki. Wygląda na to, że Google dokonał pewnych zmian w strukturze przechowywania. Wszystkie te pliki zostały przeniesione do innego folderu
This Computer\HTC One\Internal Storage\storage\emulated\0
. Ale to dziwne, że nie wszystkie pliki zostały przeniesione.Android 4.4.2
źródło
Z dokumentacji tutaj , musisz wywołać 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); } });
źródło