【问题标题】:Android USB Host mode service - Start based on USB_DEVICE_ATTACHEDAndroid USB Host模式服务-基于USB_DEVICE_ATTACHED启动
【发布时间】:2012-11-08 02:25:33
【问题描述】:

我想在 Android 中编写一个基于 USB_DEVICE_ATTACHED 意图启动的服务。因此,基本上我的服务应该在连接特定的 USB 设备(FT232C - VID:PID 0403:6010)时启动,并在断开该 USB 设备时停止。是否可以这样做,或者我是否应该始终拥有一个启动该服务的 Activity,以防它尚未启动?该服务的最终目的是根据此 USB 设备提供的位置,使用 TEST_PROVIDER 更新 LocationProvider 上的位置。

我已经尝试在 AndroidManifest.xml 中使用此配置创建服务

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.testlocservice"
        android:versionCode="1"
        android:versionName="1.0">

        <uses-sdk android:minSdkVersion="12" android:targetSdkVersion="15" />
        <uses-feature android:name="android.hardware.usb.host"/>
        <supports-screens android:resizeable="true" android:smallScreens="true" android:anyDensity="true" android:largeScreens="true" android:xlargeScreens="true" android:normalScreens="true"/>
        <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

        <application android:label="@string/app_name"
            android:icon="@drawable/ic_launcher"
            android:theme="@style/AppTheme">
                <service android:name="com.testlocservice.LocationService"         android:process=":LocService" android:enabled="true" android:exported="true">
                    <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" />                
                </service>
        </application>
    </manifest>

xml/device_filter.xml 包含这个

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
            <usb-device vendor-id="0403" product-id="6010"/>
    </resources>

我的 LocationService 类已覆盖处理 USB_DEVICE_ATTACHED 意图的 onStartCommand()

【问题讨论】:

  • 已经解决了这个问题,我需要这个。如果可能,请分享代码谢谢

标签: android usb host


【解决方案1】:

我认为主要问题是供应商和产品 ID 的数字基础。设备过滤器 xml 中的格式应为十进制,因此 vendor-id="1025" 和 product-id="24592"。

除此之外,它绝对应该是 USB_DEVICE_ATTACHED,而不是 UMS_CONNECTED(后者根本不是 USB 主机模式)。

关于服务是否可以接收广播意图,或者您是否必须为此使用活动,我没有权威的答案,但似乎 Wayne Uroda 对这个问题有很好的经验。

【讨论】:

    【解决方案2】:

    根据我的经验, 无法接收 USB 意图。我通过创建一个隐藏的活动来接收意图并重新广播它来克服这个问题。当然这个活动也可以处理启动/停止你的服务。

    我已经在这里放了一些工作代码:
    https://stackoverflow.com/a/15151075/588476
    您只需对其进行更改,使其自动启动和停止您的服务。

    【讨论】:

    • Android 提供三种发送 Intent 的方式:sendBroadcast()startActivity()startService()。显然,这些方式中的每一种都只将 Intent 传递给预期的组件类型。 USB_DEVICE_ATTACHED 似乎是通过 startActivity() 发送的,因此 Activity 可以接收它,但 Service 或 BroadcastReceiver 不能(我都试过了)。相反,USB_DEVICE_DETACHED 事件是作为广播发送的,因此需要 BroadcastReceiver 来接收它。
    【解决方案3】:

    是的,很有可能,很抱歉,您在 AndroidManifest.xml 的接收者标签中使用了错误的意图过滤器。让我来指导你

    AndroidManifest.xml

    .
    .
    .
    <receiver android:name=".DetactUSB">
       <intent-filter>
            <action android:name="android.intent.action.UMS_CONNECTED" />
            <action android:name="android.intent.action.UMS_DISCONNECTED" />
       </intent-filter>
    </receiver>
    

    广播接收器文件

    public class DetactUSB extends BroadcastReceiver
    { 
        private static final String TAG = "DetactUSB";
        @Override
        public void onReceive(Context context, Intent intent) 
        {
            // TODO Auto-generated method stub
            if (intent.getAction().equalsIgnoreCase( "android.intent.action.UMS_CONNECTED"))
            {
                    // Fire your Intent to start Activity
                    Log.i(TAG,"USB connected..");
            }
            if (intent.getAction().equalsIgnoreCase( "android.intent.action.UMS_DISCONNECTED"))
            {
            }
        } 
    }
    

    【讨论】:

    • 这会检测到任何 USB,但我可能应该尝试使用我的意图过滤器,它根据 BroadcastReceiver 中的 VID:PID 检测 USB_DEVICE_ATTACHED,然后从那里启动我的服务。会试试看
    • BroadcastReceiver 没有接收到意图。是否需要在服务的 onCreate() 中单独注册。
    • @user1400473,AndroidManifest.xml中没有注册
    • UMS_CONNECTED 似乎与作为大容量存储设备连接到计算机的 Android 设备有关,并且在 API 14 中已被弃用:developer.android.com/reference/android/content/…
    猜你喜欢
    • 2011-10-22
    • 2011-10-27
    • 2012-02-03
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多