【问题标题】:How can you access external memory on Google TV如何访问 Google TV 上的外部存储器
【发布时间】:2013-03-07 01:38:35
【问题描述】:

我正在使用索尼互联网电视作为开发设备进行开发,它有 4 个 USB 端口。外部硬盘驱动器可以使用所有端口或没有端口。如何选择和访问设备上的外部存储器与内部存储器。

我可以使用以下方法访问 SD 卡,或者至少是电视标记为 SD 卡的内容:

Environment.getExternalStorageDirectory();

但我似乎不知道如何找到外部 USB 设备。我试图沿着 UsbManager 类的路径走下去,但似乎应该有一种更简单、更通用的方法。我只是希望能够看到大容量存储设备,并且不想通过供应商 ID 等进行清理。但也许我在那里遗漏了一些东西。

这应该是可能的,因为我正在寻找媒体播放器应用程序在打开菜单并选择“选择设备”时发现的相同功能。

我只需要对驱动器的读取权限,但读取/写入可能很有用。

提前致谢。

【问题讨论】:

    标签: android google-tv


    【解决方案1】:

    在 Google TV v2 中,对 USB 存储支持进行了一些更改。 USB 驱动器的主要变化是:
    1.USB驱动器将挂载/mnt/media/usb.XXXXX而不是/sdcard。 (XXXXX 由 USB 卷的 ID(卷 id:vfat 或 exfat,uuid:ntfs)决定。)
    2.GTV支持多个U盘。用户可以插入多个 USB 驱动器。

    MediaProvider 索引所有插入的 USB 卷中的所有媒体文件。因此,应用程序可以查询 MediaProvider 以检索所有媒体文件。

    示例代码:

    光标 cursor = getContentResolver().query(
    图片.媒体.EXTERNAL_CONTENT_URI,
    新字符串 [] {
    图片.媒体._ID,
    Images.Media.DATA, // 文件路径
    },
    空,空,空);

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

    【讨论】:

    • 我们作为 SDK 开发人员可以依赖 /mnt/media/usb.XXXXX 吗?我不知道这在其他任何地方都有记录。 IOW,这是否是书籍作者应该包含在涵盖 Google TV 的书籍中的那种东西? :-) 谢谢!
    • 我会在几天内找到并通知您。
    • 目前还没有 USB 存储 API 的计划。访问 USB 存储的推荐方式是通过 MediaProvider。
    • 我想也许是这样。感谢您的澄清!
    【解决方案2】:

    所以直觉说要使用USB accessories api。但是,这仅适用于 android 3.1 及更高版本,如果我没记错的话,google tv 遵循 3.0 API。也就是说,从文档中:

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

    所以请查看Google APIs add-on library 以访问 USB 内容。

    【讨论】:

    • 实际上,它们是随 3.1 一起发布的。我将研究 USB 附件 api。谢谢。
    【解决方案3】:

    但我似乎不知道如何找到外部 USB 设备。

    Android SDK 中没有对外部 USB 驱动器的官方支持。我在 Google TV 开发人员文档中看不到任何内容表明他们在这方面添加了任何内容。

    【讨论】:

    • USB 配件 api 是否不适用于外部 USB 设备?
    • @KurtisNusbaum:嗯,例如,你不能在 Java 中实现 USB 大容量存储模式。引用您链接到的页面:“USB 附件模式允许用户连接专为 Android 供电设备设计的 USB 主机硬件。附件必须遵守 Android 附件开发工具包文档中概述的 Android 附件协议。”这不是 USB 大容量存储模式。插入 USB 驱动器应该会自动挂载它,但没有官方 API 来查找挂载点、确定它是否可写等。
    • 大容量存储设备似乎不是“附件”而是“设备”。我仍在解决这个问题,还没有能够(以编程方式)将设备识别为大容量存储设备。目前我可以查看设备列表,但我的 USB 大容量存储设备不返回 UsbConstants。 USB_CLASS_MASS_STORAGE link[/link] 作为他们的设备类(使用 Device.getDeviceClass)。也许谷歌还没有完全清除 USB 包。
    【解决方案4】:

    您无法使用任何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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2017-11-29
      相关资源
      最近更新 更多