Pregunta Nexus 4 no muestra archivos a través de MTP


Intento simplemente escribir un archivo XML simple en la tarjeta SD y noté que mi Nexus 4 lo hace, pero no se puede ver a través del protocolo MTP con Windows 7.

código:

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

Puedo ver el archivo en el teléfono con Astro File Manager:

Screenshot

pero Windows no lo ve ...

Screenshot

adb shell en el directorio muestra:

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

¿Qué está pasando con mi Nexus 4? ¿Por qué está ocultando mis cosas de Windows?


74
2017-12-06 05:02


origen


Respuestas:


Parece ser un problema conocido que afecta el acceso de archivos USB Android a través de MTP. El caché MTP se desactualiza hasta que se reinicia el teléfono.

UN solución alternativa es:

  • Borre los datos de la aplicación "Almacenamiento multimedia"
  • Utilizar el SDrescan o el Escáner SD (también funciona en Android 4.4 / 5, disponible en F-Droid) aplicación para forzar una actualización

O simplemente evite usar el USB en absoluto. El problema no afecta a otros métodos de acceso a los archivos. Por ejemplo, prueba AirDroid para transferir archivos.


Nota: Esto no funciona para Android 5.0.2: después de borrar "Media Storage" y usar un SD Rescanner, las carpetas aparecen en Windows 7 como archivos 4K no ejecutables. La única solución en ese punto es borrar nuevamente Media Storage y reiniciar el dispositivo


68
2017-12-28 19:02



Puede usar el siguiente código después de cerrar archivo

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

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


40
2017-12-06 00:47



En Xperia Z, el código siguiente funcionaba bien:

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

para 4.4+ uso:

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

(Desafortunadamente no recuerdo si lo he probado lo suficientemente bien)

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


3
2017-07-29 17:24



Después de pasar horas en este tema lo resolví así:

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

Lo que pasa es que tienes que escanear solo archivos (no carpetas) y luego repita recursivamente para cada carpeta

EDITAR Además, si no desea que se agreguen imágenes a su álbum de fotos (pero solo su contenido debe aparecer sobre el protocolo mtp), recuerde colocar un archivo vacío. .nomedia archivo en su carpeta antes de volver a escanearlo, de esta manera:

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

3
2017-12-05 17:32



aviso / almacenamiento / emulado. Android 4.2 tiene algunas cosas emuladas funky por acceso a la aplicación / usuario pasando, por ejemplo, una / sdcard / por cada usuario. Intente mover el archivo a / sdcard / en lugar de la tarjeta SD emulada que se muestra.


2
2017-12-07 02:43



El código simple propuesto para preguntar ¿Cómo puedo actualizar MediaStore en Android? realiza la actualización necesaria de MediaStore, si se llama después de que coloque un archivo en el almacenamiento externo. El contenido de mi Nexus 4 se actualiza al instante en el Explorador de archivos de Windows 7.


2
2017-07-03 12:13



Necesitaba crear un directorio y copiar algunos archivos de muestra para mi aplicación. Después de muchos experimentos e investigaciones, el siguiente procedimiento funcionó perfectamente para mí:

1) Directorio creado usando File.mkdir ().

2) Copió archivos en el directorio y ejecuta MediaScanner en cada archivo.

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

3) Ejecute MediaScanner en el directorio.

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

Resultado: los archivos y el directorio aparecen instantáneamente en la PC a través de MTP.


1
2017-07-19 04:22



Tuve un problema similar con mi OneplusOne:

Después de la actualización del software (a 6.0.1), no pude ver las imágenes de mi cámara cuando me conecté a la computadora (PTP y MTP). SDRescan y SDscanner de la aplicación no tuvieron ningún efecto.

Mi solución fue copiar todas las imágenes de DCIM a otra carpeta usando el terminal o cualquier archivo de la aplicación Explorer en el teléfono. Cuando me conecté a la computadora, pude ver los archivos copiados. Los moví a mi computadora y borré la carpeta de mi cámara. No hay solución permanente, pero me solucionó el problema al menos hasta que haga la siguiente copia de seguridad. = D


1
2017-08-16 12:05



La mejor solución que encontré para el error mencionado en el respuesta aceptada es copiar datos desde el sistema operativo Android a otra máquina / servidor (Linux, MacOS, Windows) usando SSH.

  • Asegúrese de que el dispositivo (Android) y la máquina (donde desea copiar los datos) sean accesibles por IP o nombre de host, por ejemplo conectándolos a la misma red wifi.

Opcional y recomendado

  • Conecte el dispositivo Android usando el anclaje a red USB. Esto garantiza una velocidad rápida debido a la conexión por cable y garantiza que ambas direcciones IP sean visibles entre sí porque ambas están en la misma red.

En el dispositivo Android

  • Instale un servidor SSH. SSHelper trabajado como un encanto
  • Ejecute SSHelper y vaya a la pestaña de configuración para obtener la dirección IP, el puerto y la contraseña. En el siguiente ejemplo, son 192.168.1.5, 2222 y 'admin'.
  • La contraseña predeterminada es admin pero si decide cambiarla, presione el botón "Reiniciar servidor con nuevos valores" después de cambiarlo

En la máquina

  • Instala rsync. Si utiliza Ubuntu, ya está instalado por defecto.
  • Abra un shell y escriba el siguiente comando. Cambie la dirección IP y el puerto a sus valores

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

  • obtendrá el siguiente mensaje, ingrese su contraseña

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

Las otras sugerencias no funcionó para mí:

  • El dispositivo no admite el uso del modo de almacenamiento USB en lugar de MTP (como muchos otros dispositivos más nuevos).
  • No había ninguna opción en mi sistema operativo (Android 6.0.1) para borrar los datos de la aplicación "Almacenamiento multimedia".
  • Otros métodos para compartir archivos a través de la red tenían sus inconvenientes. FTP no garantiza la integridad de los archivos. Si se corta la conexión, sobrescribe u omite todos los archivos, por lo que uno de los archivos puede estar incompleto. Otros protocolos pueden ser difíciles de instalar y otras aplicaciones pueden usar protocolos propietarios.

1
2017-12-25 12:35



Las respuestas anteriores están bien para crear el archivo. Si luego elimina el archivo y desea que ese cambio también se refleje, puede hacer uno de los siguientes; primero cubramos dos soluciones que parecen funcionar, pero que causarán problemas en algunos dispositivos. El primero es escanear el archivo eliminado:

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

Esto funciona en muchos dispositivos para archivos eliminados, pero en algunos dispositivos hará que se cree un nuevo archivo de 0 bytes, que probablemente no sea el que usted desea. En ese caso, si está ejecutando <4.4 KitKat, puede hacer esto:

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

Donde carpeta es igual a file.getParentFile (). Desafortunadamente, en KitKat 4.4 y versiones superiores, esto provocará que se genere una SecurityException, por lo que para esos dispositivos, puede intentar eliminar directamente desde Media Store:

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

He probado este como una solución para que ACTION_MEDIA_MOUNTED no funcione en KitKat, y funciona en mis pruebas en el Nexus 5.


0
2018-02-20 19:52



Recientemente me enfrenté con el mismo problema, pero algunas investigaciones adicionales ayudaron a encontrar archivos ocultos. Parece que Google ha realizado algunos cambios en la estructura de almacenamiento. Todos estos archivos fueron movidos a otra carpeta This Computer\HTC One\Internal Storage\storage\emulated\0. Pero es extraño que no todos los archivos se movieron.

Android 4.4.2


0
2018-05-30 05:23