Ответ 1
Ага! Я понял. У меня была та же самая проблема.
Суть его в том, что если вы запускаете приложение автоматически, когда устройство подключено (используя файл манифеста), то появляется система 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" />
У вас будет файл device_filter.xml в папке /res/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>
В любом случае, я надеюсь, что это поможет кому-то! Я был удивлен, что уже не смог найти решение для этого!