2011-11-13 16 views
6

Sto sviluppando utilizzando una TV Internet Sony come dispositivo di sviluppo, che ha 4 porte USB. Tutte o nessuna porta possono essere utilizzate con dischi rigidi esterni. Come posso selezionare e accedere alla memoria esterna rispetto alla memoria interna sul dispositivo.Come si può accedere alla memoria esterna su Google TV

sono in grado di accedere alla scheda SD, o almeno quello che le etichette TV come la scheda SD utilizzando il seguente:

Environment.getExternalStorageDirectory(); 

Ma io non riesco a capire come trovare USB esterno dispositivi. Ho tentato di seguire il percorso della classe UsbManager, ma sembra che ci dovrebbe essere un modo più semplice e più generale. Voglio solo essere in grado di vedere i dispositivi di archiviazione di massa e non voglio dover pulire attraverso ID del fornitore ecc. Ma forse mi manca qualcosa lì.

Questo dovrebbe essere possibile poiché sto cercando la stessa funzionalità trovata dall'app Media Player quando si apre il menu e si seleziona "Seleziona dispositivo".

Ho solo bisogno di accedere in lettura alle unità, ma leggere/scrivere potrebbe essere utile.

Grazie in anticipo.

risposta

6

In Google TV v2, sono state apportate alcune modifiche al supporto di archiviazione USB. Le principali modifiche per le unità USB sono:
1. Le unità USB verranno montate /mnt/media/usb.XXXXX anziché/sdcard. (XXXXX è deciso dall'ID (volume id: vfat o exfat, uuid: ntfs) del volume USB.)
2.GTV supporta più unità USB. Gli utenti possono collegare più unità USB.

MediaProvider indicizza tutti i file multimediali in tutti i volumi USB collegati. Pertanto, le applicazioni possono eseguire query su MediaProvider per recuperare tutti i file multimediali. codice

Esempio:

cursore Cursore = getContentResolver() query (
Images.Media.EXTERNAL_CONTENT_URI,
new String [] {
Images.Media._ID,
Images.Media..DATA, // percorso file
},
null, null, null);

Come si può rilevare l'applicazione quando l'unità è sincronizzato o espulso ?:
È possibile registrare BroadcastReceiver al fine di ricevere Intent.ACTION_MEDIA_SCANNER_FINISHED e Intent.ACTION_MEDIA_EJECT.

+0

'/ mnt/media/usb.XXXXX' qualcosa su cui possiamo fare affidamento gli sviluppatori SDK? Non sono consapevole che questo è documentato da nessun'altra parte. IOW, è questo il genere di cose che, per esempio, gli autori di libri dovrebbero forse includere nei libri che coprono Google TV? :-) Grazie! – CommonsWare

+0

Lo scoprirò e ti farò sapere tra un paio di giorni. –

+2

Per ora non ci sono piani per le API di archiviazione USB. Il modo consigliato per accedere alla memoria USB è tramite MediaProvider. –

1

Quindi l'intuizione dice di usare lo USB accessories api. Tuttavia, questo è disponibile solo per Android 3.1 e versioni successive e, se non ricordo male, google tv aderisce all'API 3.0. Detto questo, dalla documentazione:

com.android.future.usb: per supportare la modalità USB accessorio in Android 2.3.4, le API di Google add-on libreria include le API di accessori USB backport e sono contenute in questo spazio dei nomi.

Quindi controllare il Google APIs add-on library per accedere alle cose USB.

+0

In realtà, sono spedizione con 3.1. Guarderò l'API degli accessori USB. Grazie. – dzimney

1

Ma non riesco a capire come trovare dispositivi USB esterni.

Non esiste un supporto ufficiale nell'SDK di Android per le unità USB esterne. Non vedo nulla nella documentazione per sviluppatori di Google TV per suggerire di aver aggiunto qualcosa in quest'area.

+0

Gli accessori USB non funzionano con dispositivi USB esterni? –

+0

@KurtisNusbaum: Beh, non è possibile, ad esempio, implementare la modalità di archiviazione di massa USB in Java. Citando la pagina a cui ti sei collegato: "La modalità accessorio USB consente agli utenti di collegare l'hardware dell'host USB progettato specificamente per i dispositivi Android. Gli accessori devono rispettare il protocollo degli accessori Android descritto nella documentazione del kit di sviluppo degli accessori Android." Questa non è la modalità di archiviazione di massa USB. Il collegamento di un'unità USB deve essere eseguito automaticamente, ma non esistono API ufficiali per trovare i punti di montaggio, determinare se è scrivibile, ecc. – CommonsWare

+1

Sembra che i dispositivi di archiviazione di massa non siano "Accessori" ma "Dispositivi". Sto ancora lavorando al problema e devo ancora essere in grado di riconoscere un dispositivo (programmaticamente) come un dispositivo di archiviazione di massa. Attualmente sono in grado di visualizzare un elenco di dispositivi, ma i miei dispositivi di archiviazione di massa USB non restituiscono UsbConstants. USB_CLASS_MASS_STORAGE [link] (http://developer.android.com/reference/android/hardware/usb/UsbConstants.html#USB_CLASS_MASS_STORAGE) [/ link] come classe del dispositivo (utilizzando Device.getDeviceClass). Forse Google non ha svuotato completamente il pacchetto USB. – dzimney

0

Non è possibile accedere ai dispositivi USB con qualsiasi getExternalXXX(), e passando attraverso MediaProvider si avrà una raccolta semplice (la struttura della directory è persa) degli unici file classificati come media (ad esempio no .txt).

Ho sviluppato libmedia per questa necessità e alcuni altri. Testato su una Sony NSZ-GS7.

codice di esempio:

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