java-在Usb主机模式下将数据从android发送到已连接的Usb存储设备
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-在Usb主机模式下将数据从android发送到已连接的Usb存储设备,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6094字,纯文字阅读大概需要9分钟。
内容图文
![java-在Usb主机模式下将数据从android发送到已连接的Usb存储设备](/upload/InfoBanner/zyjiaocheng/668/20b32c21d2f241a49dd15db2f4d5e6ee.jpg)
在我的应用程序中,正在使用USB主机模式,该模式提供有关已连接的USB大容量存储设备的信息,例如用例中的Usb闪存驱动器.现在,我需要在已连接的闪存驱动器上创建一个文件,并将一些数据保存在该文件中.到目前为止,我发现正在按以下方式连接设备,
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private Button mCheckForDevice;
private TextView mDeviceInfo;
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
private PendingIntent mPermissionIntent;
private UsbManager mUsbManager;
private UsbDevice mDeviceFound;
private UsbDeviceConnection mConnection;
private UsbInterface mUsbInterface = null;
private UsbEndpoint mInputEndpoint = null;
private UsbEndpoint mOutputEndpoint = null;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCheckForDevice = (Button) findViewById(R.id.check);
mDeviceInfo = (TextView) findViewById(R.id.deviceInfo);
count=0;
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
final HashMap<String, UsbDevice> deviceList = mUsbManager.getDeviceList();
Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
while (deviceIterator.hasNext()) {
final UsbDevice device = deviceIterator.next();
mDeviceFound = device;
i += "\n" +
"DeviceID: " + device.getDeviceId() + "\n" +
"DeviceName: " + device.getDeviceName() + "\n" +
"VendorID: " + device.getVendorId() + "\n" +
"ProductID: " + device.getProductId() + "\n" +
"Serial Number: " + device.getSerialNumber() + "\n";
}
mCheckForDevice.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View v) {
if(deviceList.size() > 0){
checkInfo(mDeviceFound);
}else{
Toast.makeText(getApplicationContext(), "No device found", Toast.LENGTH_SHORT).show();
}
}
});
}
String i = "";
private int count ;
private void checkInfo(UsbDevice device) {
count++;
if(count == 1) {
mUsbManager.requestPermission(device, mPermissionIntent);
mDeviceInfo.setText(i);
} else
Toast.makeText(this, "Already connected", Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
count=0;
try {
unregisterReceiver(mUsbReceiver);
}catch (Exception e){
e.printStackTrace();
}
}
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Toast.makeText(context, "onReceive", Toast.LENGTH_SHORT).show(); writeToFile("onReceive");
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
Toast.makeText(context, "Permission Granted", Toast.LENGTH_SHORT).show();
connectUsb(device);
} else {
Log.d(TAG, "permission denied for device " + device);
Toast.makeText(context, "permission denied for device" + device, Toast.LENGTH_SHORT).show();
}
}
}
}
};
private void connectUsb(UsbDevice device) {
if(device != null){
for(int i=0;i<device.getInterfaceCount();i++){
mUsbInterface = device.getInterface(i);
UsbEndpoint tOut = null;
UsbEndpoint tIn = null;
int usbEndPointCount = mUsbInterface.getEndpointCount();
if(usbEndPointCount >=2){
for(int j =0;j<usbEndPointCount;j++){
if(mUsbInterface.getEndpoint(j).getType() == UsbConstants.USB_ENDPOINT_XFER_BULK){
if(mUsbInterface.getEndpoint(j).getDirection() == UsbConstants.USB_DIR_OUT){
tOut = mUsbInterface.getEndpoint(j);
}else if(mUsbInterface.getEndpoint(j).getDirection() == UsbConstants.USB_DIR_IN){
tIn = mUsbInterface.getEndpoint(j);
}
}
}
if(tIn!=null & tOut !=null){
mInputEndpoint = tIn;
mOutputEndpoint = tOut;
}
}
}
mConnection = mUsbManager.openDevice(device);
if (mConnection.claimInterface(mUsbInterface, true)) {
Toast.makeText(this, "Connected to device", Toast.LENGTH_SHORT).show();
String msg = "Hello world";
byte[] byteArray = msg.getBytes();
int dataTransfered = mConnection.bulkTransfer(mOutputEndpoint,byteArray,byteArray.length, 0);
int controlTransfer = mConnection.controlTransfer( UsbConstants.USB_DIR_OUT, 1,0,0,byteArray,byteArray.length,0);
Toast.makeText(this, "controlTransfer " +controlTransfer, Toast.LENGTH_SHORT).show();
} else {
Log.i(TAG, "Could not connect!");
Toast.makeText(this, "Could not connect", Toast.LENGTH_SHORT).show();
}
}else{
Toast.makeText(this, "Null", Toast.LENGTH_SHORT).show();
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/check"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Search for devices "
android:textColor="@color/black"
android:textSize="15sp" />
<TextView
android:id="@+id/deviceInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/check"
android:layout_marginTop="14dp"
android:textColor="@color/black"
android:textSize="15sp" />
</RelativeLayout>
在上面的示例中,我尝试将String值发送到连接的设备,并且返回的int值是发送的字符数.但是,此信息在何处存储在连接的设备上,我的意思是位置?
建立与设备的连接后,是否可以在连接的设备上创建文件?指向相关博客文章的链接很有帮助.
我发现堆栈上有this,但是该解决方案没有任何帮助.
感谢您的帮助.
解决方法:
您正在搜索批量端点,这意味着您试图使用BBB进行扇区读/写(请参阅USB规格的大容量存储BBB类).
现在,我需要在连接的闪存驱动器上创建一个文件,并将一些数据保存在该文件中.
使用端点可以执行扇区读/写,但是必须在其之上编写文件系统驱动程序(例如FAT32或EXT4等).
文件创建是文件系统操作,而不是扇区级别的读/写.
建立与设备的连接后,是否可以在连接的设备上创建文件?
您必须使用Android文件系统挂载工具,然后使用通用文件API创建文件.
内容总结
以上是互联网集市为您收集整理的java-在Usb主机模式下将数据从android发送到已连接的Usb存储设备全部内容,希望文章能够帮你解决java-在Usb主机模式下将数据从android发送到已连接的Usb存储设备所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。