我正在使用USB附件的应用程序。当我将设备连接到arduino时,它要求usb权限,并且它在对话框中有复选框“默认使用”。当我检查并按下确定然后它应该保存权限并且做不要再问我了,但是每次我连USB都要求许可。我想保存许可有没有办法保存这个?
我的代码像
一样@Override
public void onResume() {
super.onResume();
if (mInputStream != null && mOutputStream != null) {
// streams were not null");
return;
}
// streams were null");
UsbAccessory[] accessories = mUsbManager.getAccessoryList();
UsbAccessory accessory = (accessories == null ? null : accessories[0]);
if (accessory != null) {
if (mUsbManager.hasPermission(accessory)) {
openAccessory(accessory);
} else {
synchronized (mUsbReceiver) {
if (!mPermissionRequestPending) {
mUsbManager.requestPermission(accessory,
mPermissionIntent);
mPermissionRequestPending = true;
}
}
}
}
Android清单文件看起来
<activity
android:name="pkg.sarvajal.soochakdroid.Main"
android:label="@string/Home"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:screenOrientation="landscape">
<intent-filter>
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
<action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
</intent-filter>
<meta-data
android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
android:resource="@xml/accessory_filter" />
</activity>
附件过滤器就像
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-accessory manufacturer="Manufacturer" model="Model" version="1.0" />
<usb-device vendor-id="0x0403" product-id="0x0403" />
</resources>
我的BroadcastReceiver代码
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) {
//UsbAccessory accessory = UsbManager.getAccessory(intent);
UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
if (intent.getBooleanExtra(
UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
Flag_USB_Attached = true;
Flag_Count_USB_Attached = 0;
Flag_Count_USB_Restart_App = 0;
openAccessory(accessory);
String strdatetime =responce_date();
//sendSMS_background(phoneNumber, "USB Cable Connected at "+strdatetime);
} else {
// USB permission denied
}
}
} else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
//UsbAccessory accessory = UsbManager.getAccessory(intent);
UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
if (accessory != null && accessory.equals(mAccessory)) {
// accessory detached
Flag_USB_Attached = false;
Flag_Count_USB_Attached = 0;
closeAccessory();
String strdatetime =responce_date();
//sendSMS_background(phoneNumber, "Communication Stopped! \n USB Cable Disconnected at "+strdatetime);
//SMS_USB();
}
}
}
设置附件代码
/ Setting up accessory
private void setupAccessory() {
//mUsbManager = UsbManager.getInstance(this);
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
registerReceiver(mUsbReceiver, filter);
if (getLastNonConfigurationInstance() != null) {
mAccessory = (UsbAccessory) getLastNonConfigurationInstance();
openAccessory(mAccessory);
}
}
// Opening Accessory Mode
private void openAccessory(UsbAccessory accessory) {
mFileDescriptor = mUsbManager.openAccessory(accessory);
if (mFileDescriptor != null) {
mAccessory = accessory;
FileDescriptor fd = mFileDescriptor.getFileDescriptor();
mInputStream = new FileInputStream(fd);
mOutputStream = new FileOutputStream(fd);
Thread thread = new Thread(null, this, "OpenAccessoryTest");
thread.start();
// Accessory opened
} else {
// failed to open accessory
}
}
// close Accessory
private void closeAccessory() {
try {
// T.cancel();
if (mFileDescriptor != null) {
mFileDescriptor.close();
}
} catch (IOException e) {
} finally {
mFileDescriptor = null;
mAccessory = null;
}
}
答案 0 :(得分:1)
根据Android USB host documentation,您的应用程序有权访问设备,直到设备断开连接。 This question提供了一种抑制权限对话框的解决方案。在清单文件中创建一个intent过滤器,并在xml文件中提供设备信息。这样就可以使用广播接收器枚举设备。
另一个参考是this question。后者适用于有根设备,我没有亲自尝试过。
编辑:
清单文件:我在清单文件中注册了我的广播接收器。
<receiver android:name="MyReceiver">
<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" />
</receiver>
为方便起见,我将我的广播接收器放在另一个班级中:
public class PmrtReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)){
Toast.makeText(context, "Device Detected",Toast.LENGTH_LONG).show();
} else if(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)){
Toast.makeText(context, "Device Detached",Toast.LENGTH_LONG).show();
}
}
};
我没有做任何其他事情来取消许可对话框。
查看Android Samples中的USB Missile Launcher示例。您的设备filtr应该是这样的:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="1234" product-id="5678" />
</resources>
您将VID和PID视为十六进制数字。