2016-07-04 13 views
6

UPDATEAndroid 6.0 - Bluetooth - kein Code existiert für Action_Found Absicht übertragen

ich viele Codes versucht, auch aus den Beispielen im Internet gezeigt. Jeder von ihnen folgt meinem Ansatz. Nach vielen Teststunden kam ich zu dem Schluss, dass es unter Android 6.0 keine Möglichkeit gibt, Bluetooth-Discovery von unbekannten Geräten zu erreichen, wir können nur die verbundenen Geräte abrufen. Ich bin mir ziemlich sicher, dass es etwas mit dieser Android-Version gibt.

Wenn jemand weiß, wie das zu beheben ist, würde ich jede Hilfe sehr schätzen.


Original-Beitrag

Mein Code funktioniert gut, aber keine Geräte gefunden zu werden. Ich bekomme nur DISCOVERY_STARTED und DISCOVERY_FINISHED, also werden keine Geräte gefunden, aber mit der System-App werden diese Geräte gefunden.

Dies ist der Code meiner Anwendung, hoffe, es kann helfen.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    bluetoothAdapter= BluetoothAdapter.getDefaultAdapter(); 

//other stuff... 

    IntentFilter filter=new IntentFilter(); 
    filter.addAction(BluetoothDevice.ACTION_FOUND); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED); 
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); 

    registerReceiver(myreceiver,filter); 
} 

final BroadcastReceiver myreceiver = new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 

     Log.i("test","RECEIVED: "+ action); 
     if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) { 
     } 
     else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { 
     } 

     if(BluetoothDevice.ACTION_FOUND.equals(action)) 
     { 
      BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 
      Log.i("test", device.getName() + "\n" + device.getAddress()); 
     } 
    }}; 

public void scanDevices(View v){ 

     if (bluetoothAdapter.isEnabled()){ 

      bluetoothAdapter.startDiscovery(); 
     } 
} 

ich bereits habe Berechtigungen:

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
+0

Mögliche Duplikate dieser Frage [hier] (http://stackoverflow.com/questions/32656510/register-broadcast-receiver-dynamical-does-not-work-bluetoothdevice-action-f) –

+0

@EdwardAlexander ich don ' Ich denke, ich lese diese Frage und meine onReceive-Methode wird korrekt aufgerufen. Das Problem ist, dass ich keine ACTION_FOUND Absichten bekomme, nur DISCOVERY_STARTED und DISCOVERY_FINISHED. Es werden keine Geräte gefunden, aber mithilfe der Systemanwendung kann ich die Liste der verfügbaren Geräte abrufen. Warum? –

+1

Sie sollten klar angegeben haben, dass Sie Marshmallow verwenden, das ist eine ganz andere Geschichte, hier überprüfen Sie dies: [Bluetooth Discovery Marshmallow] (http://stackoverflow.com/questions/33052811/since-marshmallow-update-bluetooth-discovery -using-bluetoothadapter-getdefaultad) –

Antwort

10

Sehr einfache Lösung:

1. Add FINE_LOCATION Erlaubnis zu manifestieren:

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

2. Antrag FINE_LOCATION Erlaubnis bei r untime:

//since i was working with appcompat, i used ActivityCompat method, but this method can be called easily from Activity subclassess. 
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSION_REQUEST_CONSTANT); 

3. Implementieren onRequestPermissionsResult Methode:

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 

switch (requestCode) { 
    case MY_PERMISSION_REQUEST_CONSTANT: { 
     // If request is cancelled, the result arrays are empty. 
     if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      //permission granted! 
     } 
     return; 
    } 
} 
} 

All dies, weil Marshmallows diese Berechtigung, um für die Entdeckung Bluetooth zu verwenden erfordert.

Da diese Berechtigung zu der Dangerous Gruppe von Berechtigungen gehört, genügt es nicht, das Manifest zu deklarieren. Wir benötigen die ausdrückliche Zustimmung des Benutzers, die Position zu verwenden (auch wenn wir die Position nicht benötigen). .

+0

Sehr nützlich, danke! – Alison