web-dev-qa-db-ja.com

Android:USBの検出

ユーザーがUSB経由で電話をPCに接続したことをアクティビティ/アプリケーションで(プログラムで)知る方法はありますか?

15
AjOnFire

最近のバージョンのAndroid)で廃止されたUMS_CONNECTEDの使用を提案する人もいます。これに関する他の問題は、MTP対応デバイスでは機能しないことです。

他の人は、BatteryManager、より正確にはACTION_BATTERY_CHANGED、およびBATTERY_PLUGGED_ACBATTERY_PLUGGED_USBの使用を提案しました。これは、デバイスのバッテリーまたは充電ステータスを検出する場合に最適です。 、しかし、USB接続の本当に良い指標ではありません。バッテリーマネージャーの使用は、XOOM、ICONIAタブA510、古いAsusタブレットなどの古いAndroidタブレットでは失敗する傾向があります。

デバイスがPCに接続されていることを純粋に検出するには、次のことができます。connectedのものの代わりにAndroid.hardware.usb.action.USB_STATEBatteryManagerを使用する

コードサンプル

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

お役に立てれば

38
Faeriol

以下の方法で放送受信機を登録することでUSB接続を検出することができました、

 IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_UMS_CONNECTED); 
 
 BroadcastReceiver bd = new intentReceiver(); 
 registerReceiver(bd、mIntentFilter); 
 
5
AjOnFire

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")) {...}
}
5
Karoly

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
speedplane

これは私にとってはうまくいきます。

これを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
jmarkstar

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_ACBATTERY_PLUGGED_USBです。

したがって、このブロードキャストを使用すると、MTPプロトコルを使用している場合でも、スマートフォンがUSBに接続されているかどうかを知ることができます。

スマートフォンのプラグが抜かれているかどうかを知るには、EXTRA_PLUGGEDの値がBATTERY_PLUGGED_USBから0にいつ変更されるかを確認する必要があります。

3
darkheir