ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在USB主机模式下安装的USB存储设备上的文件I / O(Android 3.1及更高版本)

2019-09-28 18:26:12  阅读:179  来源: 互联网

标签:android file-io usb


好的,所以我有一个Android 3.1平板电脑(Acer Iconia Tab,顺便说一句,这很棒)我可以使用Android USB API连接USB大容量存储设备(一个简单的USB记忆棒).

我使用USB主机模式,找到设备,获得连接它的权限(使用BroadcastReceiver).一切都很棒.问题是我不知道该怎么做才能将文件从外部存储目录复制到USB记忆棒.

这是我到目前为止:

final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
            UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

            if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                if (device != null) {

                    // Got to a point where I should set up connection
                    // I'm setting up a very simple connection, just want some file transfer

                    UsbInterface intf = device.getInterface(0);
                    UsbEndpoint endpoint = intf.getEndpoint(0);
                    UsbDeviceConnection connection = UsbManager.openDevice(device);

                    if (connection.claimInterface(intf, true)) {
                        UtilsAndDialogs.print(getApplicationContext(), "Connected to device");

                        // Copy file to USB...

                    } else
                        UtilsAndDialogs.print(getApplicationContext(), "Could not connect!");
                }
            } else {
                UtilsAndDialogs.print(getApplicationContext(), "Permission denied");
                Log.d(UtilsAndDialogs.LOG_TAG, "Permission denied for device " + device);
            }
        }
    } 
};

我阅读了Android Dev Usb Host上的文档,但它不是很明确,我发现了一个非常好的教程Android Usb Host Tutorial – AdbTest,但它使用了异步通信.

我只想知道如何设置连接并使用端点(我没有得到端点部分,为什么需要它们)才能在USB存储设备上创建新文件并复制内容那里有不同的文件,可能使用bulkTransfer()方法.

任何提示或指向更明确的文档将非常感激.

谢谢

解决方法:

您的连接已设置,端点基本上是设备上的标志,包含有关数据传输的信息.

对于你的棒,你需要做一些像VV这样的东西,以确定你有多少端点,

UsbInterface intf = device.getInterface(0);
// checks for 2 endpoints
if (intf.getEndpointCount() != 2) {
Toast toast = Toast.makeText(context, "could not find endpoint", duration);
toast.show();
return;
    }
UsbEndpoint ep = intf.getEndpoint(0);
if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
if (ep.getDirection() == UsbConstants.USB_DIR_OUT) {

这将让你弄清楚你感兴趣的端点是否是批量(usb常量文档有其他类型),以及是否可以在该端点向设备发送数据或从设备发送数据(usb_dir_in以测试输入).您想要的端点是设备特定的,我的示例从0开始,您的端点将是不同的

要重新保存文件,您需要执行类似的操作

mConnection.bulkTransfer(mEndpointOut, bytes, 512, TIMEOUT);

我每次填充文件输出流时都一直在保存缓冲区,这可能是低效的(因为我假设bulktransfer已经在某处保存)但文档很少.

标签:android,file-io,usb
来源: https://codeday.me/bug/20190928/1828479.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有