2011-01-05 81 views
13

有什么办法在活动/应用程序中知道(以编程方式)用户是否已通过USB将手机连接到PC?Android:检测USB

回答

33

有人使用UMS_CONNECTED被弃用的最新版本的Android 的其他问题与建议它不与MTP功能的设备工作

其他建议选用BatteryManager的,更确切地说ACTION_BATTERY_CHANGED以及BATTERY_PLUGGED_ACBATTERY_PLUGGED_USB 这是完美的,如果你想取消检测设备的电池或充电状态,但不是USB连接的一个很好的指示器。 使用电池管理器很容易在老款Android平板电脑上出现故障,如XOOM,ICONIA选项卡A510和旧款华硕平板电脑。

纯粹的检测设备被插入PC可以上: 使用android.hardware.usb.action.USB_STATEconnected 到位的BatteryManager东西

代码示例

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

希望这有助于

+0

从文档中不清楚这实际检测到的内容。在我的情况下,我正在尝试诊断有故障的USB电缆,有时电源状态不会改变,但USB会进入和退出 - 后者是我正在尝试检测的内容。 – Michael 2014-05-15 20:44:47

5

之所以能够通过下面注册一个广播接收器检测到USB连接,

 
IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED); 

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

+0

我'intentReceiver'出错,所以你可以详细说明 – 2012-02-13 06:35:57

+0

这对我不起作用。 Android 2。2,设备=> HTC Desire – 2012-04-11 03:30:55

+0

如果设备使用的是MTP协议,而不是UMS协议,则不起作用(例如Galaxy Nexus使用MTP协议) – darkheir 2012-07-19 15:32:16

5

的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")) {...} 
} 
+0

This不适合我。 Android 2.2,设备=> HTC Desire – 2012-04-11 03:29:53

+1

@Heshan请参阅更新的答案。 – 66CLSjY 2012-08-07 13:12:06

+0

这个MyReceiver代码甚至没有意义..如果在类定义里面? thanx! – 2016-12-30 12:23:11

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

thanx!这是我需要的代码 – Maep 2011-11-02 08:00:25

3

检查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_ACBATTERY_PLUGGED_USB

所以用这个广播,你可以知道,如果智能手机已在USB被插入,即使它使用MTP协议。

要知道,如果智能手机被拔掉你探微必须检查时,从BATTERY_PLUGGED_USBEXTRA_PLUGGED值更改为0

+4

这不适用于像XOOM这样的平板电脑,其中电源和USB是两个不同的端口 – 2012-10-24 03:21:05