上面是今天要分享的一些系统修改,长按power键添加reboot选项,内置所有客服提供的铃声,并且默认客户指定的系统铃声以及铃声音量,全部移除系统的自带铃声
①长按power键,添加重启选项
首先系统是只有关机选项的,所以我们要先添加布局和标签,在写逻辑代码
需要在 frameworks\base\core\res\res\values\strings.xml 添加一个标签,例如博主添加:
<strong><span style="color:#3366ff;"><string name="engineer_jsp_add_power_reboot">Reboot</string></span></strong>
frameworks\base\core\res\res\values\symbols.xml
<strong><span style="color:#3366ff;"><java-symbol type="string" name="engineer_jsp_add_power_reboot" /></span></strong>
修改java文件:
frameworks\base\policy\src\com\android\internal\policy\impl\GlobalAct
ions.java
修改函数:
<strong><span style="color:#3366ff;"> @Override protected void changeStateFromPress(boolean buttonOn) { if (!mHasTelephony) return; // In ECM mode airplane state cannot be changed if (!(Boolean.parseBoolean( SystemProperties.get(TelephonyProperties.PROPERTY_INECM_MODE)))) { mState = buttonOn ? State.TurningOn : State.TurningOff; mAirplaneState = mState; } } public boolean showDuringKeyguard() { return true; } public boolean showBeforeProvisioning() { return false; } public boolean isEnabled() { boolean isAirplaneModeAvailable = true; //FIXME: for build pass, please help to crrect me /*try { final ITelephonyEx phoneEx = ITelephonyEx.Stub.asInterface(ServiceManager.checkService("phoneEx")); if (phoneEx != null) { isAirplaneModeAvailable = phoneEx.isAirplanemodeAvailableNow(); } } catch (RemoteException e) { Log.d(TAG, "isAirplanemodeAvailableNow exception caught"); }*/ return (super.isEnabled() && isAirplaneModeAvailable); } }; onAirplaneModeChanged(); mItems = new ArrayList<Action>(); String[] defaultActions = mContext.getResources().getStringArray( com.android.internal.R.array.config_globalActionsList); ArraySet<String> addedKeys = new ArraySet<String>(); for (int i = 0; i < defaultActions.length; i++) { String actionKey = defaultActions[i]; if (addedKeys.contains(actionKey)) { // If we already have added this, don't add it again. continue; } if (GLOBAL_ACTION_KEY_POWER.equals(actionKey)) { mItems.add(new PowerAction()); // Engineer-Jsp add longpress power key reboot item start if(android.os.SystemProperties.isWalPadVersion()){ mItems.add(new SinglePressAction(com.android.internal.R.drawable.ic_lock_power_off,R.string.zzzzz_global_action_power_reboot) { public void onPress() { mWindowManagerFuncs.reboot(true); } public boolean onLongPress() { mWindowManagerFuncs.rebootSafeMode(true); return true; } public boolean showDuringKeyguard() { return true; } public boolean showBeforeProvisioning() { return true; } } ); } // Engineer-Jsp add longpress power key reboot item end } else if (GLOBAL_ACTION_KEY_AIRPLANE.equals(actionKey)) { mItems.add(mAirplaneModeOn); } else if (GLOBAL_ACTION_KEY_BUGREPORT.equals(actionKey)) { if (Settings.Global.getInt(mContext.getContentResolver(), ......</span></strong>
在WindowManagerFuncs这个interface的定义,增加如下function声明:
<strong><span style="color:#3366ff;">public interface WindowManagerFuncs { public void reboot(boolean confirm); }</span></strong>还需要在frameworks\base\services\java\com\android\server\wm\WindowManagerService.j
在shutdown()函数后面添加reboot()函数
<strong><span style="color:#3366ff;"> // Called by window manager policy. Not exposed externally. @Override public void shutdown(boolean confirm) { ShutdownThread.shutdown(mContext, confirm); } //Engineer-Jsp add reboot interface method // Called by window manager policy. Not exposed externally. @Override public void reboot(boolean confirm) { ShutdownThread.reboot(mContext,null,confirm); }</span></strong>
<strong><span style="color:#3366ff;"> /** * Request a clean shutdown, waiting for subsystems to clean up their * state etc. Must be called from a Looper thread in which its UI * is shown. * * @param context Context used to display the shutdown progress dialog. * @param reason code to pass to the kernel (e.g. "recovery"), or null. * @param confirm true if user confirmation is needed before shutting down. */ public static void reboot(final Context context, String reason, boolean confirm) { mReboot = true; mRebootSafeMode = false; mRebootReason = reason; Log.d(TAG, "reboot"); if (mSpew) { StackTraceElement[] stack = new Throwable().getStackTrace(); for (StackTraceElement element : stack) { Log.d(TAG, " |----" + element.toString()); } } shutdownInner(context, confirm); }</span></strong>
<strong><span style="color:#3366ff;">R.string.engineer_jsp_add_power_reboot not defind... Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. #### make failed to build some targets (01:40 (mm:ss)) ####</span></strong>
<strong><span style="color:#3366ff;">make update-api;make -j24</span></strong>
②内置铃声
需要内置的铃声文件:
notifications & SMS:
ringtones:
alarms:
我们需要把这些文件分别通过mk编译到 system/的media/audio等目录下
在 \frameworks\base\data\sounds 编写mk文件如下:
<strong><span style="color:#3366ff;"># Engineer-Jsp Edit Makefile add system default audio # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Engineer-Jsp Edit Makefile add system default audio LOCAL_PATH := frameworks/base/data/sounds PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/alarms/mp3/Celedon.mp3:system/media/audio/alarms/Celedon.mp3 \ $(LOCAL_PATH)/alarms/mp3/Chartreuse.mp3:system/media/audio/alarms/Chartreuse.mp3 \ $(LOCAL_PATH)/alarms/mp3/Extreme.mp3:system/media/audio/alarms/Extreme.mp3 \ $(LOCAL_PATH)/alarms/mp3/Gold.mp3:system/media/audio/alarms/Gold.mp3 \ $(LOCAL_PATH)/alarms/mp3/Metal.mp3:system/media/audio/alarms/Metal.mp3 \ $(LOCAL_PATH)/alarms/mp3/Solo_Up.mp3:system/media/audio/alarms/Solo_Up.mp3 \ $(LOCAL_PATH)/alarms/mp3/Topaz.mp3:system/media/audio/alarms/Topaz.mp3 \ $(LOCAL_PATH)/alarms/mp3/Turquoise.mp3:system/media/audio/alarms/Turquoise.mp3\ $(LOCAL_PATH)/alarms/ogg/Beep.ogg:system/media/audio/alarms/Beep.ogg \ $(LOCAL_PATH)/alarms/ogg/Clock.ogg:system/media/audio/alarms/Clock.ogg \ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \ $(LOCAL_PATH)/alarms/ogg/Buzzer.ogg:system/media/audio/alarms/Buzzer.ogg \ $(LOCAL_PATH)/alarms/ogg/Charman.ogg:system/media/audio/alarms/Charman.ogg \ $(LOCAL_PATH)/alarms/ogg/Classic.ogg:system/media/audio/alarms/Classic.ogg \ $(LOCAL_PATH)/alarms/ogg/Flickering.ogg:system/media/audio/alarms/Flickering.ogg \ $(LOCAL_PATH)/alarms/ogg/Good_Morning.ogg:system/media/audio/alarms/Good_Morning.ogg \ $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \ $(LOCAL_PATH)/alarms/ogg/Lustre.ogg:system/media/audio/alarms/Lustre.ogg \ $(LOCAL_PATH)/alarms/ogg/Morning.ogg:system/media/audio/alarms/Morning.ogg \ $(LOCAL_PATH)/alarms/ogg/Open_Forest.ogg:system/media/audio/alarms/Open_Forest.ogg \ $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:system/media/audio/alarms/Scandium.ogg \ $(LOCAL_PATH)/alarms/ogg/Twilight.ogg:system/media/audio/alarms/Twilight.ogg \ $(LOCAL_PATH)/alarms/ogg/Ease_Up.ogg:system/media/audio/alarms/Ease_Up.ogg \ $(LOCAL_PATH)/notifications/ogg/Ariel.ogg:system/media/audio/notifications/Ariel.ogg \ $(LOCAL_PATH)/notifications/ogg/Attraction.ogg:system/media/audio/notifications/Attraction.ogg \ $(LOCAL_PATH)/notifications/ogg/BentMallets.ogg:system/media/audio/notifications/BentMallets.ogg \ $(LOCAL_PATH)/notifications/ogg/DingDong.ogg:system/media/audio/notifications/DingDong.ogg \ $(LOCAL_PATH)/notifications/ogg/Castor.ogg:system/media/audio/notifications/Castor.ogg \ $(LOCAL_PATH)/notifications/ogg/Clean.ogg:system/media/audio/notifications/Clean.ogg \ $(LOCAL_PATH)/notifications/ogg/DingDong.ogg:system/media/audio/notifications/DingDong.ogg \ $(LOCAL_PATH)/notifications/ogg/Europa.ogg:system/media/audio/notifications/Europa.ogg \ $(LOCAL_PATH)/notifications/ogg/Heaven.ogg:system/media/audio/notifications/Heaven.ogg \ $(LOCAL_PATH)/notifications/ogg/Lapetus.ogg:system/media/audio/notifications/Lapetus.ogg \ $(LOCAL_PATH)/notifications/ogg/Liquids.ogg:system/media/audio/notifications/Liquids.ogg \ $(LOCAL_PATH)/notifications/ogg/Message01.ogg:system/media/audio/notifications/Message01.ogg \ $(LOCAL_PATH)/notifications/ogg/Message02.ogg:system/media/audio/notifications/Message02.ogg \ $(LOCAL_PATH)/notifications/ogg/Message03.ogg:system/media/audio/notifications/Message03.ogg \ $(LOCAL_PATH)/notifications/ogg/Message04.ogg:system/media/audio/notifications/Message04.ogg \ $(LOCAL_PATH)/notifications/ogg/Message05.ogg:system/media/audio/notifications/Message05.ogg \ $(LOCAL_PATH)/notifications/ogg/Notification.ogg:system/media/audio/notifications/Notification.ogg \ $(LOCAL_PATH)/notifications/ogg/Tethys.ogg:system/media/audio/notifications/Tethys.ogg \ $(LOCAL_PATH)/notifications/ogg/Titan.ogg:system/media/audio/notifications/Titan.ogg \ $(LOCAL_PATH)/notifications/ogg/Rhea.ogg:system/media/audio/notifications/Rhea.ogg \ $(LOCAL_PATH)/notifications/ogg/Elara.ogg:system/media/audio/notifications/Elara.ogg \ $(LOCAL_PATH)/notifications/wav/SMS1.wav:system/media/audio/notifications/SMS1.wav \ $(LOCAL_PATH)/notifications/wav/SMS2.wav:system/media/audio/notifications/SMS2.wav \ $(LOCAL_PATH)/notifications/wav/SMS3.wav:system/media/audio/notifications/SMS3.wav \ $(LOCAL_PATH)/notifications/wav/SMS4.wav:system/media/audio/notifications/SMS4.wav \ $(LOCAL_PATH)/notifications/mp3/Airport.mp3:system/media/audio/notifications/Airport.mp3 \ $(LOCAL_PATH)/notifications/mp3/SMS_Tone.mp3:system/media/audio/notifications/SMS_Tone.mp3 \ $(LOCAL_PATH)/ringtones/ogg/Amber.ogg:system/media/audio/ringtones/Amber.ogg \ $(LOCAL_PATH)/ringtones/ogg/Beat_Plucker.ogg:system/media/audio/ringtones/Beat_Plucker.ogg \ $(LOCAL_PATH)/ringtones/ogg/Beyond_Star.ogg:system/media/audio/ringtones/Beyond_Star.ogg \ $(LOCAL_PATH)/ringtones/ogg/Birds_Flute.ogg:system/media/audio/ringtones/Birds_Flute.ogg \ $(LOCAL_PATH)/ringtones/ogg/Brightness_Beats.ogg:system/media/audio/ringtones/Brightness_Beats.ogg \ $(LOCAL_PATH)/ringtones/ogg/Callisto.ogg:system/media/audio/ringtones/Callisto.ogg \ $(LOCAL_PATH)/ringtones/ogg/Champagne.ogg:system/media/audio/ringtones/Champagne.ogg \ $(LOCAL_PATH)/ringtones/ogg/Corning_Star.ogg:system/media/audio/ringtones/Corning_Star.ogg \ $(LOCAL_PATH)/ringtones/ogg/Digital_Ring.ogg:system/media/audio/ringtones/Digital_Ring.ogg \ $(LOCAL_PATH)/ringtones/ogg/Drops.ogg:system/media/audio/ringtones/Drops.ogg \ $(LOCAL_PATH)/ringtones/ogg/Echo.ogg:system/media/audio/ringtones/Echo.ogg \ $(LOCAL_PATH)/ringtones/ogg/Electronic.ogg:system/media/audio/ringtones/Electronic.ogg \ $(LOCAL_PATH)/ringtones/ogg/Enthusiastic.ogg:system/media/audio/ringtones/Enthusiastic.ogg \ $(LOCAL_PATH)/ringtones/ogg/Exciting.ogg:system/media/audio/ringtones/Exciting.ogg \ $(LOCAL_PATH)/ringtones/ogg/Exotic.ogg:system/media/audio/ringtones/Exotic.ogg \ $(LOCAL_PATH)/ringtones/ogg/Friendly_Ghost.ogg:system/media/audio/ringtones/Friendly_Ghost.ogg \ $(LOCAL_PATH)/ringtones/ogg/FunTime.ogg:system/media/audio/ringtones/FunTime.ogg \ $(LOCAL_PATH)/ringtones/ogg/Gimme_Town.ogg:system/media/audio/ringtones/Gimme_Town.ogg \ $(LOCAL_PATH)/ringtones/ogg/Harmony.ogg:system/media/audio/ringtones/Harmony.ogg \ $(LOCAL_PATH)/ringtones/ogg/Harp_Bell.ogg:system/media/audio/ringtones/Harp_Bell.ogg \ $(LOCAL_PATH)/ringtones/ogg/Ice_World.ogg:system/media/audio/ringtones/Ice_World.ogg \ $(LOCAL_PATH)/ringtones/ogg/Joyful_Dolls.ogg:system/media/audio/ringtones/Joyful_Dolls.ogg \ $(LOCAL_PATH)/ringtones/ogg/Kuma.ogg:system/media/audio/ringtones/Kuma.ogg \ $(LOCAL_PATH)/ringtones/ogg/Little_Joy.ogg:system/media/audio/ringtones/Little_Joy.ogg \ $(LOCAL_PATH)/ringtones/ogg/Luna.ogg:system/media/audio/ringtones/Luna.ogg \ $(LOCAL_PATH)/ringtones/ogg/Music_Box.ogg:system/media/audio/ringtones/Music_Box.ogg \ $(LOCAL_PATH)/ringtones/ogg/Oberon.ogg:system/media/audio/ringtones/Oberon.ogg \ $(LOCAL_PATH)/ringtones/ogg/Orange.ogg:system/media/audio/ringtones/Orange.ogg \ $(LOCAL_PATH)/ringtones/ogg/Organ_Dub.ogg:system/media/audio/ringtones/Organ_Dub.ogg \ $(LOCAL_PATH)/ringtones/ogg/Phobos.ogg:system/media/audio/ringtones/Phobos.ogg \ $(LOCAL_PATH)/ringtones/ogg/Radio_Groove.ogg:system/media/audio/ringtones/Radio_Groove.ogg \ $(LOCAL_PATH)/ringtones/ogg/Rhythm.ogg:system/media/audio/ringtones/Rhythm.ogg \ $(LOCAL_PATH)/ringtones/ogg/Ringtone_Pro.ogg:system/media/audio/ringtones/Ringtone_Pro.ogg \ $(LOCAL_PATH)/ringtones/ogg/Robot_Envy.ogg:system/media/audio/ringtones/Robot_Envy.ogg \ $(LOCAL_PATH)/ringtones/ogg/Sail.ogg:system/media/audio/ringtones/Sail.ogg \ $(LOCAL_PATH)/ringtones/ogg/Sceptrum.ogg:system/media/audio/ringtones/Sceptrum.ogg \ $(LOCAL_PATH)/ringtones/ogg/Sunshine.ogg:system/media/audio/ringtones/Sunshine.ogg \ $(LOCAL_PATH)/ringtones/ogg/Synth.ogg:system/media/audio/ringtones/Synth.ogg \ $(LOCAL_PATH)/ringtones/ogg/Themos.ogg:system/media/audio/ringtones/Themos.ogg \ $(LOCAL_PATH)/ringtones/ogg/Triton.ogg:system/media/audio/ringtones/Triton.ogg \ $(LOCAL_PATH)/ringtones/ogg/Twirl_Away.ogg:system/media/audio/ringtones/Twirl_Away.ogg \ $(LOCAL_PATH)/ringtones/ogg/Umbriel.ogg:system/media/audio/ringtones/Umbriel.ogg \ $(LOCAL_PATH)/ringtones/ogg/Vivacious_Clang.ogg:system/media/audio/ringtones/Vivacious_Clang.ogg \ $(LOCAL_PATH)/ringtones/ogg/Voice.ogg:system/media/audio/ringtones/Voice.ogg \ $(LOCAL_PATH)/ringtones/ogg/Wooden.ogg:system/media/audio/ringtones/Wooden.ogg \ $(LOCAL_PATH)/ringtones/ogg/XtremeTone.ogg:system/media/audio/ringtones/XtremeTone.ogg \ $(LOCAL_PATH)/ringtones/ogg/Xylophone.ogg:system/media/audio/ringtones/Xylophone.ogg \ $(LOCAL_PATH)/ringtones/wav/Aktara.wav:system/media/audio/ringtones/Aktara.wav \ $(LOCAL_PATH)/ringtones/wav/Electric_Piano.wav:system/media/audio/ringtones/Electric_Piano.wav \ $(LOCAL_PATH)/ringtones/wav/Guitar.wav:system/media/audio/ringtones/ringtonesGuitar.wav \ $(LOCAL_PATH)/ringtones/wav/Short01.wav:system/media/audio/ringtones/Short01.wav \ $(LOCAL_PATH)/ringtones/wav/Short02.wav:system/media/audio/ringtones/Short02.wav \ $(LOCAL_PATH)/ringtones/wav/Short03.wav:system/media/audio/ringtones/Short03.wav \ $(LOCAL_PATH)/ringtones/wav/Short04.wav:system/media/audio/ringtones/Short04.wav \ $(LOCAL_PATH)/ringtones/wav/Vocal.wav:system/media/audio/ringtones/Vocal.wav \ $(LOCAL_PATH)/ringtones/wav/Rong_Master.wav:system/media/audio/ringtones/Rong_Master.wav \ $(LOCAL_PATH)/ringtones/mp3/Banshi_Fusion.mp3:system/media/audio/ringtones/Banshi_Fusion.mp3 \ $(LOCAL_PATH)/ringtones/mp3/Banshi.mp3:system/media/audio/ringtones/Banshi.mp3 \ $(LOCAL_PATH)/ringtones/mp3/Humor.mp3:system/media/audio/ringtones/Humor.mp3 \ $(LOCAL_PATH)/ringtones/mp3/Mobile_Guitar.mp3:system/media/audio/ringtones/Mobile_Guitar.mp3 \ $(LOCAL_PATH)/ringtones/mp3/Rain_Drops.mp3:system/media/audio/ringtones/Rain_Drops.mp3 \ $(LOCAL_PATH)/ringtones/mp3/Splash.mp3:system/media/audio/ringtones/Splash.mp3 \ $(LOCAL_PATH)/ringtones/mp3/Ultramarine.mp3:system/media/audio/ringtones/Ultramarine.mp3</span></strong>
make clean;make -jxx 工程,给错如下错误提示:
<strong><span style="color:#3366ff;">frameworks/base/data/sounds/Audio.mk:62: *** commands commence before first target. Stop. #### make failed to build some targets ####</span></strong>我详细的检查自己写的mk之后,发现没有任何路径或者其他明显错误,于是考虑是不是格式问题
使用命令检查mk文件格式是否合法:
<strong><span style="color:#3366ff;">$vi frameworks\base\data\sounds\Audio.mk</span></strong>发现确实存在格式错误:
然后进行正确的格式处理:
修改默认的铃声:
通知和铃声:build\target\product\core_base.mk
<strong><span style="color:#3366ff;">PRODUCT_PROPERTY_OVERRIDES := \ ro.config.notification_sound=Rong Master.wav \ ro.config.alarm_alert=Osmium.ogg</span></strong>来电、通知、sms:build\target\product\full_base.mk
<strong><span style="color:#3366ff;"># Additional settings used in all AOSP builds PRODUCT_PROPERTY_OVERRIDES := \ ro.config.ringtone=Rong_Master.wav \ ro.config.notification_sound=Elara.ogg\ ro.config.sms_sound=Reha.ogg # Put en_US first in the list, so make it default.</span></strong>
修改对应的默认值数组即可!
make clean;make -jxx 工程,烧录新的固件,即可看到效果,谢谢观博