"No se puede cambiar la configuración privada de seguridad" – ¿cómo cambiar la vibración del tono de llamada en Android 6?
Debido a los cambios recientes en Android 6 Marshmallow con respecto a los permisos, el código siguiente ya no funciona y produce una excepción.
Settings.System.putInt(getContentResolver(), "vibrate_when_ringing", 0);
Esto sucede incluso después de otorgar permiso WRITE_SETTINGS
a la aplicación:
- ¿Pueden solicitar permisos sincrónicamente en el modelo de permisos de ejecución de Android Marshmallow (API 23)?
- RequestPermission () no recrea completamente la pila de actividad
- ACCESS_FINE_LOCATION permiso
- Permisos de cámara en Appcelerator
- BroadcastReceiver permiso para el shell de adb
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); Uri uri = Uri.fromParts("package", getActivity().getPackageName(), null); intent.setData(uri); startActivityForResult(intent, WRITE_SETTINGS_PERMISSION_REQUEST_CODE); //at this point Settings activity is opened and user is prompted for permission ... if (Settings.System.canWrite(this)) { //now returns true, because permissions were granted Settings.System.putInt(getContentResolver(), "vibrate_when_ringing", 0); //still crashes } else { Log.w(LOG_TAG, "No permission to write settings."); }
¿Cómo puedo cambiar la configuración de la vibración del timbre (y la configuración segura similar) en Android 6?
Rastreo completo de la pila:
10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: Writing exception to parcel 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: java.lang.IllegalArgumentException: You cannot change private secure settings. 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at com.android.providers.settings.SettingsProvider.warnOrThrowForUndesiredSecureSettingsMutationForTargetSdk(SettingsProvider.java:1173) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at com.android.providers.settings.SettingsProvider.enforceRestrictedSystemSettingsMutationForCallingPackage(SettingsProvider.java:1030) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at com.android.providers.settings.SettingsProvider.mutateSystemSetting(SettingsProvider.java:906) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at com.android.providers.settings.SettingsProvider.insertSystemSetting(SettingsProvider.java:874) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:257) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at android.content.ContentProvider$Transport.call(ContentProvider.java:398) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:283) 10-12 02:26:37.728 1927-2765/? E/DatabaseUtils: at android.os.Binder.execTransact(Binder.java:453) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: FATAL EXCEPTION: IntentService[DetectedActivityIntentService] 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: Process: <package_name>, PID: 10084 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: java.lang.IllegalArgumentException: You cannot change private secure settings. 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.content.ContentProviderProxy.call(ContentProviderNative.java:646) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.provider.Settings$NameValueCache.putStringForUser(Settings.java:1322) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.provider.Settings$System.putStringForUser(Settings.java:1671) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.provider.Settings$System.putIntForUser(Settings.java:1776) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.provider.Settings$System.putInt(Settings.java:1770) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at <package_name>.DetectedActivityIntentService.activate(DetectedActivityIntentService.java:116) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at <package_name>.DetectedActivityIntentService.onHandleIntent(DetectedActivityIntentService.java:94) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.os.Looper.loop(Looper.java:148) 10-12 02:26:37.729 10084-11411/<package_name> E/AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61)
- ¿Necesita V2 Maps Library el permiso ACCESS_NETWORK_STATE?
- ¿Por qué play-services-location necesita los permisos android.permission.WRITE_EXTERNAL_STORAGE y android.permission.READ_EXTERNAL_STORAGE?
- ¿Cómo puede la aplicación de configuración iniciar la actividad no exportada de una aplicación?
- Error de instalación de Google Play -505
- ¿Cómo elimino mi propio calendario personalizado corrompido mediante programación?
- ¿Cuál es el caso de uso de ContextCompat.checkSelfPermission?
- BroadcastReceiver SMS_Received no funciona en nuevos dispositivos
- ¿Por qué el proveedor de contenido sin permisos y exportado = true es accesible para cualquier aplicación?
Porque la seguridad
Como sabemos, en Android 6.0 (Marshmallow), Android agrega muchas estrategias para controlar la SEGURIDAD , promover la eficiencia como:
- Permiso de tiempo de ejecución
- Modo Doze (Power Manager)
- Volver a escribir SettingsProviders ver detalles
- Mover la configuración del sistema de db a xml
- /data/data/com.android.providers.settings/../settings.db -> /data/system/users/userid/settings_[system|global|secure].xml
Así que ahora (después de la API 22)
- Usted NO puede escribir algunos ajustes privados / peligrosos
- Usted DEBE tratar con alguna EXCEPCIÓN durante la transferencia a API nivel 22 o posterior. Ver detalles
PD
Basado en este billete el problema parece ser resuelto el 9 de diciembre. El problema se solucionará en la futura compilación.
La edición fue abierta por el miembro del desbordamiento de la pila y discutido aquí .