2

Ich bin neu in Android App Entwicklung und BLE, und ich lerne diese mit dem Beispielcode BluetoothLeGatt [Die ich aus Android Studio importiert]. Der Code funktioniert auf meinem Tablet (Android 5.0) einwandfrei, aber die Scan-Aktivität gibt keine BLE-Geräte auf Android 6.0 zurück. Die Fehlermeldung, die ich bekam, ist unten gezeigt.Wie kann ich BluetoothleGatt ändern, um die BLE-Geräteüberprüfung unter Android 6.0 zu aktivieren?

07-19 12:41:39.615 7617-7642/? W/Binder: Caught a RuntimeException from the binder stub implementation. 
            java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results 
             at android.os.Parcel.readException(Parcel.java:1599) 
             at android.os.Parcel.readException(Parcel.java:1552) 
             at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:772) 
             at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:331) 
             at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56) 
             at android.os.Binder.execTransact(Binder.java:458) 

ich bei der Post sah Bluetooth Low Energy startScan on Android 6.0 does not find devices und die offizielle Seite Requesting Permissions at Run Time, aber ich weiß noch nicht wirklich, wie mein Code zu ändern.

Ich habe die Berechtigungen von GPS, ACCESS_FINE_LOCATION und ACCESS_COARSE_LOCATION hinzufügen, und ich schaltete den Location Service auf meinem Tablet.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-feature android:name="android.hardware.location.gps" /> 

Aber die App kann immer noch keine BLE-Geräte zurückgeben. Wenn ich versuche, den folgenden Code in meine App einzufügen (von Anfordern von Berechtigungen zur Laufzeit), gibt es immer einen Fehler bei checkSelfPermission [Kann das Symbol 'checkSelfPermission' nicht auflösen]. Aber ich habe importiert import android.support.v4.content.ContextCompat;

Kann mir jemand dabei helfen? Gibt es auch eine einfachere Antwort auf die Frage, wie DeviceScanActivity funktioniert? Ich weiß nicht wirklich, wo man die Blöcke des Codes von Requests Berechtigungen zur Laufzeit zu meinem Code :(Ich weiß, das ist eine wirklich dumme Frage, aber ich bin wirklich neu in diesem Bereich. Bitte helfen Sie mir !.

// Here, thisActivity is the current activity 
if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.READ_CONTACTS) 
    != PackageManager.PERMISSION_GRANTED) { 

// Should we show an explanation? 
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
     Manifest.permission.READ_CONTACTS)) { 

    // Show an explanation to the user *asynchronously* -- don't block 
    // this thread waiting for the user's response! After the user 
    // sees the explanation, try again to request the permission. 

} else { 

    // No explanation needed, we can request the permission. 

    ActivityCompat.requestPermissions(thisActivity, 
      new String[]{Manifest.permission.READ_CONTACTS}, 
      MY_PERMISSIONS_REQUEST_READ_CONTACTS); 

    // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an 
    // app-defined int constant. The callback method gets the 
    // result of the request. 
} 
} 

EDIT Das folgende ist meine Abhängigkeiten blockieren

dependencies { 
compile "com.android.support:support-v4:25.3.1" 
compile "com.android.support:support-v13:25.3.1" 
compile "com.android.support:cardview-v7:25.3.1" 
compile "com.android.support:appcompat-v7:25.3.1" 
} 
+0

Auf welche SDK-Ebene zielt Ihre Anwendung ab (wie in der Datei 'build.gradle' der Anwendung definiert)? – stkent

+0

Auch, was enthält Ihr 'Abhängigkeiten' Block? (Vielleicht bearbeiten Sie diese in Ihre Frage :)) – stkent

+0

Meine Ziel-SDK-Ebene ist 25 in build.gradle Datei. – Natalie

Antwort

1

Vielen Dank an alle für Ihre Antworten und Hilfe! Ich habe gerade meinen Fall gelöst!

Was ich tat, ist die Berechtigungen in AndroidManifest.xml neben Zugabe ich den folgenden Code zu meinem onCreate Methode in DeviceScanActivity und die Referenz-I ist Requesting Permissions at Run Time verwendet hinzugefügt. Außerdem habe ich MY_PERMISSIONS_REQUEST_LOCATION einfach eine Nummer zugewiesen.

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getActionBar().setTitle(R.string.title_devices); 
     mHandler = new Handler(); 
    //Check for permissions 
     int permissionCheck = ContextCompat.checkSelfPermission(this, 
      Manifest.permission.WRITE_CALENDAR); 
     Log.e(TAG, "Permission Status: " +permissionCheck); 

    //*********************************************************** 
    // 
     if (ContextCompat.checkSelfPermission(this, 
      Manifest.permission.ACCESS_COARSE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) 
     { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_COARSE_LOCATION)) 
      { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

      } 
      else 
      { 

      // No explanation needed, we can request the permission. 

      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
      } 
     } 

    ......//The rest of code 
    } 

Als ich zuerst zugegeben den obigen Code, gibt es ein Pop-up-Fenster auf meinem Tablet für Berechtigungen fragt mich kommen, und ich klickte „zulassen.“ Dann kann ich meine ble Geräte scannen.

BTW, fragt es nur einmal um meine Erlaubnis.Als ich später (nach leichten Änderungen an meinem Code) auf "Anwendung ausführen" geklickt habe, habe ich nicht erneut nach meiner Erlaubnis gefragt.

0

Haben Sie diese alle Berechtigungen hinzu:

<uses-permission android:name="android.permission.BLUETOOTH"/> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> 

Es funktioniert auf Android 6.0

+0

Ja, habe ich! Aber meins kann immer noch nicht laufen :( – Natalie

Verwandte Themen