it-swarm.com.de

Android - Die Bluetooth-Erkennung findet kein Gerät

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 an den spezifischen Nexus 5-Geräten lag. Scheint, als ob ihr Bluetooth-Empfänger nicht gut funktioniert. Die folgende Lösung sollte für andere Geräte funktionieren

Bemerkung:

  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/ auf github unter/lorensiuswlt/AndroBluetooth

  2. Ich habe fast alle Funktionen abgeschlossen, die mich interessiert haben (z. B. die Überprüfung auf das Vorhandensein von Adaptern, das Aktivieren/Deaktivieren der Blueooth-Funktion, das Abfragen gepaarter Geräte und das Festlegen, dass der Adapter erkannt werden kann).

Problem:

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

So gehe ich damit um:

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); 
}

Der Filter funktioniert soweit ich kann gut , d. H. ACTION_STATE_CHANGED (bei aktivierter Bluetooth-Funktion) 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 mit dem Logcat und habe während des Tests keine Probleme bemerkt. Das einzige Problem ist, dass am Ende des Scans kein Gerät erkannt wird , wenn viele erkennbare Geräte in der Nähe verfügbar sind.

Ich habe versucht, nicht zu viel Code zu schreiben, um das Thema nicht zu überfluten. Frag mich, ob du mehr brauchst.

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

38
Amesys

Auf welcher Version von Android läuft dies? Wenn es Android= 6.x ist, müssen Sie meines Erachtens die Berechtigung ACCESS_COURSE_LOCATION Hinzufügen zu Ihrem Manifest. Zum Beispiel:

<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/> 

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

UPDATE: Hinzufügen Dokumentation direkt von Google dazu:

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

71
nverbeek

Ein bisschen zu spät zur Party, aber das kann für andere nützlich sein.

Sie müssen zwei Dinge tun

  1. Addiere <uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>

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

zu Ihrem AndroidManifest.xml

  1. Stellen Sie sicher, dass Sie die Berechtigung auch zur Laufzeit 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 vor mBluetoothAdapter.startDiscovery();

Wenn Sie Schritt 2 nicht ausführen, können Sie mit Android> = 6.0

PDATE/EDIT:
Beispiel mit Android Versionsüberprü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;
    }
}
60
Nils