您的位置:首页 > 移动开发 > Android开发

Android 5.1 Settings添加通知震动,通知音乐的开关功能实现

2016-10-15 21:26 543 查看
   转载请注明我的链接,尊重原创 !!!!!!!!!!!!!

  在Android系统订制Settings模块的时候需要添加许多自定义的功能,本文就讲一下如何在Settings模块实现通知震动和通知音乐的开关功能实现。

   主要思路是在

     1:Settings DB中添加两个Switch开关,一个是通知音乐  一个是通知震动 ,关闭的时候所有的Notifiction都没法震动和播放提示音。

    2:在framework的notificationManager修改代码添加变量控制

  

     首先了解Setting的音量,亮度许多变量都是存储在framework的settingDB中,现在我们要在这个DB添加两个bool类型的变量

    (1) base/core/java/android/provider/Settings.java  

  /**
* System settings, containing miscellaneous system preferences. This
* table holds simple name/value pairs. There are convenience<pre name="code" class="java"> public static final String[] SETTINGS_TO_BACKUP = {
STAY_ON_WHILE_PLUGGED_IN, // moved to global
WIFI_USE_STATIC_IP,
WIFI_STATIC_IP,
WIFI_STATIC_GATEWAY,
WIFI_STATIC_NETMASK,
WIFI_STATIC_DNS1,
WIFI_STATIC_DNS2,
BLUETOOTH_DISCOVERABILITY,
BLUETOOTH_DISCOVERABILITY_TIMEOUT,
DIM_SCREEN,
SCREEN_OFF_TIMEOUT,
SCREEN_BRIGHTNESS,
SCREEN_BRIGHTNESS_MODE,
SCREEN_AUTO_BRIGHTNESS_ADJ,
VIBRATE_INPUT_DEVICES,
MODE_RINGER_STREAMS_AFFECTED,
VOLUME_VOICE,
VOLUME_SYSTEM,
VOLUME_RING,
VOLUME_MUSIC,
VOLUME_ALARM,
VOLUME_NOTIFICATION,
VOLUME_BLUETOOTH_SCO,
VOLUME_VOICE + APPEND_FOR_LAST_AUDIBLE,
VOLUME_SYSTEM + APPEND_FOR_LAST_AUDIBLE,
VOLUME_RING + APPEND_FOR_LAST_AUDIBLE,
VOLUME_MUSIC + APPEND_FOR_LAST_AUDIBLE,
VOLUME_ALARM + APPEND_FOR_LAST_AUDIBLE,
VOLUME_NOTIFICATION + APPEND_FOR_LAST_AUDIBLE,
VOLUME_BLUETOOTH_SCO + APPEND_FOR_LAST_AUDIBLE,
TEXT_AUTO_REPLACE,
TEXT_AUTO_CAPS,
TEXT_AUTO_PUNCTUATE,
TEXT_SHOW_PASSWORD,
AUTO_TIME, // moved to global
AUTO_TIME_ZONE, // moved to global
TIME_12_24,
DATE_FORMAT,
DTMF_TONE_WHEN_DIALING,
DTMF_TONE_TYPE_WHEN_DIALING,
HEARING_AID,
TTY_MODE,
SOUND_EFFECTS_ENABLED,
HAPTIC_FEEDBACK_ENABLED,
POWER_SOUNDS_ENABLED, // moved to global
DOCK_SOUNDS_ENABLED, // moved to global
LOCKSCREEN_SOUNDS_ENABLED,
SHOW_WEB_SUGGESTIONS,
NOTIFICATION_LIGHT_PULSE,
SIP_CALL_OPTIONS,
SIP_RECEIVE_CALLS,
POINTER_SPEED,
VIBRATE_WHEN_RINGING,
RINGTONE,
LOCK_TO_APP_ENABLED,
NOTIFICATION_SOUND,
ANR_DEBUGGING_MECHANISM,
ANR_DEBUGGING_MECHANISM_STATUS,
<span style="color:#ff0000;">NOTIFICATION_VIBRATE, //add by zhongqi.shao on 2016-09-28 start
NOTIFICATION_MUSIC,</span>
KEY_VIBRATE
};


* functions for accessing individual settings entries. */ public static final class System extends NameValueTable { public static final String SYS_PROP_SETTING_VERSION = "sys.settings_system_version"; /** * The content:// style URL for this table */ public
static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/system"); public static final String RNS_USER_PREFERENCE = "rns_user_preference";/**add by zhongqi.shao on 2016-09-28 start*/public static final String NOTIFICATION_VIBRATE
= "notification_vibrate";public static final String NOTIFICATION_MUSIC = "notification_music";public static final String KEY_VIBRATE = "key_vibrate";/**add by zhongqi.shao on 2016-09-28 end*/

}


         (2)base/packages/SettingsProvider/res/values/defaults.xml

          <!--add by zhongqi.shao on 2016-09-28 start-->
<bool name="def_notification_vibrate">false</bool>
<bool name="def_notification_music">false</bool>
<bool name="def_key_vibrate">false</bool>
<!--add by zhongqi.shao on 2016-09-28 end-->
        (3) base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

          //add by zhongqi.shao on 2016-09-28 start
<span style="color:#ff0000;">loadBooleanSetting(stmt, Settings.System.NOTIFICATION_VIBRATE,R.bool.def_notification_vibrate);
loadBooleanSetting(stmt, Settings.System.NOTIFICATION_MUSIC,R.bool.def_notification_music);
loadBooleanSetting(stmt, Settings.System.KEY_VIBRATE,R.bool.def_key_vibrate); </span>
//add by zhongqi.shao on 2016-09-28 end  
      到这SettingDB添加两个bool类型的变量就结束了,别忘记make update-api更新framework一下

     这时候我们需要更改NotificationManagerService的逻辑了

    (5)base/services/core/java/com/android/server/notification/NotificationManagerService.java

      if (hasValidSound) {
/** modify by zhongqi.shao on 2016-09-28 start for settings notifition sound open*/
boolean settingsOpen = (Settings.System.getInt( getContext().getContentResolver(), Settings.System.NOTIFICATION_MUSIC,0) != 0);
if (<span style="color:#ff0000;">settingsOpen </span>&& hasValidSound) { /** modify by zhongqi.shao on 2016-09-28 end*/
boolean looping =
(notification.flags & Notification.FLAG_INSISTENT) != 0;
AudioAttributes audioAttributes = audioAttributesForNotification(notification);
... ...
@@ -2262,10 +2269,14 @@ public class NotificationManagerService extends SystemService {
// The DEFAULT_VIBRATE flag trumps any custom vibration AND the fallback.
final boolean useDefaultVibrate =
(notification.defaults & Notification.DEFAULT_VIBRATE) != 0;

//modify by zhongqi.shao on 2016-09-28 start
final boolean settingsVibrationOpen = (Settings.System.getInt( getContext().getContentResolver(), Settings.System.NOTIFICATION_VIBRATE,0) != 0);
//modify by zhongqi.shao on 2016-09-28 end

if ((useDefaultVibrate || convertSoundToVibration || hasCustomVibrate)
&& !(mAudioManager.getRingerModeInternal()
== AudioManager.RINGER_MODE_SILENT)) {
== AudioManager.RINGER_MODE_SILENT) && <span style="color:#ff0000;">settingsVibrationOpen</span>) {
mVibrateNotificationKey = record.getKey();

if (useDefaultVibrate || convertSoundToVibration) {     就是在发送通知的地方增加系统变量控制,具体逻辑就多看看源代码吧,这篇博文给定值Settings的童鞋来个思路!
    Just  Like!Just Do IT!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐