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_ACBATTERY_PLUGGED_USB 如果您想检测设备的电池或充电状态,这是完美的选择,但并不是 USB 连接的一个很好的指标。 在 XOOM、ICONIA tab A510 和较旧的华硕平板电脑等较旧的 Android 平板电脑上使用电池管理器很容易失败。

要纯粹检测设备是否已插入 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");
    

希望对你有帮助

【讨论】:

从文档中不清楚这实际上检测到了什么。就我而言,我正在尝试诊断有故障的 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_ACBATTERY_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实现人体检测(含源码,可实时人体检测)

行人检测和人脸检测和人脸关键点检测(C++/Android源码)

Android实现车辆检测(含Android源码 可实时运行)