¿Cómo establecer programaticamente tiempo detectable sin confirmación de usuario?

Usualmente uso esto

private void ensureDiscoverable() { if(D) Log.d(TAG, "ensure discoverable"); if (mBluetoothAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); } } 

Pero eso solicita una confirmación del usuario. ¿Hay una manera de evitarlo mediante programación?

Además, supongo que no hay "noticias" en el " modo siempre detectable "?

Después de algunas investigaciones he llegado a la conclusión de que establecer el tiempo de espera de detección sin la interacción del usuario, sólo es posible con el acceso de root (como ya se sugirió en la respuesta anterior). Sin embargo, para alguien que necesite que aquí está la solución necesaria:

 private void ensureBluetoothDiscoverability() { try { IBluetooth mBtService = getIBluetooth(); Log.d("TESTE", "Ensuring bluetoot is discoverable"); if(mBtService.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) { Log.e("TESTE", "Device was not in discoverable mode"); try { mBtService.setDiscoverableTimeout(100); // mBtService.setScanMode(BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, 1000); } catch(Exception e) { Log.e("TESTE", "Error setting bt discoverable",e); } Log.i("TESTE", "Device must be discoverable"); } else { Log.e("TESTE", "Device already discoverable"); } } catch(Exception e) { Log.e("TESTE", "Error ensuring BT discoverability", e); } } 

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

Y luego crear un nuevo paquete android.bluetooth, colocar dos archivos dentro de IBluetooth.aidl y IBluetoothCallback.aidl y poner dentro del código, como se muestra aquí .

Esto permitirá acceder a funciones que no están disponibles en la API estándar, pero para algunas de ellas necesitarás permiso para "escribir configuraciones seguras" (la línea de comentario anterior es donde obtendrás esa excepción por falta de permisos del proceso / usuario).

Eso es lo que hice y funciona bien para mí:

Método:

 public void makeDiscoverable (int timeOut){ Class <?> baClass = BluetoothAdapter.class; Method [] methods = baClass.getDeclaredMethods(); Method mSetScanMode = methods[44]; try { mSetScanMode.invoke(Util.mBluetoothAdapter, BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE, timeOut); } catch (Exception e) { Log.e("discoverable", e.getMessage()); } } 

Añadir permiso:

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

Nada – Todavía necesita confirmación del usuario.

Ser siempre detectable es un desagüe en la batería – por lo que no hay una solución fácil También es un problema de privacidad. Es mejor preguntar al usuario.

  • ¿Cómo puedo localizar por qué mi actividad se termina?
  • ¿Cómo obtengo una variable de un bloque try / catch?
  • Sincronizar el PoolingClientConnectionManager o no
  • Obtener la última fecha modificada de archivos en un directorio
  • Agregar nueva columna en el proveedor de contenido de contactos predeterminado de android
  • Cómo purgar errores falsos en eclipse?
  • ¿Cómo adjuntar el archivo XML en el cuerpo del mensaje de solicitud de correos HTTP?
  • ¿Pasa el método de devolución de llamada con una clase de actividad que no es de clase de android?
  • ¿Cómo garantizar que la imagen seleccionada por el usuario no cambia después de reiniciar Android?
  • Cómo determinar la unidad de píxeles (px, dp, etc) de una vista en Java?
  • ¿Cómo cerrar otra aplicación en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.