ユーザーがUSB経由で電話をPCに接続したことをアクティビティ/アプリケーションで(プログラムで)知る方法はありますか?
最近のバージョンのAndroid)で廃止されたUMS_CONNECTED
の使用を提案する人もいます。これに関する他の問題は、MTP対応デバイスでは機能しないことです。
他の人は、BatteryManager
、より正確にはACTION_BATTERY_CHANGED
、およびBATTERY_PLUGGED_AC
とBATTERY_PLUGGED_USB
の使用を提案しました。これは、デバイスのバッテリーまたは充電ステータスを検出する場合に最適です。 、しかし、USB接続の本当に良い指標ではありません。バッテリーマネージャーの使用は、XOOM、ICONIAタブA510、古いAsusタブレットなどの古いAndroidタブレットでは失敗する傾向があります。
デバイスがPCに接続されていることを純粋に検出するには、次のことができます。connected
のものの代わりにAndroid.hardware.usb.action.USB_STATE
と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接続を検出することができました、
IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED); BroadcastReceiver bd = new intentReceiver(); registerReceiver(bd、mIntentFilter);
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")) {...}
}
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;
}
}
これは私にとってはうまくいきます。
これを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();
}
}
}
}
Android.intent.action.ums_connected
をチェックする際の主な問題は、MTPプロトコルを使用するデバイス(Samsung Nexus Galaxyなど)がこのブロードキャストを受信しないことです。
これが、スマートフォンが接続されているか接続されていないかを検出するために別の方法を使用している理由です。
電池の状態を確認します。バッテリーでイベントが発生したときに呼び出されるACTION_BATTERY_CHANGED
というインテントがあります。このインテントには、いくつかの情報を含むいくつかの追加フィールドがあります。それらの1つは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
にいつ変更されるかを確認する必要があります。