"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:

 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) 

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

Necesita tratar con alguna EXCEPCIÓN

no puede cambiar

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í .

  • Permiso de lectura y escritura para almacenamiento y uso de galería para malvavisco
  • ¿Por qué necesito el permiso WRITE_EXTERNAL_STORAGE con getExternalCacheDir () en Android Lollipop?
  • ¿Cuál es la diferencia entre ACCESS_NETWORK_STATE e INTERNET?
  • Proporcionar texto personalizado para el diálogo de permisos de Android M
  • Android M: Facturación y permisos de GCM
  • Android 6.0 - ¿Cuál es la diferencia entre permisos peligrosos y especiales?
  • ¿Cómo comprobar si el permiso de Android se está utilizando realmente?
  • Solicitud de permiso duplicada después del cambio de orientación
  • Java.lang.SecurityException: bloqueo de permisos de BLUETOOTH. (Sólo dispositivos Samsung)
  • Android M detecta si el cuadro de diálogo de permisos está visible
  • ¿Permisos opcionales para que una aplicación pueda mostrarse en todos los dispositivos y activar funciones opcionales en algunos?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.