当前位置: 首页 > 知识库问答 >
问题:

删除USB附件权限对话框

慎星纬
2023-03-14

我正在开发一个使用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>

我的广播接收器代码

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;
    }
}

共有1个答案

王辉
2023-03-14

根据Android USB主机文档,在设备断开连接之前,您的应用程序具有访问设备的权限。此问题提供了抑制权限对话框的解决方案。在清单文件中创建意图过滤器,并在xml文件中提供设备信息。这将允许使用广播接收器枚举设备。

另一个参考是这个问题。后者是针对根设备的,我没有亲自尝试过。

编辑:

清单文件:我在清单文件中注册了我的广播接收器。

<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示例中的USB导弹发射器示例。您的设备筛选器应该是这样的:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-device vendor-id="1234" product-id="5678" />  
</resources>

VID和PID为十六进制数字。

 类似资料:
  • 我编写了一个简单的应用程序,通过USB向连接到Android 4.0平板电脑的USB打印机发送命令。由于某些原因,我无法通过获取权限来声明接口和打开连接。以下是相关代码: 这是清单的相关部分: 我已将设备配置为,以便在连接打印机时启动我的应用,并在枚举期间找到该设备(onResume())并调用权限请求。但是,无论出于何种原因,我从未看到“请求权限”对话框(我在网上看过它的屏幕截图),也不会调用o

  • 美好的一天, 我有一个通过服务将我的android设备连接到arduino设备的应用程序。我已经成功地建立了连接,但每当我插入配件时,它总是要求我允许使用它。有没有办法绕过这个权限?如果我通过一个活动来做,它与意图过滤器完美地工作,我已经尝试在服务中应用相同的意图,但它似乎不工作:/。 这是我的清单中的代码。爱内里菜

  • 在 MySQL 中,可以使用 REVOKE 语句删除某个用户的某些权限(此用户不会被删除),在一定程度上可以保证系统的安全性。例如,如果数据库管理员觉得某个用户不应该拥有 DELETE 权限,那么就可以删除 DELETE 权限。 使用 REVOKE 语句删除权限的语法格式有两种形式,如下所示: 1)第一种 删除用户某些特定的权限,语法格式如下: REVOKE priv_type [(column_

  • 问题内容: 我想让一个Python程序开始在端口80上侦听,但是此后无需root权限即可执行。有没有办法删除根或没有它获得端口80? 问题答案: 没有root特权,您将无法在端口80上打开服务器,这是对OS级别的限制。因此,唯一的解决方案是在打开端口后放弃root特权。 这是在Python中删除 root特权的可能解决方案:在Python中删除特权。通常,这是一个很好的解决方案,但是您还必须添加功

  • 连接MySQL操作 mysql -h 主机地址 -u 用户名 -p 用户密码 注:-u与root可以不用加空格,其它参数也一样。 DEMO 打开电脑CMD,输入 mysql -h 127.0.0.1 -u root -p 回车,然后输入密码。就可以连接到本地的MySQL数据库。 创建MySQL用户 CREATE USER 'username'@'host' IDENTIFIED BY 'passw

  • 本文向大家介绍Linux(ubuntu)下实现增加/删除文件权限,包括了Linux(ubuntu)下实现增加/删除文件权限的使用技巧和注意事项,需要的朋友参考一下 【权限篇】 ubuntu系统中,对于不同用户及不同用户组中用户对文件的操作权限都不相同,通过控制台我们可以快速的对文件权限进行操作。 对于修改权限可以使用两种方案来更改其权限,下面认识一下文件系统权限的组成: 文件权限查看: 1、查看文