2015-10-12 7 views
16

Aufgrund der letzten Änderungen in Android 6 Marshmallow in Bezug auf Berechtigungen funktioniert der folgende Code nicht mehr und löst eine Ausnahme aus."Sie können die privaten Sicherheitseinstellungen nicht ändern" - Wie schaltet man die Klingelton-Vibration in Android 6 um?

Settings.System.putInt(getContentResolver(), "vibrate_when_ringing", 0); 

Dies geschieht auch nach WRITE_SETTINGS Erlaubnis der App Gewährung: 6

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."); 
} 

Wie kann ich die Rufton Vibrationseinstellungen ändern (und ähnliche sichere Einstellungen) in Android?

Voll Stack-Trace:

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) 
+0

Dies ist keine vollständige Antwort, aber hoffentlich wird es helfen - es scheint, dass viele Vibrationseinstellungen wurden verschoben/verändert in M Ein Blick auf http://developer.android.com/reference/android/provider/Settings.Secure.html Ich sehe, dass mindestens 3 Einträge die Beschreibung haben: "Zugriff auf diese Einstellung von einer App, die M zielt oder später löst eine SecurityException aus ". – WoogieNoogie

+0

Ich stecke auf das gleiche Problem. Es gibt keinen Hinweis auf eine Sicherheitsausnahme und dies ist eine sichere Einstellung in der Dokumentation. – user1806772

+0

Gemäß den Dokumenten müssen Sie die Systemeinstellungen anzeigen, indem Sie eine Aktivität mit der Aktion ACTION_MANAGE_WRITE_SETTINGS starten. http://developer.android.com/reference/android/Manifest.permission.html#WRITE_SETTINGS – mehmet6parmak

Antwort

0

Basierend auf this ticket scheint das Problem auf 9. Dezember gelöst werden. Das Problem wird in der zukünftigen Version behoben.

Problem wurde von Stack Overflow Mitglied geöffnet und here diskutiert.

4

Da die Sicherheit

wie wir wissen, in Android 6.0 (Eibisch), Android viele Strategien hinzufügen zur Steuerung der SECURITY, fördern Effizienz wie:

  • Runtime Erlaubnis
  • Doze-Modus (Energie-Manager)
  • umschreiben SettingsProviders see details
    • bewegen Systemeinstellungen von db zu xml
    • /data/data/com.android.providers.settings/../settings.db ->/data/System/Benutzer/Benutzer-ID/settings_ [System | global | sicheren] .xml

Jetzt also (nach API 22)

  • Sie können NICHT schreiben Sie einige private/gefährliche Einstellungen
  • Sie MUST befassen sich mit einigen AUSNAHME während der Portierung API-Ebene 22 oder höher. see details

PS

need deal with some EXCEPTION

can not change

+0

Danke, aber diese Antwort ist falsch (oder eher off-topic). Ich weiß, dass VIBRATE_WHEN_RINGING eine private sichere Einstellung ist, aber meine Frage bleibt offen. – EyesClear

+0

Ich suchte nach wo war settings.db gegangen. Diese Information war wirklich schwer zu finden. Vielen Dank! –