Android Marshmallow 6.0.1 Análisis Bluetooth Devuelto Sin Resultados

Bluetooth en 6.01 parece no estar funcionando como se esperaba con el siguiente código y permisos según la actualización + appCompat para Kitkat 4.4.4.

No se devuelven los resultados y tengo varios dispositivos detectables en las inmediaciones.

Cualquier persona tiene alguna idea por qué? Estoy funcionando en un Nexus 5.

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> package bluetoothscanneractivity; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; public class BluetoothScannerActivity extends Activity { //private final BroadcastReceiver FoundReceiver = null; protected ArrayList<BluetoothDevice> foundDevices = new ArrayList<BluetoothDevice>(); private ListView foundDevicesListView; private ArrayAdapter<BluetoothDevice> btArrayAdapter; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bluetooth_scanner); final BluetoothAdapter myBlueToothAdapter = BluetoothAdapter.getDefaultAdapter(); final Button scanb = (Button) findViewById(R.id.button); final ListView foundDevicesListView = (ListView) findViewById(R.id.listView1); btArrayAdapter = new ArrayAdapter<BluetoothDevice>(this, android.R.layout.simple_list_item_1, foundDevices); foundDevicesListView.setAdapter(btArrayAdapter); //Turn on Bluetooth if (myBlueToothAdapter == null) Toast.makeText(BluetoothScannerActivity.this, "Your device doesnot support Bluetooth", Toast.LENGTH_LONG).show(); else if (!myBlueToothAdapter.isEnabled()) { Intent BtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(BtIntent, 0); Toast.makeText(BluetoothScannerActivity.this, "Turning on Bluetooth", Toast.LENGTH_LONG).show(); } //scan scanb.setOnClickListener(new OnClickListener() { public void onClick(View v) { btArrayAdapter.clear(); myBlueToothAdapter.startDiscovery(); Toast.makeText(BluetoothScannerActivity.this, "Scanning Devices", Toast.LENGTH_LONG).show(); } }); registerReceiver(FoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); IntentFilter filter = new IntentFilter( BluetoothAdapter.ACTION_DISCOVERY_FINISHED); this.registerReceiver(FoundReceiver, filter); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(FoundReceiver); } private final BroadcastReceiver FoundReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a new device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (!foundDevices.contains(device)) { foundDevices.add(device); btArrayAdapter.notifyDataSetChanged(); } } // When discovery cycle finished if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { if (foundDevices == null || foundDevices.isEmpty()) { Toast.makeText(BluetoothScannerActivity.this, "No Devices", Toast.LENGTH_LONG).show(); } } } }; } 

Usted sabe que desde Marshmallow , necesita estos permisos para su tarea –

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

También desde Marshmallow , tiene que pedir mediante programación permisos aunque los haya declarado en su archivo Manifest.

Así que tienes que pedir permisos de ubicación antes de startDiscovery()

  ActivityCompat.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number 

Y después de que el usuario acepte estos permisos, puede startDiscovery() . Y si niega, no puede descubrir los dispositivos. Puede comprobar la acción del usuario en

onRequestPermissionsResult() devolución de llamada.

Con los permisos agregados, cambiando a la versión mínima de SDk a 23 – trabaja con lo siguiente:

 package bluetoothscanneractivity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import android.Manifest; import java.util.ArrayList; public class BluetoothScannerActivity extends AppCompatActivity { //private final BroadcastReceiver FoundReceiver = null; protected ArrayList<BluetoothDevice> foundDevices = new ArrayList<BluetoothDevice>(); private ListView foundDevicesListView; private ArrayAdapter<BluetoothDevice> btArrayAdapter; /** * Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bluetooth_scanner); final BluetoothAdapter myBlueToothAdapter = BluetoothAdapter.getDefaultAdapter(); final Button scanb = (Button) findViewById(R.id.button); final ListView foundDevicesListView = (ListView) findViewById(R.id.listView1); btArrayAdapter = new ArrayAdapter<BluetoothDevice>(this, android.R.layout.simple_list_item_1, foundDevices); foundDevicesListView.setAdapter(btArrayAdapter); //Turn on Bluetooth if (myBlueToothAdapter == null) Toast.makeText(BluetoothScannerActivity.this, "Your device doesnt support Bluetooth", Toast.LENGTH_LONG).show(); else if (!myBlueToothAdapter.isEnabled()) { Intent BtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(BtIntent, 0); Toast.makeText(BluetoothScannerActivity.this, "Turning on Bluetooth", Toast.LENGTH_LONG).show(); } // Quick permission check int permissionCheck = this.checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION"); permissionCheck += this.checkSelfPermission("Manifest.permission.ACCESS_COARSE_LOCATION"); if (permissionCheck != 0) { this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number } scanb.setOnClickListener(new OnClickListener() { public void onClick(View v) { btArrayAdapter.clear(); myBlueToothAdapter.startDiscovery(); Toast.makeText(BluetoothScannerActivity.this, "Scanning Devices", Toast.LENGTH_LONG).show(); } }); registerReceiver(FoundReceiver, new IntentFilter(BluetoothDevice.ACTION_FOUND)); IntentFilter filter = new IntentFilter( BluetoothAdapter.ACTION_DISCOVERY_FINISHED); this.registerReceiver(FoundReceiver, filter); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unregisterReceiver(FoundReceiver); } private final BroadcastReceiver FoundReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // When discovery finds a new device if (BluetoothDevice.ACTION_FOUND.equals(action)) { // Get the BluetoothDevice object from the Intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (!foundDevices.contains(device)) { foundDevices.add(device); Toast.makeText(BluetoothScannerActivity.this, "name: " + device.getName() + " " + device.getAddress(), Toast.LENGTH_LONG).show(); btArrayAdapter.notifyDataSetChanged(); } } // When discovery cycle finished if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) { if (foundDevices == null || foundDevices.isEmpty()) { Toast.makeText(BluetoothScannerActivity.this, "No Devices", Toast.LENGTH_LONG).show(); } } } }; } 

El método siguiente sólo se ejecutará si la versión del SDK es> LOLLIPOP. Cuando traté de usarlo sin esta restricción mi aplicación se estrelló. Simplemente llame a este método justo antes de usar .startDiscovery ();

 public void checkBTPermissions(){ if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){ int permissionCheck = this.checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION"); permissionCheck += this.checkSelfPermission("Manifest.permission.ACCESS_COARSE_LOCATION"); if (permissionCheck != 0) { this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number } }else{ Log.d(TAG, "checkBTPermissions: No need to check permissions. SDK version < LOLLIPOP."); } } 
  • Android: problemas para actualizar a Android SDK Tools, revisión 7
  • Equivalente de LocalBroadcastManager sin la biblioteca de soporte de Android
  • Se bloquea el SDK de Youtube al cargar vídeos en directo
  • Scrollview con paginación en android
  • Las preferencias de recopilación fallaron, la clase java / lang / AutoCloseable no se encuentra en C: \ Archivos de programa (x86) \ Android \ android-sdk \ plataformas \ android-19 \ android.jar
  • Unity Android Error de compilación WIN32 Excepción ZipAlign
  • Este SDK de Android requiere ADT versión 23.0.0 o superior. La versión actual es 22.6. ¿Desea actualizar ADT a la última versión?
  • Cómo determinar la versión de androide SDK instalado en la computadora?
  • ¿Cómo codificar una nueva función compatible con versiones anteriores en Android SDK?
  • Applink no se puede resolver en el SDK de Facebook
  • No es posible que el SDKcontroller de Android funcione
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.