6

USB_DEVICE_ATTACHED インテントに基づいて開始するサービスを Android で作成したいと考えています。したがって、基本的に、私のサービスは特定の USB デバイス (FT232C - VID:PID 0403:6010) が接続されたときに開始され、その USB デバイスが取り外されると停止します。それを行うことは可能ですか、それともまだ開始されていない場合に備えて、このサービスを開始するアクティビティを常に持つ必要がありますか? サービスの最終的な目的は、この USB デバイスから提供される場所に基づいて、LocationProvider の場所を TEST_PROVIDER で更新することです。

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 に答える
0

はい、可能性は非常に高いです。AndroidManifest.xmlのreveiverタグで間違ったインテントフィルターを使用していると言って申し訳ありません。案内させてください

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>

BroadcastReceiverファイル

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 に答える