没有提示的USB权限

我在我的应用程序中有2个活动。 说FirstActivitySecondActivityFirstActivity是MAIN和LAUNCHER的活动。 SecondActivity使用USB设备。 我想让USB许可的提示在应用程序的整个使用期限内只出现一次。

如果只有一个活动,则清单中的以下几行解决了我的目的:

<activity android:name=".FirstActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <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/usb_device_filter" />
</activity>

这是做了以下几点:

  • 每当usb设备(以xml提到)连接时启动FirstActivity应用程序尚未打开。
  • 提示USB设备权限只出现一次。
  • 我如何修改它以实现以下目标:

  • 如果SecondActivity已在运行并且连接了新的USB设备,则必须能够在不重新启动应用程序的情况下使用设备。 所以我写了一个广播接收机,内容如下:

    public class TriggerReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { 
            read connected usb devices and register serial port call listener back.
        }
    }    
    
  • 但问题是FirstActivity得到时再而USB设备连接重新启动SecondActivity运行。 我如何避免这种情况?

    如果需要,将添加更多信息。 感谢任何帮助。


    在这个问题中FirstActivityFirstActivity中“移除”意图过滤器<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />

    更新

    FirstActivity触发每个USB_DEVICE_ATTACHED (甚至SecondActivity运行),因为你设置<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />它过滤器AndroidManifest.xml文件。 所以你应该在SecondActivity运行时禁用这个过滤器。 你可以这样做:

    1)将AndroidManifest.xml (例如AliasFirstActivity )添加到您的FirstActivity并将<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> filter添加到别名描述中(您应该移除<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />来自FirstActivity描述的<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> ):

            <activity-alias
                android:targetActivity=".FirstActivity"
                android:name=".AliasFirstActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
    
                <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-alias>
    

    2)将此代码添加到SecondActivity onCreate() (或onResume()

    PackageManager pm = getApplicationContext().getPackageManager();
            ComponentName compName =
                    new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity");
            pm.setComponentEnabledSetting(
                    compName,
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);
    

    打压意图过滤USB_DEVICE_ATTACHEDFirstActivity 。 你应该有SecondActivity东西:

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_second);
    
            triggerReceiver = new TriggerReceiver();
    
            IntentFilter filter = new IntentFilter();
            filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
            registerReceiver(triggerReceiver, filter);
    
            PackageManager pm = getApplicationContext().getPackageManager();
            ComponentName compName =
                    new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity");
            pm.setComponentEnabledSetting(
                    compName,
                    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                    PackageManager.DONT_KILL_APP);
        }
    

    这应该可以解决你的问题。 3)如果需要,您可以使用以下代码为FirstActivityonDestroy() (或onPause() )中的SecondActivity恢复<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />过滤器:

        PackageManager pm = getApplicationContext().getPackageManager();
        ComponentName compName =
                new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity");
        pm.setComponentEnabledSetting(
                compName,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
    

    但问题是FirstActivity得到时再而USB设备连接重新启动SecondActivity运行。 我如何避免这种情况?

    这不难回答。 在您的AndroidManifest.xml中,您实际上声明在事件android.hardware.usb.action.USB_DEVICE_ATTACHED发生时应启动您的FirstActivity

    如果您只想在SecondActivity处理此事件,则必须相应地在清单中声明它,例如:

        <activity android:name=".FirstActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
        <activity android:name=".SecondActivity" android:launchMode="singleTask">
            <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>
    

    现在,只要插入USB设备, SecondActivity将只启动。 如果SecondActivity已在运行,则由于为android:launchMode="singleTask"指定的属性android:launchMode="singleTask" ,它不会再次(或多次) SecondActivity 。 如果您有兴趣,可以在这里阅读更多有关不同启动模式的信息。

    由于您在清单中声明在插入USB设备时应启动SecondActivity ,Android系统会询问您以下问题:

    USB对话框

    勾选复选框“此USB设备默认使用”后,它不会再问你。 现在,每次插入USB设备时,您的SecondActivity都会启动并且它会自动获得所需的USB权限。

    让我知道这是否回答你的问题。


    可能是这个答案帮助你:USB设备访问弹出抑制?

    从你的活动的这个答案:

    public class UsbEventReceiverActivity extends Activity
     {   
        public static final String ACTION_USB_DEVICE_ATTACHED = "com.example.ACTION_USB_DEVICE_ATTACHED";
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
        }
    
    @Override
    protected void onResume()
    {
        super.onResume();
    
        Intent intent = getIntent();
        if (intent != null)
        {
            if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED))
            {
                Parcelable usbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
    
                // Create a new intent and put the usb device in as an extra
                Intent broadcastIntent = new Intent(ACTION_USB_DEVICE_ATTACHED);
                broadcastIntent.putExtra(UsbManager.EXTRA_DEVICE, usbDevice);
    
                // Broadcast this event so we can receive it
                sendBroadcast(broadcastIntent);
            }
        }
    
        // Close the activity
        finish();
    }
    

    }

    链接地址: http://www.djcxy.com/p/36889.html

    上一篇: USB Permissions without prompt

    下一篇: All data is not inserted in MySql instance using Entity Framework Core