Android: detección de USB

¿Hay alguna manera de saber (programáticamente) en su Actividad / Aplicación que el usuario ha conectado su teléfono a la PC a través de USB?

Algunas personas sugirieron usar UMS_CONNECTED que está en desuso a partir de la versión reciente de Android. El otro problema es que no funciona con dispositivos habilitados para MTP.

Otros sugirieron el uso del BatteryManager , más precisamente ACTION_BATTERY_CHANGED así como BATTERY_PLUGGED_AC y BATTERY_PLUGGED_USB Esto es perfecto si desea detectar el estado de la batería o de carga del dispositivo, pero no es un buen indicador de una conexión USB. El uso del administrador de la batería es propenso a fallas en las tabletas Android antiguas, como la XOOM, la pestaña ICONIA A510 y las tabletas Asus antiguas.

Para detectar completamente que el dispositivo está conectado a una PC, puede: Usar android.hardware.usb.action.USB_STATE y connected en lugar de las cosas de BatteryManager

Muestra de código

 public static boolean isConnected(Context context) { intent = context.registerReceiver(null, new IntentFilter("android.hardware.usb.action.USB_STATE")); return intent.getExtras().getBoolean("connected"); } 

Espero que esto ayude

Pudo detectar la conexión USB registrando un receptor de transmisión siguiendo,

 IntentFilter mIntentFilter = new IntentFilter (Intent.ACTION_UMS_CONNECTED);

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

Manifest.xml:

      

MyReceiver:

 public class MyReceiver extends BroadcastReceiver{ if (intent.getAction().equalsIgnoreCase( "android.intent.action.UMS_CONNECTED")) {...} } 

Si todo lo que quiere hacer es detectar si tiene acceso a la tarjeta sd, entonces funcionará lo siguiente:

 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; } } 

El problema principal al verificar android.intent.action.ums_connected es que los dispositivos que usan el protocolo MTP (como Samsung Nexus Galaxy) no reciben esta transmisión.

Es por eso que estoy usando otra forma de detectar cuando el teléfono inteligente está enchufado o desenchufado:

Verifico el estado de la batería. Hay un bash llamado ACTION_BATTERY_CHANGED llamado cuando ocurre un evento en la batería. En este bash, hay algunos campos adicionales que contienen algunas informaciones. Uno de ellos es 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. 

Las otras constantes son BATTERY_PLUGGED_AC y BATTERY_PLUGGED_USB

Por lo tanto, con esta transmisión puede saber si el teléfono inteligente se ha conectado a USB, incluso si utiliza el protocolo MTP.

Para saber si el teléfono inteligente está desenchufado, solo debe verificar si el valor EXTRA_PLUGGED cambia de BATTERY_PLUGGED_USB a 0