Есть ли способ (программно) узнать в своей деятельности/приложении, что пользователь подключил ваш телефон к ПК через USB?
Android: обнаружение USB
Ответ 1
Некоторые люди предложили использовать UMS_CONNECTED
, который устарел по сравнению с последней версией Android
Другая проблема заключается в том, что он не работает с устройствами с поддержкой MTP.
Другие предложили использовать BatteryManager
, точнее ACTION_BATTERY_CHANGED
, а также BATTERY_PLUGGED_AC
и BATTERY_PLUGGED_USB
Это идеально, если вы хотите обнаружить состояние батареи или зарядки устройства, но не очень хороший индикатор подключения USB.
Использование менеджера батарей связано с отказом на старых планшетах для Android, таких как XOOM, вкладка ICONIA A510 и более старые планшеты Asus.
Чтобы убедиться, что устройство подключено к ПК, вы можете:
Используйте android.hardware.usb.action.USB_STATE
и connected
вместо материала BatteryManager
Пример кода
public static boolean isConnected(Context context) {
intent = context.registerReceiver(null, new IntentFilter("android.hardware.usb.action.USB_STATE"));
return intent.getExtras().getBoolean("connected");
}
Надеюсь, что это поможет
Ответ 2
Было возможно обнаружить USB-соединение, зарегистрировав широковещательный приемник, следуя,
IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED); BroadcastReceiver bd = new intentReceiver(); registerReceiver(bd, mIntentFilter);
Ответ 3
Manifest.xml:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.ums_connected" />
</intent-filter>
</receiver>
MyReceiver:
public class MyReceiver extends BroadcastReceiver{
if (intent.getAction().equalsIgnoreCase(
"android.intent.action.UMS_CONNECTED")) {...}
}
Ответ 4
Если все, что вы хотите сделать, это определить, есть ли у вас доступ к SD-карте, тогда будет работать следующее:
private boolean canWriteToFlash() {
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// Read only isn't good enough
return false;
} else {
return false;
}
}
Ответ 5
Основная проблема при проверке android.intent.action.ums_connected
заключается в том, что устройства, использующие протокол MTP (например, Samsung Nexus Galaxy), не получают эту трансляцию.
Вот почему я использую другой способ обнаружения, когда смартфон подключен или отсоединен:
Я проверяю состояние batery. Существует намерение, называемое ACTION_BATTERY_CHANGED
, когда происходит событие на батарее. В этом намерении есть несколько дополнительных полей, содержащих некоторую информацию. Один из них EXTRA_PLUGGED
:
Indicating whether the device is plugged in to a power source; 0 means it is on battery, other constants are different types of power sources.
Другие константы BATTERY_PLUGGED_AC
и BATTERY_PLUGGED_USB
Итак, с этой трансляцией вы можете узнать, был ли подключен смартфон к USB, даже если он использует протокол MTP.
Чтобы узнать, отключен ли смартфон, вам нужно проверить, когда значение EXTRA_PLUGGED
изменяется с BATTERY_PLUGGED_USB
на 0
Ответ 6
Это работает для меня.
Добавьте это на свой AndroidManifest.xml
<receiver android:name=".PlugInControlReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
<action android:name="android.hardware.usb.action.USB_STATE" />
</intent-filter>
</receiver>
И создайте свой BroadcastReceiver
.
public class PlugInControlReceiver extends BroadcastReceiver {
@Override public void onReceive(final Context context, Intent intent) {
String action = intent.getAction();
Log.v("PlugInControlReceiver","action: "+action);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
if(action.equals("android.hardware.usb.action.USB_STATE")) {
if(intent.getExtras().getBoolean("connected")){
Toast.makeText(context, "USB Connected", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "USB Disconnected", Toast.LENGTH_SHORT).show();
}
}
} else {
if(action.equals(Intent.ACTION_POWER_CONNECTED)) {
Toast.makeText(context, "USB Connected", Toast.LENGTH_SHORT).show();
}
else if(action.equals(Intent.ACTION_POWER_DISCONNECTED)) {
Toast.makeText(context, "USB Disconnected", Toast.LENGTH_SHORT).show();
}
}
}
}