这个问题的原因是软件没有获取到android的usb权限
解决之前我们在androidManifest.xml中添加权限,
<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
两种办法解决:
1,通过xml和配置AndroidManifest.xml
文件来获取权限
这种办法一般是用做插入usb,直接弹出提示框的方法:Configure your AndroidManifest.xml
to notify your app when a device is attached
<activity
android:name=".DeviceListActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
android:resource="@xml/device_filter" />
</activity>
其中 device_filter.xml 中列出了可用 usb 设备,当usb 设备连接手机之后,app 会自动询问是否允许获取该 usb 的权限。
device_filter.xml 放置位置如下图所示
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
<usb-device vendor-id="1027" product-id="24577" />
<!-- 0x0403 / 0x6015: FTDI FT231X -->
<usb-device vendor-id="1027" product-id="24597" />
<!-- 0x2341 / Arduino -->
<usb-device vendor-id="9025" />
<!-- 0x16C0 / 0x0483: Teensyduino -->
<usb-device vendor-id="5824" product-id="1155" />
<!-- 0x10C4 / 0xEA60: CP210x UART Bridge -->
<usb-device vendor-id="4292" product-id="60000" />
<!-- 0x067B / 0x2303: Prolific PL2303 -->
<usb-device vendor-id="1659" product-id="8963" />
<!-- 0x1a86 / 0x7523: Qinheng CH340 -->
<usb-device vendor-id="6790" product-id="29987" />
</resources>
每个 usb 设备通过 vendor-id(厂商 id) 和 product-id (产品 id)一起来定义的 ,可以作为 Android usb 设备的参考。
2,通过代码动态获取
这种办法就是我们点击连接的时候,才弹出是否可以获取你的手机usb权限的提示框,
package main.com.pwj.isearilport;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import java.io.IOException;
import java.util.List;
public class MainActivity extends AppCompatActivity {
Button btn;
byte[] getSeir={(byte)0xA5,(byte)0x5A,..........(0x)xx};
// UsbManager manager;
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
UsbManager manager;
List<UsbSerialDriver> availableDrivers;
UsbSerialDriver driver;
UsbDeviceConnection connection;
UsbSerialPort port;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button)findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Open a connection to the first available driver.
openUsbDevice();
// Find all available drivers from attached devices.
// Open a connection to the first available driver.
if (connection == null) {
// add UsbManager.requestPermission(driver.getDevice(), ..) handling here
return;
}
port = driver.getPorts().get(0); // Most devices have just one port (port 0)
try {
port.open(connection);
port.setParameters(921600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
byte buffer[] = new byte[16];
int numBytesRead = port.write(getSeir, 1000);
Log.d("hehe", "Read " + numBytesRead + " bytes.");
} catch (IOException e) {
// Deal with error.
}
}
});
}
/**
* 获得 usb 权限
*/
private void openUsbDevice(){
//before open usb device
//should try to get usb permission
tryGetUsbPermission();
}
private void tryGetUsbPermission(){
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbPermissionActionReceiver, filter);
PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
//here do emulation to ask all connected usb device for permission
for (final UsbDevice usbDevice : manager.getDeviceList().values()) {
//add some conditional check if necessary
//if(isWeCaredUsbDevice(usbDevice)){
if(manager.hasPermission(usbDevice)){
//if has already got permission, just goto connect it
//that means: user has choose yes for your previously popup window asking for grant perssion for this usb device
//and also choose option: not ask again
afterGetUsbPermission(usbDevice);
}else{
//this line will let android popup window, ask user whether to allow this app to have permission to operate this usb device
manager.requestPermission(usbDevice, mPermissionIntent);
}
//}
}
}
private void afterGetUsbPermission(UsbDevice usbDevice){
//call method to set up device communication
//Toast.makeText(this, String.valueOf("Got permission for usb device: " + usbDevice), Toast.LENGTH_LONG).show();
//Toast.makeText(this, String.valueOf("Found USB device: VID=" + usbDevice.getVendorId() + " PID=" + usbDevice.getProductId()), Toast.LENGTH_LONG).show();
doYourOpenUsbDevice(usbDevice);
}
private void doYourOpenUsbDevice(UsbDevice usbDevice){
//now follow line will NOT show: User has not given permission to device UsbDevice
availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
return;
}
driver= availableDrivers.get(0);
connection = manager.openDevice(driver.getDevice());
}
private final BroadcastReceiver mUsbPermissionActionReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (ACTION_USB_PERMISSION.equals(action)) {
synchronized (this) {
UsbDevice usbDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
//user choose YES for your previously popup window asking for grant perssion for this usb device
if(null != usbDevice){
afterGetUsbPermission(usbDevice);
}
}
else {
//user choose NO for your previously popup window asking for grant perssion for this usb device
Toast.makeText(context, String.valueOf("Permission denied for device" + usbDevice), Toast.LENGTH_LONG).show();
}
}
}
}
};
}
3,题外话,其他内容:
一般使用usb的步骤:
a,
implementation 'com.github.mik3y:usb-serial-for-android:2.1.0' implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0'
b,
Add jitpack.io repository to your root build.gradle:
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
鼾声鼾语 发布了21 篇原创文章 · 获赞 5 · 访问量 9331 私信 关注