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

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

14 голосов
/ 05 января 2011

Есть ли способ (программно) узнать в вашей Активности / Приложении, что пользователь подключил ваш телефон к ПК через USB?

Ответы [ 6 ]

38 голосов
/ 20 июля 2013

Некоторые люди предложили использовать 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");
    }

Надеюсь, это поможет

5 голосов
/ 27 марта 2011

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")) {...}
}
5 голосов
/ 05 января 2011

Был в состоянии обнаружить USB-соединение, зарегистрировав широковещательный приемник, выполнив,

IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED);

BroadcastReceiver bd = new intentReceiver();
registerReceiver(bd, mIntentFilter);

4 голосов
/ 13 сентября 2011

Если все, что вы хотите сделать, это определить, есть ли у вас доступ к 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;
    }
}
3 голосов
/ 04 февраля 2019

Это работает для меня.

Добавьте это на свой 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();
            }
        }  
   }      
}
3 голосов
/ 07 августа 2012

Основная проблема при проверке android.intent.action.ums_connected заключается в том, что устройства, использующие протокол MTP (например, Samsung Nexus Galaxy), не получают эту трансляцию.

Именно поэтому я использую другой способ обнаружениякогда смартфон подключен или отключен:

Я проверяю состояние аккумулятора.Существует намерение под названием 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

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...