有没有办法在您的活动/应用程序中(以编程方式)知道用户已通过USB将手机连接到PC?
答案 0 :(得分:38)
有些人建议使用UMS_CONNECTED
,该版本在Android的最新版本中已弃用
另一个问题是它不适用于支持MTP的设备
其他人建议使用BatteryManager
,更准确地说ACTION_BATTERY_CHANGED
以及BATTERY_PLUGGED_AC
和BATTERY_PLUGGED_USB
如果您想要检测设备的电池或充电状态,这是完美的,但不是USB连接的真正良好指示。
使用电池管理器很容易在较旧的Android平板电脑上失败,例如XOOM,ICONIA标签A510和较旧的华硕平板电脑。
要完全检测到设备已插入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");
}
希望这有帮助
答案 1 :(得分:5)
能够通过以下方式注册广播接收器来检测USB连接,
IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED); BroadcastReceiver bd = new intentReceiver(); registerReceiver(bd, mIntentFilter);
答案 2 :(得分: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")) {...}
}
答案 3 :(得分: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;
}
}
答案 4 :(得分: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_AC
和BATTERY_PLUGGED_USB
通过此广播,即使使用MTP协议,您也可以知道智能手机是否已插入USB。
要知道智能手机是否已拔下,您必须检查EXTRA_PLUGGED
值何时从BATTERY_PLUGGED_USB
变为0
答案 5 :(得分:2)
这对我有用。
将此添加到您的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();
}
}
}
}