安卓:广播接收器时,插入/从USB端口删除设备的USB插头插入/ [英] Android: BroadcastReceiver when insert/remove the device USB plug into/from a USB port

查看:290
本文介绍了安卓:广播接收器时,插入/从USB端口删除设备的USB插头插入/的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序不抓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:机器人=htt​​p://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_STORAG​​E/>
<使用许可权的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆