Android:检测 USB
Posted
技术标签:
【中文标题】Android:检测 USB【英文标题】:Android: Detecting USB 【发布时间】:2011-06-03 19:22:57 【问题描述】:有什么方法可以(以编程方式)在您的活动/应用程序中知道用户已通过 USB 将您的手机连接到 PC?
【问题讨论】:
【参考方案1】:有些人建议使用UMS_CONNECTED
,它在最新版本的 android 中已被弃用
另一个问题是它不适用于支持 MTP 的设备
其他人建议使用BatteryManager
,更准确地说是ACTION_BATTERY_CHANGED
以及BATTERY_PLUGGED_AC
和BATTERY_PLUGGED_USB
如果您想检测设备的电池或充电状态,这是完美的选择,但并不是 USB 连接的一个很好的指标。
在 XOOM、ICONIA tab A510 和较旧的华硕平板电脑等较旧的 Android 平板电脑上使用电池管理器很容易失败。
要纯粹检测设备是否已插入 PC,您可以:
使用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");
希望对你有帮助
【讨论】:
从文档中不清楚这实际上检测到了什么。就我而言,我正在尝试诊断有故障的 USB 电缆,有时电源状态不会改变,但 USB 会进出 - 后者是我想要检测的。【参考方案2】:能够通过以下注册广播接收器来检测USB连接,
IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED); BroadcastReceiver bd = new intentReceiver(); registerReceiver(bd, mIntentFilter);【讨论】:
如果设备使用的是 MTP 协议而不是 UMS 协议(例如 Galaxy Nexus 使用的是 MTP 协议)则不起作用 @darkheir 感谢您指出这一点。找到通用解决方案后将更新答案。 @Fresh_Meat 在以下主题中,我建议一个适用于 MTP 和 UMS 的解决方案:***.com/questions/7182986/… 这个想法是检查电池状态,同时检查智能手机是否连接到 USB 或 AC @Fresh_Meat 你真好 :-)【参考方案3】:这对我有用。
将此添加到您的 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();
【讨论】:
【参考方案4】:Manifest.xml:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.ums_connected" />
</intent-filter>
</receiver>
我的接收者:
public class MyReceiver extends BroadcastReceiver
if (intent.getAction().equalsIgnoreCase(
"android.intent.action.UMS_CONNECTED")) ...
【讨论】:
这个 MyReceiver 代码甚至没有意义.. if 在类定义中?【参考方案5】:如果您只想检测您是否可以访问 sdcard,那么以下方法将起作用:
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;
【讨论】:
【参考方案6】:检查android.intent.action.ums_connected
时的主要问题是使用 MTP 协议的设备(例如三星 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
【讨论】:
这不适用于 XOOM 这样的平板电脑,其中电源和 USB 是两个不同的端口 我没有测试它,但也许你可以通过检查它是BATTERY_PLUGGED_USB
还是BATTERY_PLUGGED_AC
来验证它。以上是关于Android:检测 USB的主要内容,如果未能解决你的问题,请参考以下文章
行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)
行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)
行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)
行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)