天道酬勤,学无止境

Android Marshmallow (6.0) 上的 vibrate_when_ringing(vibrate_when_ringing on Android Marshmallow (6.0))

问题

在我的代码中,我有:

Settings.System.putInt(this.getContentResolver(), "vibrate_when_ringing", isVibrateWhenRinging ? 1 :0);

使用以下权限:

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

从 Jelly Bean (API 16) 到 Lollipop (API 22),这一切都很好。

在 Android M 中,我知道要使用该权限,我需要提示用户 Settings.ACTION_MANAGE_WRITE_SETTINGS。

但是,即使打开了该权限,我也会看到以下错误:

E/AndroidRuntime: java.lang.IllegalArgumentException: You cannot change private secure settings.
E/AndroidRuntime:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:165)
E/AndroidRuntime:     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
E/AndroidRuntime:     at android.content.ContentProviderProxy.call(ContentProviderNative.java:646)

嗯……我错过了什么吗? 有了适当的权限,我们可以更改铃声、请勿打扰模式等。但看起来在 Android M 中我们将无法更改诸如“响铃时振动”这样的正常设置。 我希望我是错的。

回答1

您应该调用 Settings.System.canWrite() 以查看您是否可以编写此设置。

如果函数返回 false,则用户可以同意允许您的应用写入设置:

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
startActivity(intent);
回答2

我要回答我自己的问题。 有一个问题向 Google 开放:https://code.google.com/p/android/issues/detail?id=194376。

基本上,他们部分修复了vibrate_when_ringing并在 Android N (24) 上再次运行。 不幸的是,它不适用于 Android M (23)。 对于这个问题的回应,似乎不会被修复。

您可以在此处查看完整的示例存储库:https://github.com/ferrannp/VibrateWhenRinging

因此,基本上,您的代码需要检查您是否在 Android M 上,如果是,请不要使用该设置。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 安卓; 检测设备中的振动设置是打开还是关闭,特别是在它响起但不振动的情况下(Android; detect if the Vibrate setting in the device is on or off, esp for the case when it rings but does not vibrate)
    问题 应用要求:检测手机何时处于振铃模式且振动设置关闭,因此问题归结为:检测振动设置是关闭还是开启 相关信息: 首先,Vibrator 没有像isVibratorModeOn()这样的方法,并且与 Vibrate 和 EXTRA_VIBRATE_... 相关的标志都被标记为已弃用: 此常量在 API 级别 16 中已弃用。应用程序应根据可通过 getRingerMode() 查询的当前铃声模式维护自己的振动策略。 但是在 getRingerMode() 下,我们无法通过 RINGER_MODE_NORMAL 确切知道振动设置是否关闭; 如果振动设置打开,它会振动。 现在 getVibrateSetting() 也被弃用了。 用于在*大多数设备和操作系统版本(包括 Nexus 6 上的 Android M)上检测RINGER_MODE代码: if(audioManager.getRingerMode()!=AudioManager.RINGER_MODE_SILENT){ if (audioManager.getStreamVolume(AudioManager.STREAM_RING) != 0) { *例外:Nexus 5 - 5.1.1,可能适用于所有 Lollipop 版本 如果错过了这一点,或者我因为遗漏了一些明显的东西而犯了大(gest)愚蠢的错误,我会感到非常惊讶。
  • FileObserver 不适用于 Android 6.0 Marshmallow (API 23) 中的外部存储(FileObserver does not work on external storage in Android 6.0 Marshmallow (API 23))
    问题 我有一个应用程序,它使用FileObserver观察外部存储上的公共目录。 它在Lollipop设备上运行良好。 我想添加对Marshmallow支持,所以我用它设置了 Nexus 9 平板电脑。 在 Marshmallow 设备上,它失败了,在 Lollipop 设备上它没问题。 在 Marshmallow 设备上, FileObserver不会对由其他进程引起的文件系统事件做出反应。 例如截取屏幕截图,通过adb shell 创建文件。 如果文件是由我的应用程序创建的,它工作正常。 在Marshmallow ,我从Manifest.xml请求WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限。 当我使用 API 23 进行编译时,我还确保我调用了ActivityCompat.requestPermissions() 。 当我使用 API 22 进行编译时,我只依赖Manifest.xml 。 如果我观察/data/data/my-package-name上的内容,它会起作用。 如果我观察/storage/emulated/0/Pictures/Screenshots上的内容,它就会失败。 有没有人测试FileObserver考虑以下所有内容? : Marshmallow装置 API 23 和 API 22?
  • 如何在android中检查手机是否静音,振动或响亮(How to check if phone is mute, vibrate or loud in android)
    问题 这是我将电话静音/取消静音的代码。 但我想检查手机是否已经静音,如果不是,我会将其静音。 如果处于振动状态,那么我将使其正常。 我可以以某种方式检查这个状态吗? public void changeRingerMode(Context context){ AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); /** * To Enable silent mode..... */ audio.setRingerMode(AudioManager.RINGER_MODE_SILENT); /** * To Enable Ringer mode..... */ audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL); } 回答1 试试这个: switch( audio.getRingerMode() ){ case AudioManager.RINGER_MODE_NORMAL: break; case AudioManager.RINGER_MODE_SILENT: break; case AudioManager.RINGER_MODE_VIBRATE: break; } 回答2 在我的情况下
  • Prevent screen sleeping
    Android v4.2.2. I'm trying to stop the screen from going to sleep. I've tried a few things like changing the relevant settings in the db: adb shell "sqlite3 /data/data/com.android.providers.settings/databases/settings.db \"update system set value='-1' where name='screen_off_timeout'\";" But that didn't work - screen just went to sleep almost immediately. If I go to the settings app there isn't an option to disable it. Instead, it ranges from 15s to 30m. I have also tried to set the KEEP_SCREEN_ON FLAG in the application but that stops working when I switch to a new activity. Is there anything
  • 防止屏幕休眠(Prevent screen sleeping)
    问题 安卓 v4.2.2。 我试图阻止屏幕进入睡眠状态。 我尝试了一些事情,例如更改数据库中的相关设置: adb shell "sqlite3 /data/data/com.android.providers.settings/databases/settings.db \"update system set value='-1' where name='screen_off_timeout'\";" 但这不起作用 - 屏幕几乎立即进入睡眠状态。 如果我转到设置应用程序,则没有禁用它的选项。 相反,它的范围从 15s 到 30m。 我还尝试在应用程序中设置KEEP_SCREEN_ON标志,但是当我切换到新活动时它停止工作。 还有什么我可以尝试的。 我希望数据库设置可以完成这项工作。 这是我的系统数据库。 也许我缺少一个可以插入的设置? 1|volume_music|11 2|volume_ring|5 3|volume_system|7 4|volume_voice|4 5|volume_alarm|6 6|volume_notification|5 7|volume_bluetooth_sco|7 8|mode_ringer_streams_affected|174 9|mute_streams_affected|46 10|vibrate_when_ringing|0 11
  • Android 6.0 Marshmallow BLE:连接参数(Android 6.0 Marshmallow BLE : Connection Parameters)
    问题 蓝牙低功耗连接参数管理似乎在 Android 6 中发生了变化。 我有一个 BLE 外围设备,它需要使用一些特定的连接参数(特别是连接间隔),我想使用 BLE 规范允许的最小连接间隔(即 7.5ms)。 Android SDK 不允许从 BLE GAP Central(智能手机)端选择它,因此正确的做法是让我的 GAP 外围设备在 GAP 连接建立后发送L2CAP Connection Parameter Update Request 。 我请求的参数是: 连接间隔最小:7,5ms 连接间隔最大:7,5ms 从延迟:0 监督超时:2000ms 这在我测试过的所有 Android 设备上都按预期工作,从 4.3 到 5.x:在发送L2CAP Connection Parameter Update Request ,我的设备收到一个带有 0x0000(接受)的L2CAP Connection Parameter Update Response ,然后是一个LE Connection Update Complete event ,我可以看到请求的连接参数已被很好地考虑在内。 现在,使用 Nexus 9 平板电脑或 2 台不同的 Nexus 5 设备,所有设备都运行 Android 6.0.1,我可以看到L2CAP Connection Parameter Update
  • Android 6.0 Marshmallow 停止显示垂直 SeekBar 拇指(Android 6.0 Marshmallow stops showing Vertical SeekBar thumb)
    问题 我一直在 SeekBar 周围使用这个基本包装器,但发现它隐藏了拇指,或者做了一些时髦的事情,比如在棉花糖下的白色背景上使它变成白色。 我使用 AS“BlankActivity”向导创建了一个项目来说明这一点,除了这里描述的内容之外,从默认值没有改变任何内容。 左边是 Lollipop,右边 Marshmallow 下运行着同样的代码: 有一个自定义的水平 SeekBar 来测试自定义它们是否存在一般问题,而没有。 左侧的第一个垂直样式没有样式,在棉花糖之前很好,但不是其他样式,中间的样式显式地使用 Widget.Material.Light.SeekBar 样式来测试是否以某种方式未选择默认值,并且最后一个提供了一个重要线索,因为它使用了旧的 Widget.Holo.SeekBar 样式,尽管它看起来像是几年前出现的。 这是这个的布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=
  • FileObserver does not work on external storage in Android 6.0 Marshmallow (API 23)
    I have an app that observes a public directory on external storage with FileObserver. It works fine on Lollipop devices. I want to add support for Marshmallow, so I set up a Nexus 9 tablet with it. On the Marshmallow device, it fails, on Lollipop device it's OK. On Marshmallow device, the FileObserver does not react to file system events that are caused by other processes. E.g. taking a screenshot, creating files via adb shell. It works fine if the files are created by my app. On Marshmallow, I ask for WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE permissions from Manifest.xml. When I
  • 如何在运行时在 Android Marshmallow 中获取 CLEAR_APP_CACHE 权限?(How to take CLEAR_APP_CACHE permission in Android Marshmallow at runtime?)
    问题 代码: void clearCache() { if (mClearCacheObserver == null) { mClearCacheObserver = new CachePackageDataObserver(); } PackageManager mPM = getPackageManager(); @SuppressWarnings("rawtypes") final Class[] classes = {Long.TYPE, IPackageDataObserver.class}; Long localLong = Long.valueOf(CACHE_APP); try { Method localMethod = mPM.getClass().getMethod("freeStorageAndNotify", classes); localMethod.setAccessible(true); // Start of inner try-catch block try { localMethod.invoke(mPM, localLong, mClearCacheObserver); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e
  • Android 6.0 (Marshmallow): How to play midi notes?
    I'm creating an app that generates live instrument sounds and I'm planning on using the new Midi API featured in Android Marshmallow (version 6.0). I've read the package overview document here http://developer.android.com/reference/android/media/midi/package-summary.html and I know how to generate Midi notes but i'm still unsure: how do I actually play these notes after I've generated their Midi data? Do I need a synthesizer program to play Midi notes? If so, do I have to make my own or is one provided by Android or a 3rd party? I am a novice with Midi so please be as descriptive as possible
  • When to request permission at runtime for Android Marshmallow 6.0?
    I am testing my app on Marshmallow 6.0 and it's getting force closed for the android.permission.READ_EXTERNAL_STORAGE, even if it is defined in the Manifest already. Somewhere I have read that if I request permission at runtime then it would not force close your application. I have read this android document also, which is for requesting runtime permission. So, I came to know that we can request a permission like below which is mentioned in the android document. // Here, thisActivity is the current activity if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS)
  • Android 6.0 Marshmallow (API 23) 中弃用了 AndroidHttpClient 和 HttpGet API(AndroidHttpClient and HttpGet API deprecated in Android 6.0 Marshmallow (API 23))
    问题 今天我更新了android SDK API 23。 一旦我将我的项目更改为面向 Android SDK API 23,我就开始收到有关Eclipse 中Apache 客户端和AndroidHttpClient API 的错误。 Apache 库 API 不再能在 API 23 中找到,但仍然可以在 API 22 及更低版本中正常工作。 有人可以提出这些错误背后的问题吗? 项目中的另一个错误 谢谢。 回答1 整个 Apache API 已从 SDK 23 中删除,因为它已从 SDK 22 中弃用。 你可以在这里看到它:http://developer.android.com/sdk/api_diff/23/changes.html 您可以使用 Retrofit 或 Volley 重新实现您的网络请求。 回答2 要继续使用 Apache HTTP API,您必须首先在 build.gradle 文件中声明以下编译时依赖项: android { useLibrary 'org.apache.http.legacy' } 官方参考:https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client
  • PhoneGap 中 Android Marshmallow 的应用权限(App permissions on Android Marshmallow in PhoneGap)
    问题 在 Android Marshmallow 中,我们需要在应用程序中分别授予对位置、文件等的访问权限。 PhoneGap 应用程序中是否有任何 wan 可以检查权限是否可用并提示用户提供权限。 回答1 更新 16/02/2016 Phonegap Build 现在支持 API 23 - 万岁! 或者,如果您在本地构建,只需使用 Cordova/Phonegap CLI 6+,默认情况下您将获得 cordova-android@5+ 平台。 原答案 目前,这当然可以使用 Cordova/Phonegap CLI,但 Phonegap Build 尚不支持 API 23 (Android 6.0 / Marshmallow)。 首先,您需要使用Android平台的v5.0.0(或更高版本),该平台使用API​​ 23。 截至今天,默认版本为 4.1.1(使用 API 22),因此您需要在添加平台时明确指定版本: cordova platform add android@5.0.0 phonegap platform add android@5.0.0 核心插件本身正在升级,以支持请求适当的 Android 6 运行时权限。 因此,您需要直接从 GitHub 存储库的主分支安装“出血边缘”版本,而不是通过 npm 插件注册表。 例如,使用: cordova plugin add
  • Android 6.0 Marshmallow. Cannot write to SD Card
    I have an app that uses external storage to store photographs. As required, in its manifest, the following permissions are requested <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> and it uses the following to retrieve the required directory File sdDir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd", Locale.US); String date = dateFormat.format(new Date()); storageDir = new File(sdDir, getResources().getString( R
  • 尝试检索前台应用程序时出现 Android 6.0 Marshmallow UsageStatsManager 问题(Android 6.0 Marshmallow UsageStatsManager issue when trying to retrieve foreground app)
    问题 每当我尝试查询 UsageStatsManager 的 Usage Stats 时,我都可以正确获取上次运行的应用程序。 但是,如果我拉下状态栏并且有新通知,则上次使用的应用程序(基于 UsageStats)将更改为通知的应用程序。 结果,我收到前台应用程序已更改的错误警报。 我似乎找不到过滤这些特定抽奖的方法。 有任何想法吗? 现在,我使用以下代码查询前台应用程序。 该问题仅存在于 Marshmallow 中(5.X 工作正常)。 UsageStatsManager mUsageStatsManager = (UsageStatsManager) rotationManager.getSystemService("usagestats"); long time = System.currentTimeMillis(); // We get usage stats for the last 10 seconds List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 2, time); // Sort the stats by the last time used if (stats != null) {
  • Can't answer incoming call in android marshmallow 6.0
    I'm creating a calling app. Here's Auto answer which works on android 4.0 and 5.0; whereas when i have an incoming call answer call button works but it doesn't work on android 6.0. I tested answer of this post but it doesn't work too : Answer Incoming Call in Android 6.0 IncomingActivity: @Override public void onClick(View v) { switch (v.getId()) { case R.id.imgaccept: { if (Build.VERSION.SDK_INT >= 21) { new Thread(new Runnable() { @Override public void run() { try { Runtime.getRuntime().exec( "input keyevent " + KeyEvent.KEYCODE_HEADSETHOOK ); Intent intent = new Intent(getApplicationContext
  • 无法在 android marshmallow 6.0 中接听来电(Can't answer incoming call in android marshmallow 6.0)
    问题 我正在创建一个呼叫应用程序。 这是适用于 android 4.0 和 5.0 的自动回答; 而当我有来电时,接听电话按钮有效,但在 android 6.0.0 上不起作用。 我测试了这篇文章的答案,但它也不起作用:在 Android 6.0 中接听来电 传入活动: @Override public void onClick(View v) { switch (v.getId()) { case R.id.imgaccept: { if (Build.VERSION.SDK_INT >= 21) { new Thread(new Runnable() { @Override public void run() { try { Runtime.getRuntime().exec( "input keyevent " + KeyEvent.KEYCODE_HEADSETHOOK ); Intent intent = new Intent(getApplicationContext(), OutGoing.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); intent
  • 访问getExternalStorageDirectory(Accessing getExternalStorageDirectory)
    问题 我使用一些非常简单的android代码,尝试根据以下逻辑访问文件夹: public void try_to_navigate_local_dir(){ Environment e = new Environment(); ArrayList<String> filesList = new ArrayList<String>(); String sd_card = Environment.getExternalStorageDirectory().toString() + "/subdir_x"; File file = new File( sd_card ) ; File list[] = file.listFiles(); for( int i=0; i< list.length; i++) { filesList.add( list[i].getName() ); } } 其中subdir_x是由手机上的另一个应用程序创建的。 我可以使用文件管理器查看这些文件夹,但是当我尝试file.listFiles()时,我的代码返回null。 如何访问这些文件? 回答1 我已经在棉花糖(6.0)中尝试了这种逻辑: 确保清单中有此内容: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /
  • 如何在Android 6.0棉花糖中访问相机?(How to Access Camera in Android 6.0 Marshmallow?)
    问题 我是Android 6.0编码的新手,请为以下代码提供解决方案: 当我提供诸如READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE之类的运行时权限时,它将显示异常,例如 java.lang.SecurityException:权限拒绝:启动意图{act = android.media.action.IMAGE_CAPTURE flg = 0x3 cmp = com.motorola.camera / .Camera clip = {text / uri-list U:file:/// storage /emulated/0/Pictures/MyAppNew%20File%20Upload/IMG_20160401_110234.jpg}(有其他功能)},来自android(已撤销权限){ed96564 26955:com.social.nocializer / u0a259}(pid = 26955,uid = 10259)。权限.CAMERA MediaStore.ACTION_IMAGE_CAPTURE和MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE运行时权限都不起作用... 注意: READ_EXTERNAL_STORAGE适用于打开图库时 回答1 您必须为此管理运行时权限
  • Application (WiFi connections) doesn't work anymore on Android 6.0 Marshmallow
    My application stopped working once I upgraded to Marshmallow, it was supposed to be able to change the WiFi connection, but now it doesn't do anything at all. I've spent some time reading about the new permission model of the Android 6.0. Well awesome, but old apps should continue working... Anyway, I started trying to implement the granting of permission, but realized that this is a normal permission and there should be done no permission request for it if it's defined in android manifest: <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> The permission has always been