Aha! Я понял. У меня была точно такая же проблема.
Суть этого в том, что если ваше приложение запускается автоматически при подключении устройства (с помощью файла манифеста), то, по-видимому, система Android получает намерение ACTION_USB_DEVICE_ATTACHED, а затем, так как оно знает, что ваше приложение хочет работать в этой ситуации, оно фактически отправляет вашему приложению намерение android.intent.action.MAIN. Он никогда не отправляет действие ACTION_USB_DEVICE_ATTACHED вашему приложению, поскольку думает, что оно уже знает, что ваше приложение хочет сделать в этой ситуации.
Я только что определила проблему, и я думаю, что у меня есть решение, но я могу рассказать вам, что я нашла:
Даже если ваше приложение работает и на переднем плане, когда вы подключаете USB-устройство и система Android получает намерение ACTION_USB_DEVICE_ATTACHED, оно будет вызывать onResume () в вашей активности.
К сожалению, вы не можете просто сделать это:
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
//do something
}
}
Поскольку намерение вернется в виде android.intent.action.MAIN, а не ACTION_USB_DEVICE_ATTACHED.
Досадно, что вы также получаете android.intent.action.MAIN, если просто выходите из приложения, но не отключаете USB. Я полагаю, что перевод устройства в спящий режим и его повторное включение приведет к тому же самому.
Итак, из того, что я обнаружил, вы не можете получить намерение напрямую, но кажется, что вы можете полагаться на вызов onResume () при подключении устройства USB, поэтому решение состоит в том, чтобы просто проверить, чтобы увидеть если USB подключен каждый раз, когда вы получаете onResume. Вы также можете установить флаг, когда USB отключен, потому что, конечно, намерение отключения USB срабатывает очень хорошо.
Итак, ваш вещательный приемник может выглядеть так:
// BroadcastReceiver when remove the device USB plug from a USB port
BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
usbConnected=false;
}
}
};
Это будет внутри onCreate:
// listen for new devices
IntentFilter filter = new IntentFilter();
filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mUsbReceiver, 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" />
В вашей папке / res / xml / будет находиться файл device_filter.xml, который выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<usb-device vendor-id="1027" product-id="24577" />
<usb-device vendor-id="1118" product-id="688" />
</resources>
(конечно, с любыми идентификаторами поставщиков и идентификаторами продуктов, которые вам нужны)
И тогда ваш onCreate выглядит примерно так:
@Override
public void onResume() {
super.onResume();
Intent intent = getIntent();
Log.d(TAG, "intent: " + intent);
String action = intent.getAction();
if (usbConnected==false ) {
//check to see if USB is now connected
}
}
У меня нет специального кода для проверки, подключен ли USB, поскольку я на самом деле еще не углубился в это. Я использую библиотеку, которая просто подключится, если сможет, поэтому для своего приложения я могу просто запустить этот цикл, и я в порядке.
Также, вероятно, важно установить режим запуска вашей активности в манифесте на "singleTask", чтобы предотвратить его повторный запуск, когда он уже запущен, или же подключение к USB-устройству просто запустит второй экземпляр вашего приложения!
Так что весь мой тег активности в моем манифесте выглядит так:
<activity
android:label="@string/app_name"
android:name="com.awitness.common.TorqueTablet"
android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen"
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask"
>
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
<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>
В любом случае, я надеюсь, что это кому-то поможет! Я был удивлен, что не смог найти решение для этого уже!