Android: обнаружение USB

Есть ли способ (программно) узнать в своей деятельности/приложении, что пользователь подключил ваш телефон к ПК через 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();
            }
        }  
   }      
}