如何在Google TV上访问外部存储器

6
我正在使用索尼互联网电视作为开发设备,该设备有4个USB端口。所有或没有端口可以与外部硬盘驱动器一起使用。如何在设备上选择和访问外部存储器或内部存储器。
我可以通过以下方式访问SD卡,或者至少是电视标记为SD卡的内容:
Environment.getExternalStorageDirectory();

但是我似乎无法找到如何查找外部 USB 设备的方法。我曾尝试使用 UsbManager 类,但似乎应该存在一种更简单、更通用的方法。我只想能够看到大容量存储设备,不想去清除供应商 ID 等信息。但也许我在这方面有所遗漏。
这应该是可能的,因为我正在寻找与 Media Player 应用程序相同的功能,即打开菜单并选择“选择设备”。
我只需要访问驱动器的读取权限,但读/写权限也可能有用。
提前感谢您的帮助。
4个回答

6
在Google TV v2中,关于USB存储支持发生了一些变化。 USB驱动器的主要更改如下:
1.USB驱动器将被挂载到/mnt/media/usb.XXXXX而不是/sdcard。(XXXXX由USB卷的ID(卷ID:vfat或exfat, uuid:ntfs)决定。)
2.GTV支持多个USB驱动器。用户可以插入多个USB驱动器。
MediaProvider会索引所有已插入的USB卷中的媒体文件。因此,应用程序可以针对MediaProvider查询以检索所有媒体文件。

示例代码:

Cursor cursor = getContentResolver().query(
Images.Media.EXTERNAL_CONTENT_URI,
new String[] {
Images.Media._ID,
Images.Media.DATA, // 文件路径
},
null, null, null);

应用程序如何检测驱动器何时同步或弹出?
您可以注册BroadcastReceiver以接收Intent.ACTION_MEDIA_SCANNER_FINISHED和Intent.ACTION_MEDIA_EJECT。

“/mnt/media/usb.XXXXX”是我们作为SDK开发人员可以依赖的吗?我不知道这是否在其他任何地方都有记录。换句话说,这是否是书籍作者应该在涵盖Google TV的书籍中包含的内容呢?谢谢! - CommonsWare
我会在几天内查明并告诉你。 - Megha Joshi - GoogleTV DevRel
2
目前没有USB存储API的计划。访问USB存储的推荐方式是通过MediaProvider。 - Megha Joshi - GoogleTV DevRel
我想也许是这种情况。感谢澄清! - CommonsWare

1
直觉告诉我们要使用USB accessories api。然而,这仅适用于Android 3.1及以上版本,如果我没记错的话,Google TV遵循3.0 API。尽管如此,从文档中可以看出:

com.android.future.usb:为了支持Android 2.3.4中的USB附件模式,Google APIs附加库包括后移的USB附件API,并且它们包含在此命名空间中。

因此,请查看Google APIs附加库以访问USB相关内容。

实际上,它们已经搭载了3.1版。我会研究一下USB设备API。谢谢。 - dzimney

1
但我似乎无法找到外部USB设备的方法。
Android SDK没有官方支持外部USB驱动器。我在Google TV开发者文档中也没有看到任何关于他们在这个领域添加了什么的信息。

USB配件API是否无法与外部USB设备配合使用? - Kurtis Nusbaum
@KurtisNusbaum: 嗯,例如在Java中无法实现USB大容量存储模式。引用您链接的页面所说:“USB附件模式允许用户连接专门设计为Android设备的USB主机硬件。附件必须遵守《Android附件开发工具包文档》中概述的Android附件协议。”这不是USB大容量存储模式。插入USB驱动器应该自动挂载,但没有官方API来查找挂载点、确定是否可写等。 - CommonsWare
1
似乎大容量存储设备不是“配件”,而是“设备”。我仍在解决问题,还没有能够以编程方式识别出设备是否是大容量存储设备。目前,我可以查看设备列表,但我的USB大容量存储设备未将UsbConstants.USB_CLASS_MASS_STORAGE link[/link]作为它们的设备类 (使用 Device.getDeviceClass)。也许谷歌还没有完全推出 USB 包。 - dzimney

0

使用任何getExternalXXX()都无法访问USB设备,通过MediaProvider访问只能得到一个扁平的集合(目录结构丢失),其中仅包含被分类为媒体文件的文件(例如没有.txt文件)。

我为此需求和其他一些需求开发了libmedia。在Sony NSZ-GS7上进行了测试。

示例代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接