USB权限没有提示

时间:2016-10-21 17:10:16

标签: android android-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>

这是在做以下事情:

  1. 每当usb设备(在xml中提到)连接时启动FirstActivity,应用程序尚未打开。
  2. 只会出现一次usb设备权限提示。
  3. 如何修改此项以实现以下目标:

    1. 如果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.
          }
      }    
      
    2. 但问题是FirstActivitySecondActivity运行时附加USB设备时再次重新启动。我该如何避免这种情况?

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

3 个答案:

答案 0 :(得分:2)

this问题

中尝试从<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />“移除”意图过滤器FirstActivity

<强>更新

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

1)在AliasFirstActivity中添加(例如AndroidManifest.xmlFirstActivity并将<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />过滤器移至别名说明(您应从{{<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />移除FirstActivity 1}}描述)那样:

        <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)将此代码添加到onCreate()

onResume()(或SecondActivity
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_ATTACHED的意图过滤器FirstActivity。你应该在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)如果需要,您可以使用以下代码恢复<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> FirstActivity onDestroy()onPause()的{​​{1}}过滤器:

SecondActivity

答案 1 :(得分:1)

  

但问题是FirstActivitySecondActivity运行时附加USB设备时再次重新启动。我该如何避免这种情况?

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

如果您只想在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"指定的属性SecondActivity,它不会再次启动(或多次启动)。如果您有兴趣,可以阅读有关不同发布模式here的更多信息。

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

USB Dialog

勾选复选框&#34;默认使用此USB设备&#34;后,它不会再次询问您。现在,每次插入USB设备时,SecondActivity都会启动,它也会自动获得所需的USB权限。

如果能回答你的问题,请告诉我。

答案 2 :(得分:0)

这个答案可能会有所帮助: USB device access pop-up suppression?

代码段:

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