删除USB附件权限对话框 [英] Remove USB Accessory permission dialog

查看:167
本文介绍了删除USB附件权限对话框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用USB附件的应用程序上工作。当我将设备连接到arduino时,它会请求USB许可,并且在默认使用对话框中具有复选框。当我选中并按OK时,它应该保存许可权并执行不要再问我了,但是每次我连接USB时都会要求获得许可。我想保存许可有什么方法可以保存?

I am working on an application which uses USB accessory.When I attach device to arduino it asks for usb permission and it has checkbox in dialog "use by default".When I checked and press ok then it should save permission and do not ask me again but it is asking for permission every time I attach USB.I want to save permission is there any way to save this?

我的代码看起来很像

@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清单文件的外观

And Android manifest file looks

 <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代码

My BroadcastReceiver code

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


推荐答案

Android USB主机文档,您的应用程序有权访问设备,直到设备断开连接。 此问题提供了一种抑制权限对话框的解决方案。在清单文件中创建一个意图过滤器,并在xml文件中提供设备信息。这样可以使用广播接收器枚举设备。

According to the Android USB host documentation, your application has permission to access the device until the device is disconnected. This question provides a solution to suppress the permission dialog. Create an intent filter in your manifest file and provide the device information in an xml file. This would enable enumerating the device using a broadcast receiver.

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

Another reference is this question. The latter is meant for rooted devices and I haven't tried it personally.

编辑:

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

Manifest File: I register my Broadcast Receiver in the manifest file.

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

为了方便起见,我将广播接收器放在一个单独的类中:

For the sake of convenience, I have my Broadcast Receiver in a separate class:

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();

        }

    }

};

我不必执行其他任何操作来禁止显示权限对话框。

I did not have to do anything else to suppress the permission dialog.

查看Android样本中的USB导弹启动器示例。您的设备过滤器应该是这样的:

Look into the USB Missile Launcher example from the Android Samples. Your device filtr should be something like this:

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

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

您将VID和PID作为十六进制数。

You have the VID and PID as hexadecimal numbers.

这篇关于删除USB附件权限对话框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆