6

我想在 Android 中编写一个基于 USB_DEVICE_ATTACHED 意图启动的服务。所以,基本上我的服务应该在连接特定的 USB 设备(FT232C - VID:PID 0403:6010)时启动,并在断开该 USB 设备时停止。是否可以这样做,或者我是否应该始终有一个启动该服务的活动,以防它尚未启动?该服务的最终目的是根据该 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()

4

3 回答 3

8

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

我已经在这里放置了一些工作代码:
https
://stackoverflow.com/a/15151075/588476 您只需要更改它,它就会自动启动和停止您的服务。

于 2013-03-10T23:41:13.273 回答
1

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

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

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

于 2013-06-19T17:02:48.503 回答
0

是的,很可能,很抱歉,您在 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"))
        {
        }
    } 
}
于 2012-11-20T03:25:23.733 回答