¿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?
- ¿Cómo mostrar la página siguiente de los resultados de búsqueda personalizados de Google?
- GoogleApiClient no está conectado aún.
- ¿Transferir un archivo entre dispositivos Android?
- Múltiples archivos dex - La conversión a formato Dalvik falló - No se puede ejecutar dex
- BaseGame Util no se puede resolver con un tipo
Además, supongo que no hay "noticias" en el " modo siempre detectable "?
- Leer archivo de texto remoto en android
- Configuración de la orientación de la pantalla Actividad de Android con values.xml
- Ejecución de scripts de Groovy incrustados en Java en tiempo de ejecución para Android
- Android: Adición de texto de sub-artículo de ListView
- ¿Qué se debe devolver, verdadero o falso para onOptionsItemSelected ()?
- Cambiar entre un TextView y EditText
- Android: openConnection () throws IOExeption (No se puede encontrar el controlador predeterminado para el protocolo: http)
- AssembleDebug error en Android Studio
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.