gpt4 book ai didi

android - 通过android USB主机模式从笔式驱动器读取数据

转载 作者:太空狗 更新时间:2023-10-29 14:25:38 28 4
gpt4 key购买 nike

我需要从U盘读取文件,我的代码如下:

private static final String ACTION_USB_PERMISSION = "android.hardware.usb.action.USB_ACCESSORY_ATTACHED";

private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
@Override
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) {
// call method to set up device communication
}
} else {
Log.d(TAG, "permission denied for device " + device);
}
}
}
}
};

检测我使用的设备:

mgr = (UsbManager) getSystemService(Context.USB_SERVICE);
devs = new HashMap<String, UsbDevice>();
devs = mgr.getDeviceList();

在获取设备和接口(interface)之后,我得到如下端点:

public void getEndpointCount(View v) {
itf = value.getInterface(0);
endPointCount = itf.getEndpointCount();

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("No. of Endpoints: " + endPointCount)
.setTitle("Endpoint Count").setCancelable(true)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
((Button) findViewById(R.id.button4)).setEnabled(true);
}

public void getEndpointDirections(View v) {
endPoint = null;


UsbDeviceConnection conn = null;

if (mgr.hasPermission(value)) {
conn = mgr.openDevice(value);
conn.claimInterface(itf, true);
}

String str = null;
for (int i = 0; i < endPointCount; i++) {
((TextView) findViewById(R.id.tvLoopVal)).setText("" + i);
endPoint = itf.getEndpoint(i);
str = str + " Endpoint: " + i + " - " + endPoint.getDirection()
+ "\n";

if (endPoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
((TextView) findViewById(R.id.tvLoopVal)).setText("" + (i - 1));
if (endPoint.getDirection() == UsbConstants.USB_DIR_IN) {
Toast.makeText(this, "epin", Toast.LENGTH_SHORT).show();
epIn = endPoint;
} else {
epOut = endPoint;
Toast.makeText(this, "epout", Toast.LENGTH_SHORT).show();
}
}

}

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(
str + " Mac packet Size = " + endPointUsed.getMaxPacketSize())
.setTitle("Endpoints Directions").setCancelable(true)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();

}

最后,我现在得到了终点,我被卡住的地方是下一步读取或写入数据到 pendrive。我对此一无所知,现在需要指导。

此外,如果我没有将任何 USB 设备连接到我的平板电脑,它仍然说找到 1 个设备,当我通过 OTG 电缆连接 pendrive 时,它​​说找到 2 个设备!这也奇怪

编辑:

我也使用 USB 请求方法初始化请求,但我仍然不明白它是如何工作的

public void initializeRequest(View v) {
UsbRequest uReq = new UsbRequest();
Toast.makeText(this, "" + uReq.initialize(conn, epIn),
Toast.LENGTH_SHORT).show();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(
" Is Request Initialized: = " + uReq.initialize(conn, epIn))
.setTitle("Request Initialization").setCancelable(true)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
byte[] bb = new String("Hello").getBytes();
ByteBuffer bBuffer = ByteBuffer.allocate(5);
// bBuffer.put(bb);
uReq.queue(bBuffer, 5);

UsbRequest request = conn.requestWait();
// Object obj = uReq.getClientData();
// Log.v("Client Data", "" + obj.toString());
if (request != null) {
Toast.makeText(this, "Not null request", Toast.LENGTH_SHORT).show();
Log.v("Response of request wait", ""
+ request.getClientData().toString());
request.close();
}
uReq.close();

// Log.v("Response of request wait", "" + conn.requestWait());
// uReq.close();
}

我验证了端点正在被分配,但是当这个方法被执行时,应用程序只是等待,什么都不做。一段时间后,Android 要求关闭该应用程序。是否因为 requestWait() 函数应用程序等待某种类型的事件?

编辑

好吧,如果我们忘记从笔式驱动器读取数据,而只需要从 USB 设备获取音频流,假设我不想读取任何东西的麦克风,我会捕捉到麦克风提供的任何内容,那么我仍然必须做还有什么我在这里做了什么??

最佳答案

看起来您实际上并未读取任何数据。如果你有一个从设备到主机的端点,你应该能够使用 bulkTransfer 从它读取数据。方法。

我不太熟悉低级 USB 通信,但我假设您需要自己处理文件系统解析。如果您读取驱动器上的第一个扇区(512 字节)并且该扇区的最后两个字节是 0x55,0xAA,则该驱动器可能是用 FAT 文件系统格式化的,您必须从那里开始工作。

关于android - 通过android USB主机模式从笔式驱动器读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12895521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com