我的应用程序中有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
在SecondActivity
运行时附加USB设备时再次重新启动。我该如何避免这种情况?
如果需要,将添加更多信息。感谢任何帮助。
答案 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.xml
)FirstActivity
并将<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}}过滤器:1}} p>
SecondActivity
答案 1 :(得分:1)
但问题是
FirstActivity
在SecondActivity
运行时附加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系统会询问您以下问题:
勾选复选框&#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();
}
}