【问题标题】:Get access to USB mass storage device in android在 android 中访问 USB 大容量存储设备
【发布时间】:2014-06-06 06:12:08
【问题描述】:

所以我有一根小电缆,您可以将它插入手机,另一边有一个 USB 端口,您可以在其中插入闪存驱动器,例如,您可以在此处看到:

当我插入闪存驱动器时,我收到一条通知:

已连接 USB 大容量存储

当我启动文件资源管理器应用程序时,我可以看到驱动器位于:

/storage/UsbDriveA/

这很好,但我想知道如何在我的代码中访问闪存驱动器。访问 SD 卡非常简单:

File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() + "/MyFiles")
directory.mkdirs();

但如果是闪存驱动器,您将如何做到这一点?提前致谢! :)

【问题讨论】:

  • 哇什么手机有USB接口??
  • 哈哈,我会用我正在使用的电缆的图片更新我的问题。
  • 啊,我明白了。我以为手机上有一个Female USB Port,可以不用线直接插上-_-
  • 您必须使用设备上的文件浏览器应用程序才能找到。查看 /mnt 和 /storage 以找到确切的路径。
  • USB Host 的 Android API 指南应该为您提供所需的所有信息。

标签: java android file file-io


【解决方案1】:

在本例中,我使用的是 Apache 的 FileUtils,但如果没有它,您将看到用于读取 USB 闪存驱动器的逻辑:

private UsbManager usbManager;
private UsbDevice clef;
ArrayList<File> images;

usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
clef = null;

if (usbManager != null)
{
    HashMap<String,UsbDevice> deviceList = usbManager.getDeviceList();
    if (deviceList != null)
    {
        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
        while (deviceIterator.hasNext()) {
            clef = deviceIterator.next();
        }
    }
}

if (clef != null)
{
    File directory  = new File("/storage/UsbDriveA/");
    if (directory != null) {
        if (directory.canRead()) {

            images = new ArrayList<File>();
            String[] imageExtensions = {"jpg","jpeg","png","gif","JPG","JPEG","PNG","GIF"};
            Iterator<File> iterateImages = FileUtils.iterateFiles(directory, imageExtensions, true);
            while (iterateImages.hasNext()) {
                File theImage = iterateImages.next();
                if (!theImage.getName().startsWith(".", 0))
                    images.add(theImage);
            }

            // custom process / methods... not very relevant here : 
            imageIndex = 0;
            scale = 1.0f;
            countImgs = images.size();
            loadImage(imageIndex);
        }
    }
}

在我的清单中,我有这些行,虽然我不确定它们是否都是强制性的......

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.USB_PERMISSION" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />

【讨论】:

  • 我可以看到有些人说他们的 USB 闪存驱动器可以通过 usbdisk 路径访问,而不是 UsbDriveA:如果你想涵盖所有情况,你可以测试两者:如果使用 /storage/UsbDriveA/ 你的 usbManager 是仍然为空,然后尝试使用 /storage/usbdisk/ 等...(如果您可以找到不同路径的列表,可能还有其他一些,尽管这里不应该有大量不同的路径)
【解决方案2】:

我无法对此进行测试,我自己没有这样的电缆,但我的假设是您可以将文件路径直接传递给构造函数,如下所示:

File directory  = new File("/storage/UsbDriveA/");

你试过了吗?

【讨论】:

  • 我手机上的路径是/storage/usbdisk/
猜你喜欢
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多