android - 活动加载时出现 UsbManager 错误
问题描述
我目前正在学习通过电话与 Arduino 进行 USB 连接以开展项目。我正在使用开发人员文档,在遇到 UsbManager 错误后,我尝试了其他一些教程和 stackoverflow 帮助,但无济于事。我正在使用这个库在 android 和 arduino 之间进行串行通信。无法发布 logcat 导致它在我打开活动时立即清除,在闪烁一些日志后。我注意到一条蓝线,经过多次尝试后发现它指的是 UsbManager 声明行。请询问任何额外的信息...
Java 文件:
public class SerialView extends AppCompatActivity {
UsbDeviceConnection connection;
UsbManager usbManager = (UsbManager) this.getSystemService(android.content.Context.USB_SERVICE);
UsbDevice devices ; BroadcastReceiver mUsbDeviceReceiver;
HashMap<String, UsbDevice> usbDevices = usbManager.getDeviceList();
private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
UsbSerialDevice serialPort;
private static final int targetVendorID = 2341; //Arduino Uno
private static final int targetProductID = 43;
PendingIntent mPermissionIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_serial_view);
TextView textView=(TextView) findViewById(R.id.streamdisplay);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(mUsbReceiver, filter);
registerReceiver(mUsbDeviceReceiver, new IntentFilter(
UsbManager.ACTION_USB_DEVICE_ATTACHED));
registerReceiver(mUsbDeviceReceiver, new IntentFilter(
UsbManager.ACTION_USB_DEVICE_DETACHED));
}
@Override
protected void onDestroy() {
releaseUsb();
unregisterReceiver(mUsbDeviceReceiver);
unregisterReceiver(mUsbDeviceReceiver);
super.onDestroy();
}
private void releaseUsb() {
Toast.makeText(SerialView.this, "releaseUsb()", Toast.LENGTH_LONG)
.show();
if (connection != null) {
connection.close();
connection = null;
}
devices = null;
}
public void onClickStart **onClick** (View view) {
if (devices != null) {
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
Iterator<UsbDevice> deviceIterator = usbDevices.values().iterator();
while (deviceIterator.hasNext()) {
UsbDevice device = deviceIterator.next();
if (device.getVendorId() == targetVendorID) {
if (device.getProductId() == targetProductID) {
devices = device;
}
}
}
}
}
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
//Broadcast Receiver to automatically start and stop the Serial connection.
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
boolean granted =
intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);
if (granted) {
connection = usbManager.openDevice(devices);
serialPort = UsbSerialDevice.createUsbSerialDevice(devices, connection);
if (serialPort != null) {
if (serialPort.open()) { //Set Serial Connection Parameters.
//Enable Buttons in UI
serialPort.setBaudRate(9600);
serialPort.setDataBits(UsbSerialInterface.DATA_BITS_8);
serialPort.setStopBits(UsbSerialInterface.STOP_BITS_1);
serialPort.setParity(UsbSerialInterface.PARITY_NONE);
serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);
UsbSerialInterface.UsbReadCallback mCallback = new UsbSerialInterface.UsbReadCallback() {
//Defining a Callback which triggers whenever data is read.
@Override
public void onReceivedData(byte[] arg0) {
String data = null;
try {
data = new String(arg0, "UTF-8");
data.concat("/n");
tvAppend(textView, data);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
};
serialPort.read(mCallback);
tvAppend(textView,"Serial Connection Opened!\n");
} else {
Log.d("SERIAL", "PORT NOT OPEN");
}
} else {
Log.d("SERIAL", "PORT IS NULL");
}
} else {
Log.d("SERIAL", "PERM NOT GRANTED");
}
} else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
onClickStart(findViewById(R.id.startconbut));
} else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) {
onClickStop(findViewById(R.id.endconbut));
}
};
};
private void tvAppend(TextView tv, CharSequence text) { final TextView ftv = tv; final CharSequence ftext = text; runOnUiThread(new Runnable() { @Override public void run() { ftv.append(ftext); } }); }
public void onClickStop **onClick** (View view){
serialPort.close();
}
}
解决方案
推荐阅读
- r - ggplot中没有填充次要点
- typescript - 扩展 Typescript 索引对象以一般访问索引对象(字典)的值的类型
- python - 预测数据 LSTM 的逆差分
- php - 如何使用 twig 变量作为表单字段名称
- entity-framework-core - EF Core - .HasMany(r => r.SomeEntity).WithMany() // 这里没有导航属性
- angular - 如何通过离子中的组件选择器将一个模块的所有子组件用于模块的主要组件?
- react-native - React Native:使用 Facebook 登录时在 Android 上构建的独立、Expo 应用程序崩溃(适用于 iOS)
- visual-studio - 使用 Azure Connected Services 设置 MVC .NET 应用程序
- serilog - 获取当前 Serilog 配置以了解完整的写入文件路径
- c# - 通过单击菜单传递参数 - Asp.Net BoilerPlate