安卓:广播接收器时,插入/从USB端口删除设备的USB插头插入/ [英] Android: BroadcastReceiver when insert/remove the device USB plug into/from a USB port
问题描述
我的应用程序不抓ACTION_USB_DEVICE_ATTACHED,而是ACTION_USB_DEVICE_DETACHED做工精细。
应用程序启动正常,如果我连接USB设备,但执行广播接收器
右键抓ACTION_USB_DEVICE_DETACHED期间,我拔下。如果我再附上广播接收器
不抓住任何东西。
IntentFilter的过滤器=新的IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
rocrailService.registerReceiver(mUsbReceiver,过滤器);
//广播接收器,当插入/从USB端口删除设备的USB插头插入/
广播接收器mUsbReceiver =新的广播接收器(){
公共无效的onReceive(上下文的背景下,意图意图){
字符串行动= intent.getAction();
的System.out.println(广播接收器事件);
如果(UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(动作)){
mSerial.usbAttached(意向);
mSerial.begin(mBaudrate);
loadDefaultSettingValues();
RUN =真实的;
开始();
的System.out.println(广播接收器USB连接); }否则如果(UsbManager.ACTION_USB_DEVICE_DETACHED.equals(动作)){
mSerial.usbDetached(意向);
mSerial.end();
RUN = FALSE;
的System.out.println(广播接收器USB断开连接);
}
}
和清单:
<清单的xmlns:机器人=http://schemas.android.com/apk/res/android
包=net.DCCWLocoDisplay
安卓版code =0
安卓的versionName =0><采用-SDK机器人:targetSdkVersion =12/>
<使用许可权的android:NAME =android.permission.INTERNET对/>
<使用许可权的android:NAME =android.permission.READ_PHONE_STATE/>
<使用许可权的android:NAME =android.permission.CHANGE_WIFI_MULTICAST_STATE/>
<使用许可权的android:NAME =android.permission.WRITE_SETTINGS/>
<使用许可权的android:NAME =android.permission.WRITE_EXTERNAL_STORAGE/>
<使用许可权的android:NAME =android.permission.ACCESS_NETWORK_STATE/>
<使用许可权的android:NAME =android.permission.ACCESS_WIFI_STATE/><应用
机器人:图标=@绘制/ DCCW
机器人:标签=@字符串/ APP_NAME>
<活动机器人:图标=@绘制/ cab_64机器人:名字=net.DCCWLocoDisplay.activities.ActRCCab安卓主题=@风格/ FullHeightMainDialog机器人:标签=@字符串/ APP_NAME>
&所述;意图滤光器>
<作用机器人:名字=android.intent.action.MAIN/>
<类机器人:名字=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
&所述;意图滤光器>
<作用机器人:名字=android.hardware.usb.action.USB_DEVICE_ATTACHED/>
&所述; /意图滤光器>
<元数据机器人:名字=android.hardware.usb.action.USB_DEVICE_ATTACHED
机器人:资源=@ XML / device_filter/>
< /活性GT;
<活动机器人:名字=net.DCCWLocoDisplay.activities.Act preferences机器人:主题=@风格/ FullHeightDialog/>
<活动机器人:名字=net.DCCWLocoDisplay.activities.ActAccessory安卓主题=@风格/ FullHeightDialog/>
<活动机器人:名字=net.DCCWLocoDisplay.activities.ActAbout安卓主题=@风格/ FullHeightDialog/>
<活动机器人:名字=net.DCCWLocoDisplay.activities.ActProgramming安卓主题=@风格/ FullHeightDialog/>
<活动机器人:名字=net.DCCWLocoDisplay.activities.ActSteps安卓主题=@风格/ FullHeightDialog/>
<服务机器人:名字=net.DCCWLocoDisplay.DCCWLocoDisplay/>
< /用途> < /清单>
设备过滤器(我检查供应商和产品ID):
<资源>
< - 英语 - 澳大利亚/ 0x6001:FTDI FT232R UART - >
< USB设备厂商ID =1027产品ID =24577/> &所述;! - FT232RL - >
< /资源>
一切正如上文所述,只是变化不大的作品!在我的应用程序标记研究singleTask没有帮助,但帮助,当我把它放在活动标签
<活动
...
机器人:launchMode =singleTask>
这为我提供了ANDROID开始发出onNewIntent到活动。和onNewIntent我刚刚从意图获取设备,具有出权限的任何请求:
@覆盖
保护无效onNewIntent(意向意图)
{
super.onNewIntent(意向);
如果(intent.getAction()。等于(UsbManager.ACTION_USB_DEVICE_ATTACHED))
{
UsbDevice装置=(UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
My application don't catch "ACTION_USB_DEVICE_ATTACHED" but "ACTION_USB_DEVICE_DETACHED" work fine.
Application start correctly if I connect usb device but I disconnect during execution BroadcastReceiver
right catch "ACTION_USB_DEVICE_DETACHED". If I attach again BroadcastReceiver
don't catch anything.
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
rocrailService.registerReceiver(mUsbReceiver, filter);
// BroadcastReceiver when insert/remove the device USB plug into/from a USB port
BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println("BroadcastReceiver Event");
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
mSerial.usbAttached(intent);
mSerial.begin(mBaudrate);
loadDefaultSettingValues();
Run=true;
start();
System.out.println("BroadcastReceiver USB Connected");
} else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
mSerial.usbDetached(intent);
mSerial.end();
Run=false;
System.out.println("BroadcastReceiver USB Disconnected");
}
}
And manifest:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.DCCWLocoDisplay"
android:versionCode="0"
android:versionName="0" >
<uses-sdk android:targetSdkVersion="12"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:icon="@drawable/dccw"
android:label="@string/app_name" >
<activity android:icon="@drawable/cab_64" android:name="net.DCCWLocoDisplay.activities.ActRCCab" android:theme="@style/FullHeightMainDialog" 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>
<activity android:name="net.DCCWLocoDisplay.activities.ActPreferences" android:theme="@style/FullHeightDialog" />
<activity android:name="net.DCCWLocoDisplay.activities.ActAccessory" android:theme="@style/FullHeightDialog" />
<activity android:name="net.DCCWLocoDisplay.activities.ActAbout" android:theme="@style/FullHeightDialog" />
<activity android:name="net.DCCWLocoDisplay.activities.ActProgramming" android:theme="@style/FullHeightDialog" />
<activity android:name="net.DCCWLocoDisplay.activities.ActSteps" android:theme="@style/FullHeightDialog" />
<service android:name="net.DCCWLocoDisplay.DCCWLocoDisplay"/>
</application>
</manifest>
Device filter (I check vendor and product id):
<resources>
<!-- 0x0403 / 0x6001: FTDI FT232R UART -->
<usb-device vendor-id="1027" product-id="24577" /> <!-- FT232RL -->
</resources>
Everything works as was described above, except little changes! On my research singleTask in application tag didn't help, but helped when I put it in activity tag
<activity
...
android:launchMode="singleTask">
It provided me with ANDROID started to send onNewIntent to activity. And on onNewIntent I just had to get device from intent, with out any requests for permissions:
@Override
protected void onNewIntent(Intent intent)
{
super.onNewIntent(intent);
if(intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED))
{
UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
这篇关于安卓:广播接收器时,插入/从USB端口删除设备的USB插头插入/的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!