前几天要改一个小设置,设置拨号盘默认无声音(原生态的froyo代码默认是有声音的),当时因为忙是别人在做,今天验证的时候发现,虽然设置里面的checkbox是没有打勾的(即无声音),但是拨号盘那边仍然有声音。

查看代码,在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java里面,有这样一条语句

// Set default cdma DTMF type loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);

所以,我认为拨号音默认应该是关的。

在packages/apps/Settings/src/com/android/settings/SoundSettings.java声音设置界面,有这样的语句

mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE); mDtmfTone.setPersistent(false); mDtmfTone.setChecked(Settings.System.getInt(resolver, Settings.System.DTMF_TONE_WHEN_DIALING, 1) != 0);

这样,按表面逻辑(0 != 0)应该是返回false,所以checkbox是未打勾的。

而在packages/apps/Contacts/src/com/android/contacts/TwelveKeyDialer.java拨号盘界面这边,有这样的语句

mDTMFToneEnabled = Settings.System.getInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING, 0) == 1;

这样,按表面逻辑(0 == 1)应该也是false,不应该出现拨号音,所以有矛盾。

经过思索,确认问题应该处在frameworks/base/core/java/android/provider/Settings.java的public static int getInt(ContentResolver cr, String name, int def)这个方法上,以前一直忽略了最后一个参数def的作用,以为在读不到数据库里面的值的时候,才使用这个默认值,而数据库不破坏的情况下,是不可能读不到的,所以这肯定是一个鸡肋。

(以下是我的理解,有错勿怪)实际上,在第一次按checkbox之前,数据库里是没有该key的记录的,而且是一直使用这个默认值,直到改变这个checkbox,如在packages/apps/Settings/src/com/android/settings/SoundSettings.java里面,有这样的语句

Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING, mDtmfTone.isChecked() ? 1 : 0);

这个时候,才会往数据库里面插入这样一条记录,而value读取的就是现在checkbox的状态。

我想当然的以为这些key-value对,在系统启动的时候就插入了,其实不然。站在设计者的角度,为了系统的性能着想,肯定是第一次用到的时候插入记录更合理,缺点程序理解起来有困难,如果在该key-value对没有插入数据库之前,两个地方的两个默认不一致,就会发生矛盾。解决这种问题很简单,设置好默认值,并且保持一直即可。

更多相关文章

  1. Android(安卓)O中Notification进度条一直弹出提示及提示音
  2. Android的Audio系统详解
  3. 使用MediaRecorder录制音频
  4. 关于Android(安卓)WebView的那点事儿..
  5. Android使用WebView浏览有声音或者视频的网页,关闭WebView之后,声
  6. Android通过摇晃手机的频率来控制声音的频率
  7. android 获取实时麦克风声音大小
  8. android 9.0 增加实体按键的按键声音,以及增加按键声音的开关
  9. android声音播放

随机推荐

  1. Android中安装,启动和卸载应用
  2. Android USB debugging 功能失效
  3. Android开发7:单元测试
  4. 仿UC底部菜单栏实例源码
  5. 在Android上创建一个PopupWindow
  6. Android Support Package 支撑包
  7. 在sd卡存储文件
  8. Android(安卓)SB的一面,BUG汇总
  9. Android 解决布局问题
  10. Android Studio 自定义Apk的名字