没有提示的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