没有提示的USB权限
我在我的应用程序中有2个活动。 说FirstActivity和SecondActivity 。 FirstActivity是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>
这是做了以下几点:
我如何修改它以实现以下目标:
如果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运行。 我如何避免这种情况?
如果需要,将添加更多信息。 感谢任何帮助。
在这个问题中FirstActivity从FirstActivity中“移除”意图过滤器<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_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)如果需要,您可以使用以下代码为FirstActivity的onDestroy() (或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设备时,您的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
