Служба режима Android USB Host – запуск на основе USB_DEVICE_ATTACHED

Я хочу написать службу на Android, которая начинается с намерения USB_DEVICE_ATTACHED. Таким образом, в основном моя служба должна запускаться, когда определенное USB-устройство (FT232C – VID: PID 0403: 6010) подключается и останавливается при отсоединении этого USB-устройства. Возможно ли это сделать или у меня всегда есть активность, которая запускает эту службу, если она еще не запущена? Целью сервиса в конце является обновление местоположения на LocationProvider с помощью TEST_PROVIDER на основе того, какое местоположение предоставляется с этого USB-устройства.

Я уже пробовал создать службу с этой конфигурацией в 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 переопределен onStartCommand (), который обрабатывает намерение USB_DEVICE_ATTACHED

По моему опыту <service> не может получить USB-намерения. Я преодолел это, создав скрытую активность, чтобы получить намерение и повторно транслировать ее. Конечно, эта деятельность также может помочь начать / остановить обслуживание.

Я уже установил здесь рабочий код:
https://stackoverflow.com/a/15151075/588476
Вам просто нужно будет изменить его, чтобы он запускался и автоматически останавливал ваше обслуживание.

Я считаю, что основной проблемой является числовая база для идентификатора поставщика и продукта. Формат в формате фильтра xml должен быть десятичным, поэтому идентификатор продавца = «1025» и product-id = «24592».

Помимо этого, он должен быть обязательно USB_DEVICE_ATTACHED, а не UMS_CONNECTED (последний вообще не является режимом USB-хоста).

У меня нет авторитетного ответа о том, может ли служба получать трансляцию, или вам нужно использовать для этого какую-либо деятельность, но похоже, что Уэйн Урода имеет хороший опыт в этом вопросе.

Да, это очень хорошо, извините, что вы используете неправильный фильтр намерений в своем тесте для показа в 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> 

Файл 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")) { } } }