2011-11-13 9 views
6

Estoy desarrollando el uso de un televisor de Internet Sony como un dispositivo de desarrollo, que tiene 4 puertos USB. Todos o ninguno de los puertos se pueden utilizar con discos duros externos. ¿Cómo puedo seleccionar y acceder a la memoria externa frente a la memoria interna en el dispositivo?¿Cómo se puede acceder a la memoria externa en Google TV?

soy capaz de acceder a la tarjeta SD, o al menos lo que las etiquetas de televisión como la tarjeta SD utilizando el siguiente:

Environment.getExternalStorageDirectory(); 

Pero me parece que no puede encontrar la manera de encontrar USB externo dispositivos. Intenté seguir el camino de la clase UsbManager, pero parece que debería haber una manera más fácil y más general. Solo quiero poder ver dispositivos de almacenamiento masivo y no quiero tener que limpiar a través de los identificadores de proveedores, etc. Pero tal vez me falta algo allí.

Esto debería ser posible ya que estoy buscando la misma funcionalidad encontrada por la aplicación Media Player al abrir el menú y seleccionar "Seleccionar dispositivo".

Solo necesito acceso de lectura a las unidades, pero la lectura/escritura podría ser útil.

Gracias de antemano.

Respuesta

6

En Google TV v2, hubo algunos cambios con respecto al soporte de almacenamiento USB. Los principales cambios para las unidades USB son:
1. Las unidades USB se montarán /mnt/media/usb.XXXXX en lugar de/sdcard. (XXXXX se decide por el ID (id. De volumen: vfat o exfat, uuid: ntfs) del volumen USB).
2.GTV admite varias unidades USB. Los usuarios pueden conectar múltiples unidades USB.

MediaProvider indiza todos los archivos multimedia en todos los volúmenes USB conectados. Por lo tanto, las aplicaciones pueden consultar en MediaProvider para recuperar todos los archivos multimedia. código

muestra:

cursor Cursor = getContentResolver() consulta (
Images.Media.EXTERNAL_CONTENT_URI,
nuevo String [] {
Images.Media._ID,
Images.Media..DATA, // ruta del archivo
},
null, null, null);

¿Cómo puede detectar aplicación cuando la unidad ha sincronizado o expulsado ?:
Puede registrar BroadcastReceiver el fin de recibir Intent.ACTION_MEDIA_SCANNER_FINISHED y Intent.ACTION_MEDIA_EJECT.

+0

¿Es '/ mnt/media/usb.XXXXX' algo en lo que los desarrolladores de SDK podemos confiar? No estoy al tanto de que esto esté documentado en ningún otro lado. IOW, ¿es este el tipo de cosas que, digamos, los autores de libros deberían estar incluyendo en los libros que cubren Google TV? :-) ¡Gracias! – CommonsWare

+0

Lo averiguaré y le dejaré saber en un par de días. –

+2

No hay planes para las API de almacenamiento USB a partir de ahora. La forma recomendada para acceder al almacenamiento USB es a través de MediaProvider. –

1

Así que la intuición dice que use el USB accessories api. Sin embargo, esto solo está disponible para Android 3.1 y versiones superiores, y si no recuerdo mal, Google TV se suma a la 3.0 API. Dicho esto, a partir de la documentación:

com.android.future.usb: Para apoyar el modo de accesorio USB en Android 2.3.4, las API de Google en la biblioteca incluye las API de accesorios USB portado y que están contenidos en este espacio de nombres

Así que revise el Google APIs add-on library para acceder a las cosas usb.

+0

En realidad, son el envío con 3.1. Buscaré en la API de accesorios de USB. Gracias. – dzimney

1

Pero parece que no entiendo cómo encontrar dispositivos USB externos.

No hay soporte oficial en el SDK de Android para unidades USB externas. No veo nada en la documentación del desarrollador de Google TV que sugiera que hayan agregado nada en esta área.

+0

¿Los accesorios USB no funcionan con dispositivos usb externos? –

+0

@KurtisNusbaum: Bueno, no puede, por ejemplo, implementar el modo de almacenamiento masivo USB en Java. Citando la página a la que vinculó: "El modo de accesorio USB permite a los usuarios conectar hardware de host USB específicamente diseñado para dispositivos con Android. Los accesorios deben cumplir con el protocolo de accesorio de Android descrito en la documentación del Kit de desarrollo de accesorios de Android". Este no es el modo de almacenamiento masivo USB. Al conectar una unidad USB debería montarse automáticamente, pero no hay una API oficial para encontrar los puntos de montaje, determinar si es grabable, etc. – CommonsWare

+1

Parece que los dispositivos de almacenamiento masivo no son "Accesorios" sino "Dispositivos". Todavía estoy trabajando en el problema y aún no he podido reconocer un dispositivo (programáticamente) como un dispositivo de almacenamiento masivo. Actualmente puedo ver una lista de dispositivos, pero mis dispositivos de almacenamiento masivo usb no devuelven UsbConstants. USB_CLASS_MASS_STORAGE [link] (http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_MASS_STORAGE) [/ link] como su clase de dispositivo (usando Device.getDeviceClass). Tal vez Google no ha eliminado completamente el paquete usb. – dzimney

0

No puede acceder a los dispositivos usb con getExternalXXX(), y al ir a través de MediaProvider tendrá una colección plana (la estructura del directorio se pierde) de los únicos archivos clasificados como medios (por ejemplo, no .txt).

Desarrollé libmedia para esta necesidad y algunas otras. Probado en una Sony NSZ-GS7.

Código de ejemplo:

VolumeManager volumeManager = new VolumeManager(); 
List<Volume> volumes = volumeManager.getVolumes(); 
for (Volume volume: volumes) { 
    String label = volume.getLabel(); 
    File rootFolder = volume.getRoot(); 
    File[] files = rootFolder.listFiles(); 
    for (File file: files) { 
     String filename = file.getName(); 
    } 
} 
Cuestiones relacionadas