Frage

Ich verstehe, wie eine Liste der gekoppelten Geräte zu bekommen, aber wie kann ich sagen, wenn sie verbunden sind?

Es muss möglich sein, da ich sie sehe aufgeführt in meinem Handy Bluetooth-Geräteliste und es heißt ihren Verbindungsstatus an.

War es hilfreich?

Lösung

Hinzufügen von Bluetooth-Erlaubnis zu Ihrem AndroidManifest,

<uses-permission android:name="android.permission.BLUETOOTH" />

Dann mit Absicht Filter zum ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECT_REQUESTED und ACTION_ACL_DISCONNECTED Sendungen hören:

public void onCreate() {
    ...
    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
    filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
    filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
    this.registerReceiver(mReceiver, filter);
}

//The BroadcastReceiver that listens for bluetooth broadcasts
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
           ... //Device found
        }
        else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
           ... //Device is now connected
        }
        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
           ... //Done searching
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED.equals(action)) {
           ... //Device is about to disconnect
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
           ... //Device has disconnected
        }           
    }
};

Ein paar Anmerkungen:

  • Es gibt keine Möglichkeit, eine Liste der angeschlossenen Geräte beim Start der Anwendung abzurufen. Die Bluetooth-API ermöglicht es Ihnen nicht zu QUERY, anstatt es Ihnen Änderungen zu hören.
  • A hoaky Arbeit um für das obige Problem wäre es, die Liste aller bekannten / Gekoppelte Geräte abrufen ... dann zu jedem Verbindungsversuch (um festzustellen, ob Sie verbunden sind).
  • Alternativ könnten Sie einen Hintergrunddienst haben den Bluetooth-API beobachten und die Gerätezustände auf der Festplatte für Ihre Anwendung zu Anwendung zu einem späteren Zeitpunkt schreiben.

Andere Tipps

In meinem Anwendungsfall Ich wollte nur sehen, ob ein Bluetooth-Headset für ein VoIP-App verbunden ist. Die folgende Lösung für mich gearbeitet:

public static boolean isBluetoothHeadsetConnected() {
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    return mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()
            && mBluetoothAdapter.getProfileConnectionState(BluetoothHeadset.HEADSET) == BluetoothHeadset.STATE_CONNECTED;
} 

Natürlich werden Sie die Erlaubnis Bluetooth benötigen:

<uses-permission android:name="android.permission.BLUETOOTH" />

Vielen Dank an Skylarsutton für seine Antwort. Ich poste dies als eine Antwort auf seine, sondern weil ich Posting Code bin, kann ich nicht als Kommentar antworten kann. Ich upvoted bereits seine Antwort so auf der Suche bin nicht für Punkte. zahlen Sie es einfach nach vorne.

Aus irgendeinem Grund BluetoothAdapter.ACTION_ACL_CONNECTED konnte nicht von Android Studio aufgelöst werden. Vielleicht war es in Android 4.2.2 veraltet? Hier ist eine Modifikation seines Codes. Der Registrierungscode ist die gleiche; der Empfängercode unterscheidet sich geringfügig. Ich benutze dies in einem Dienst, aktualisiert einen Bluetooth-connected-Flag, dass andere Teile der App Referenz.

    public void onCreate() {
        //...
        IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);
        IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);
        IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);
        this.registerReceiver(mReceiver, filter1);
        this.registerReceiver(mReceiver, filter2);
        this.registerReceiver(mReceiver, filter3);
    }

    //The BroadcastReceiver that listens for bluetooth broadcasts
    private final BroadcastReceiver BTReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            //Do something if connected
            Toast.makeText(getApplicationContext(), "BT Connected", Toast.LENGTH_SHORT).show();
        }
        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
            //Do something if disconnected
            Toast.makeText(getApplicationContext(), "BT Disconnected", Toast.LENGTH_SHORT).show();
        }
        //else if...
    }
};

Dieser Code ist für die Headset Profile, wahrscheinlich wird es auch für andere Profile zu arbeiten. Zuerst müssen Sie Profil Hörer (Kotlin-Code) zur Verfügung zu stellen:

private val mProfileListener = object : BluetoothProfile.ServiceListener {
    override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
        if (profile == BluetoothProfile.HEADSET) 
            mBluetoothHeadset = proxy as BluetoothHeadset            
    }

    override fun onServiceDisconnected(profile: Int) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = null
        }
    }
}

Dann, während Bluetooth-Überprüfung:

mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET)
if (!mBluetoothAdapter.isEnabled) {
    return Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
}

Es dauert ein wenig Zeit, bis onSeviceConnected genannt wird. Danach können Sie die Liste der angeschlossenen Headset Geräte bekommen können aus:

mBluetoothHeadset!!.connectedDevices

BluetoothAdapter.getDefaultAdapter().isEnabled -> gibt true zurück, wenn Bluetooth ist offen

val audioManager = this.getSystemService(Context.AUDIO_SERVICE) as AudioManager

audioManager.isBluetoothScoOn -> gibt true zurück, wenn das Gerät angeschlossen

Ich weiß, dass dieses Thema etwas alt ist, aber ich brauchte wirklich zu wissen, ob ein Gerät direkt beim Start meiner App verbunden war, und ich fand die Lösung!

//List of Paired Devices
Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();

if (pairedDevices.size() > 0) {
// There are paired devices. Get the name and address of each paired device.

    for (BluetoothDevice device : pairedDevices) {
        String deviceName = device.getName();
        String deviceHardwareAddress = device.getAddress(); // MAC address
    }
}
else {
//There are no paired devices.
}

Sie ist hier, in Kotlin auch: https: // developer.android.com/guide/topics/connectivity/bluetooth#QueryPairedDevices

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top