题 访问android中的USB大容量存储设备


所以我有一根插在手机上的小电缆,另一边有一个USB端口,你可以插入一个闪存驱动器,如你所见:

enter image description here

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

USB大容量存储连接

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

/存储/ UsbDriveA /

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

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

但是在闪存驱动器的情况下你会如何做到这一点?提前致谢! :)


24
2018-06-06 06:12


起源


哇什么手机有USB端口? - DnR
哈哈,我会用我正在使用的电缆图片更新我的问题。 - Tiwaz89
啊,我明白了。我以为有一个 女 手机上的USB端口,无需电缆即可直接插拔-_- - DnR
您必须在设备上使用文件资源管理器应用才能找到答案。查看/ mnt和/ storage以查找确切的路径。 - greenapps
Android API指南 USB主机 应该为您提供所需的所有信息。 - Shashank Kadne


答案:


在这个例子中,我使用的是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" />

8
2018-02-21 23:02



我可以看到有些人说他们的usb闪存驱动器是通过usbdisk路径访问而不是UsbDriveA:如果你想覆盖所有情况你可以测试两者:如果用/ storage / UsbDriveA /你的usbManager仍然是null,那么试试/ storage / usbdisk / etc ...(如果你能找到不同路径的列表,可能还有其他几个,尽管这里不应该有大量不同的路径) - JBA


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

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

你试过这个吗?


3
2018-06-07 16:22



在我的手机上的路径是 /storage/usbdisk/ - satur9nine