webentwicklung-frage-antwort-db.com.de

BluetoothLeScanner.startScan mit Android 6.0 erkennt keine Geräte

Ich versuche, die Funktion BluatoothLeScanner.startScan anstelle der veralteten Funktion BluetoothAdapter.startLeScan..__ zu verwenden. Gestern habe ich mein Nexus 5 auf Android 6.0 und seit diesem Moment meine App aktualisiert funktioniert nicht mehr . Ich füge zunächst die erforderlichen Einstellungen hinzu: ACCESS_COARSE_LOCATION wie hier angegeben, https://developer.Android.com/about/versions/Marshmallow/Android-6.0-changes.html # behaviour-hardware-id . Dann fügte ich die Berechtigung wie hier beschrieben hinzu: https://developer.Android.com/training/permissions/requesting.html . Aber am Ende Es scheint nicht zu funktionieren, es sendet die ble-Geräte nicht zurück.

Das ist mein Code:

manifest

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="com.stm.sensitronapp">
          <uses-sdk Android:maxSdkVersion="23"/>
          <uses-feature Android:name="Android.hardware.bluetooth_le" Android:required="true"/>

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

DeviceScanActivity

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
...

if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED){
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_COARSE_LOCATION)) {
        } else {
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    MY_PERMISSIONS_REQUEST_ACCESS_COARSE);
        }
    }

// Device scan callback.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION)
                == PackageManager.PERMISSION_GRANTED) {
            mScanCallback = new ScanCallback() {
                @Override
                public void onScanResult(int callbackType, ScanResult result) {
                    super.onScanResult(callbackType, result);
                    mLeDeviceListAdapter.addDevice(result.getDevice());
                    mLeDeviceListAdapter.notifyDataSetChanged();
                }
            };
        }
    } 
}
final BluetoothManager bluetoothManager =
            (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

if (mBluetoothAdapter.getState() == BluetoothAdapter.STATE_ON) {
        mSwipeRefreshLayout.setRefreshing(true);
        mLeDeviceListAdapter.clear();
        mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
        if(ContextCompat.checkSelfPermission(this,
                    Manifest.permission.ACCESS_COARSE_LOCATION ) == PackageManager.PERMISSION_GRANTED) {
                mBluetoothLeScanner.startScan(mScanCallback);
            }
        }

BEARBEITEN: Um dieses Problem zu lösen, habe ich nur das GPS eingeschaltet. Es ist einfach, dies programmgesteuert auf so zu tun.

17
Jacopo Tosi

wenn Berechtigungen erteilt wurden, versuchen Sie es: Schalten Sie das GPS ein.

17
qinmiao

Fordert die App beim Start die Standortberechtigung auf? Wenn dies nicht der Fall ist, behandeln Sie den Code an anderer Stelle, damit er aufgefordert wird.

Sie können dies auch überprüfen, um zu testen, ob Ihre App einwandfrei funktioniert:

Öffnen Sie "Einstellungen"> "Apps"> "Ihre Anwendung"> "Berechtigungen" Aktivieren Sie "Location" und versuchen Sie, nach Ergebnissen zu suchen.

Der Ort wird nur dann unter Berechtigungen aufgeführt, wenn Sie ACCESS_COARSE_LOCATION für das Manifest angegeben haben.

6
Kamal Kishore

Die oben beschriebenen Lösungen funktionieren zwar, der Nebeneffekt besteht jedoch darin, dass Standortdienste aktiviert werden müssen, wenn etwas nicht erforderlich ist. Eine hässliche und unbefriedigende Lösung besteht darin, die Zielversion in Ihrem Manifest anzugeben

Android: targetSdkVersion = "21"

Es ermöglicht das Scannen auf meinem Nexus 7, obwohl die installierte Version 6.0.1 ist. Ich weiß nicht, welche Nebeneffekte eine niedrigere Version als die installierte Version haben soll, aber das Scannen funktioniert zumindest. Könnte die einzige Lösung für GPS-lose Geräte sein (sofern solche Geräte vorhanden sind).

Google sollte dafür gekreuzigt werden.

3
Brian Reinhold

Eine - nicht perfekte Antwort - ist, dass Sie immer noch dieselbe BT-Scanmethode verwenden können, sobald Sie die neue Berechtigung für die Runtime-Position aktiviert haben.

            mBluetoothAdapter.startDiscovery();

.......

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

                if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                mDeviceList.add(device);


            }
        }
    };
0
aiden_fry

Es ist eine alte Frage, aber ich werde antworten, um jemandem zu helfen.
Leider funktioniert die Kombination aus ACCESS_COARSE_LOCATION und targetSdkVersion 22 auf einigen Geräten nicht.
Dies ist keine gute Methode, aber ich habe sie auf folgende Weise gelöst, ohne Laufzeitberechtigungen zu verwenden (ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION)

  1. Setzen Sie Ihre 'targetSdkVersion' auf 19 (ich denke, dass vielleicht api19 ~ api22 möglich ist)
  2. Fügen Sie Ihrer Manifestdatei die folgende Berechtigung hinzu

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

getestet auf Android 4.4 ~ 7.1.1

0
Andromer