Android – Bluetooth-Erkennung findet kein Gerät

Lesezeit: 7 Minuten

Benutzer-Avatar
Amesys

Ich arbeite derzeit an einer kleinen App, um mit den Diensten zu beginnen, die die Bluetooth-Android-API bereitstellen kann.

Bearbeiten -> Antwort:

Es scheint, dass das Problem auf die spezifischen Nexus 5-Geräte zurückzuführen ist. Scheint, als ob ihr Bluetooth-Empfänger nicht gut funktioniert. Die folgende Lösung sollte für andere Geräte funktionieren

Anmerkung:

  1. Ich habe die Dokumentation hier gelesen: http://developer.android.com/guide/topics/connectivity/bluetooth.html
    sowie den folgenden Quellcode dieses Tutorials http://www.londatiga.net/it/programming/android/how-to-programmatically-scan-or-discover-android-bluetooth-device/ befindet sich auf github unter /lorensiuswlt/AndroBluetooth

  2. Ich habe fast alle Funktionen, die mich interessierten, abgeschlossen (z. B. auf Vorhandensein von Adaptern prüfen, Blueooth aktivieren/deaktivieren, gekoppelte Geräte abfragen, den Adapter auffindbar machen).

Ausgabe:

Eigentlich Es wird kein Gerät gefunden wenn ich die Methode .onDiscovery() starte, obwohl Geräte über Einstellungen/Bluetooth auf meinem Nexus 5 gefunden werden.

So handhabe ich es:

public class MainActivity extends AppCompatActivity {
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

...

protected void onCreate(Bundle savedInstanceState) {
IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(mReceiver, filter); 
}

Das Filter funktioniert gut soweit ich es versuchen konnte, dh ACTION_STATE_CHANGED (bei Bluetooth-Aktivierung) und die beiden ACTION_DISCOVERY_***.

Die folgende Methode wird dann erfolgreich aufgerufen:

public void onDiscovery(View view)
{
    mBluetoothAdapter.startDiscovery();
}

Und dann habe ich meinen Bluetooth-Empfänger:

private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

            if (state == BluetoothAdapter.STATE_ON) {
                showToast("ACTION_STATE_CHANGED: STATE_ON");
            }
        }

        else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            mDeviceList = new ArrayList<>();
            showToast("ACTION_DISCOVERY_STARTED");
            mProgressDlg.show();
        }

        else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action) && !bluetoothSwitchedOFF) {
            mProgressDlg.dismiss();
            showToast("ACTION_DISCOVERY_FINISHED");

            Intent newIntent = new Intent(MainActivity.this, DeviceListActivity.class);

            newIntent.putParcelableArrayListExtra("device.list", mDeviceList);

            startActivity(newIntent);
        }

        else if (BluetoothDevice.ACTION_FOUND.equals(action)) {// When discovery finds a device
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            mDeviceList.add(device);
            showToast("Device found = " + device.getName());
        }
    }
};

Ich habe keine Probleme beim Herauskommen des Logcats und habe während des von mir durchgeführten Tests keine Probleme bemerkt. Das einzige Problem ist das Es wird kein Gerät erkannt am Ende des Scans, wenn viele erkennbare in der Nähe verfügbar sind.

Ich habe versucht, nicht zu viel Code einzufügen, um das Thema nicht zu überschwemmen. Fragen Sie mich, wenn Sie mehr brauchen.

Danke, dass Sie mich gelesen haben, und danke im Voraus für Ihre Antworten.

  • Ich hatte die Standortberechtigung in meinem Manifest mit Nexus 5 und konnte keine Geräte finden. Was mir fehlte, war, vor der Suche nach Geräten nicht in der MainActivity (oder einer anderen Aktivität, die die Suche hostet) nach einer Standorterlaubnis zu fragen. Das hat das Problem für mich gelöst

    – Khasch

    1. September 2019 um 19:30 Uhr

Benutzer-Avatar
nverbeek

Auf welcher Android-Version läuft das? Wenn es sich um Android 6.x handelt, müssen Sie meiner Meinung nach das hinzufügen ACCESS_FINE_LOCATION Erlaubnis zu Ihrem Manifest. Zum Beispiel:

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

Ich hatte ein ähnliches Problem und das hat es für mich behoben.

AKTUALISIEREN: Hinzufügen Dokumentation direkt von Google dazu:

Um über Bluetooth und Wi-Fi-Scans auf die Hardwarekennungen von externen Geräten in der Nähe zugreifen zu können, muss Ihre App jetzt über die ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION Berechtigungen

UPDATE 2020: Wir haben kürzlich unsere Anwendung auf die SDK-Version 29 aktualisiert. Dadurch konnte unsere Anwendung keine Bluetooth-Geräte mehr erkennen. Wir haben verwendet ACCESS_COARSE_LOCATION da diese Antwort ursprünglich geschrieben wurde. Wechseln zu ACCESS_FINE_LOCATION scheint das Problem zu beheben. Ich empfehle jetzt Entwicklern, es zu versuchen ACCESS_FINE_LOCATION wenn Sie auf 29+ abzielen. Antwort aktualisiert, um dies widerzuspiegeln.

  • Das hat nicht funktioniert, und ich sehe ehrlich gesagt nicht ein, warum das so sein sollte, da es bei dieser Berechtigung um die Verwendung des Network Location Provider von Android geht. Sind Sie sicher, dass dies Ihr Problem behoben hat?

    – Amesys

    23. Januar 2016 um 21:59 Uhr


  • Ja. Wir hatten Bluetooth auf Android 5 voll funktionsfähig und das einzige Problem beim Upgrade auf 6 war, dass Bluetooth-Geräte während der Erkennung nicht gefunden wurden. Es hat für uns auch keinen Sinn gemacht. Wir verwenden die startDiscovery() Methode, genau wie du.

    – nverbeek

    24. Januar 2016 um 14:40 Uhr

  • Hast du auch die BLUETOOTH und BLUETOOTH_ADMIN Berechtigungen angegeben? Ich kann mir vorstellen, dass Sie das tun, aber ich dachte, ich würde fragen.

    – nverbeek

    24. Januar 2016 um 14:43 Uhr

  • @nverbeek Danke für die Lösung! Vielleicht sollten Sie auch erwähnen, dass es nicht ausreicht, die Berechtigung nur im Manifest zu setzen, sondern sie auch zur Laufzeit anzufordern, da beide Berechtigungen dies erfordern.

    – Wjatscheslaw

    3. Oktober 2016 um 14:45 Uhr

  • Danke, Seltsam wie die Bluetooth-Dokumentation an developer.android.com/guide/topics/connectivity/bluetooth.html erwähnt dies nicht

    – Joe Maher

    27. Januar 2017 um 2:42 Uhr

Benutzer-Avatar
Nils

Etwas spät zur Party, aber das kann für andere Leute nützlich sein.

Sie müssen zwei Dinge tun

  1. Hinzufügen <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

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

zu Ihrer AndroidManifest.xml

  1. Stellen Sie sicher, dass Sie die Berechtigung zur Laufzeit auch für Android 6.0-Geräte anfordern, indem Sie so etwas verwenden

    int MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1; 
    ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
            MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
    

    kurz bevor mBluetoothAdapter.startDiscovery();

Wenn Sie Schritt 2 nicht ausführen, können Sie auf Geräten mit Android >= 6.0 keine Informationen zur Hardwarekennung abrufen

AKTUALISIEREN/BEARBEITEN:

Beispiel mit Android-Versionsprüfung und Warndialog als Warnung

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {  // Only ask for these permissions on runtime when running Android 6.0 or higher
    switch (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION)) {
        case PackageManager.PERMISSION_DENIED:
            ((TextView) new AlertDialog.Builder(this)
                    .setTitle("Runtime Permissions up ahead")
                    .setMessage(Html.fromHtml("<p>To find nearby bluetooth devices please click \"Allow\" on the runtime permissions popup.</p>" +
                            "<p>For more info see <a href=\"http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id\">here</a>.</p>"))
                    .setNeutralButton("Okay", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            if (ContextCompat.checkSelfPermission(getBaseContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                                ActivityCompat.requestPermissions(DeviceListActivity.this,
                                        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                                        REQUEST_ACCESS_COARSE_LOCATION);
                            }
                        }
                    })
                    .show()
                    .findViewById(android.R.id.message))
                    .setMovementMethod(LinkMovementMethod.getInstance());       // Make the link clickable. Needs to be called after show(), in order to generate hyperlinks
            break;
        case PackageManager.PERMISSION_GRANTED:
            break;
    }
}

  • hat für mich funktioniert, aber dann sollte startDiscovery() false zurückgeben, falls es keinen Zugriff erhalten kann. Es gibt immer noch true zurück, was ein bisschen irreführend ist …

    – Mallaudin

    21. Mai 2016 um 17:52 Uhr


  • Das kann daran liegen, dass es Zugriff zum Scannen erhält, aber keine Informationen über die Geräte selbst abrufen kann. developer.android.com/about/versions/marshmallow/…

    – Nils

    23. Mai 2016 um 8:41 Uhr


  • Ich schlage seit 3 ​​Tagen meinen Kopf gegen eine Wand und versuche, ihn zum Klingen zu bringen. dann diesen Beitrag gefunden, Schritt 2 befolgt und Bingo !! Es klappt. Vielen Dank

    – NoLeber92

    14. Juni 2016 um 18:21 Uhr

  • Ich hatte viele ungelöste Referenzen, als ich diesen Code zu meinem Projekt hinzufügte, aber es war der fehlende Link – Danke!

    – ChronoFisch

    12. März 2017 um 1:14 Uhr

  • Ich war nicht gezwungen, den “Schritt 2” auf meinem persönlichen Android-Gerät mit Android 8.0.0 zu verwenden. Stattdessen war ich auf anderen Geräten gezwungen, die Erlaubnis auf diese Weise anzufordern. Ich denke also, dass der “Schritt 2” nicht für alle Geräte mit Android >= 6.0 obligatorisch ist. Es bedarf weiterer Untersuchungen…

    – bitfox

    11. März 2019 um 10:38 Uhr


1090620cookie-checkAndroid – Bluetooth-Erkennung findet kein Gerät

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy