Android5.1 Android7.1 下拉快捷设置面板添加快捷开关、根据型号显示不同配置、quick settings中去掉不需要的图标
https://www.cnblogs.com/joy99/p/6269946.html
一.android5.1 源码
1.1.ANDROID5.1\frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone\QSTileHost.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | private List<String> loadTileSpecs() { final Resources res = mContext.getResources(); final String defaultTileList = res.getString(R.string.quick_settings_tiles_default); String tileList = Secure.getStringForUser(mContext.getContentResolver(), TILES_SETTING, mUserTracker.getCurrentUserId()); if (tileList == null ) { tileList = res.getString(R.string.quick_settings_tiles); if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList); } else { if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList); } final ArrayList<String> tiles = new ArrayList<String>(); boolean addedDefault = false ; for (String tile : tileList.split( "," )) { tile = tile.trim(); if (tile.isEmpty()) continue ; if (tile.equals( "default" )) { if (!addedDefault) { tiles.addAll(Arrays.asList(defaultTileList.split( "," ))); addedDefault = true ; } } else { tiles.add(tile); } } return tiles; } |
1.2.ANDROID5.1\frameworks\base\packages\SystemUI\res\values\config.xml
创建快捷开关时需要按照参数配置文件config.xml来加载快捷开关信息
1 2 3 4 5 | ( 1 ) QSTileHost类在构造函数里调用recreateTiles() 方法; ( 2 ) 在recreateTiles() 方法里loadTileSpecs(); ( 3 ) loadTileSpecs() 方法里通过mContext.getResources().getString(R.string.quick_settings _tiles_default) 从config.xml中加载快捷开关规 格”quick_settings_tiles_default” 这个配置项便确定了默认情况下快速设定面板上显示哪些开关以及开关的显示顺序; ( 4 ) 接下来创建快捷开关createTile() ,通过从config.xml文件中获取的配置信息实例化每个快捷开关; ( 5 ) 最后将创建的快捷开关保存在成员变量mTiles列表里,通过调用QSTileHost.getTiles() 可以获取到所有的快捷开关。 |
二.根据wifi_chip来加载config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | private String getWifiNameString(String path) { String defString = "AP6181" ; try { @SuppressWarnings ( "resource" ) BufferedReader reader = new BufferedReader( new FileReader(path)); defString = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } return defString; } private List<String> loadTileSpecs() { String wifiName = getWifiNameString( "/data/wifi_chip" ); final Resources res = mContext.getResources(); final String defaultTileList; final String defaultTileList_bt; if (TelephonyManager.getDefault().getPhoneCount() > 1 ) { defaultTileList = res.getString(R.string.quick_settings_tiles_default_dualsim); defaultTileList_bt = res.getString(R.string.quick_settings_tiles_default_bt_dualsim); } else { defaultTileList = res.getString(R.string.quick_settings_tiles_default); defaultTileList_bt = res.getString(R.string.quick_settings_tiles_default_bt); } String tileList = Secure.getStringForUser(mContext.getContentResolver(), TILES_SETTING, mUserTracker.getCurrentUserId()); if (tileList == null ) { tileList = res.getString(R.string.quick_settings_tiles); if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList); } else { if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList); } final ArrayList<String> tiles = new ArrayList<String>(); boolean addedDefault = false ; for (String tile : tileList.split( "," )) { tile = tile.trim(); if (tile.isEmpty()) continue ; if (tile.equals( "default" )) { if (!addedDefault) { if (wifiName.contains( "AP6181" ) || wifiName.contains( "RTL8189FS" ) || wifiName.contains( "RTL8189ES" )|| wifiName.contains( "RTL8188EU" ) /*SystemProperties.get("ro.rk.bt_enable", "true").equals("false")*/ ) tiles.addAll(Arrays.asList(defaultTileList.split( "," ))); else tiles.addAll(Arrays.asList(defaultTileList_bt.split( "," ))); addedDefault = true ; } } else { tiles.add(tile); } } return tiles; } |
config.xml
1 2 3 4 5 6 7 8 9 | <!-- The default tiles to display in QuickSettings --> <string name= "quick_settings_tiles_default_bt" translatable= "false" > wifi,bt,inversion,cell,airplane,rotation,flashlight,location,cast,hotspot </string> <!-- The default tiles to display in QuickSettings --> <string name= "quick_settings_tiles_default" translatable= "false" > wifi,inversion,dnd,rotation,location,cast,hotspot </string> |
1 2 | wifi,bt,inversion,cell,airplane,rotation,flashlight,location,cast,hotspot 分配对应着quick settings中的:wifi开关、bluetooth开关、inversion、cell-sim卡、飞行模式、转屏锁、手电筒、位置信息、cast-wifi屏幕投射、wifi热点 |
三.隐藏下来快捷设置
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @@ - 101 , 7 + 101 , 7 @@ public class PhoneStatusBarView extends PanelBar { @Override public PanelView selectPanelForTouch(MotionEvent touch) { - final float x = touch.getX(); + /*final float x = touch.getX(); if(mAppBarPanel != null) LOGD("selectPanelForTouch enable="+mAppBarPanel.panelViewEnabled()); if(mAppBarPanel != null && mAppBarPanel.panelViewEnabled()){ @@ -112,7 +112,8 @@ public class PhoneStatusBarView extends PanelBar { // No double swiping. If either panel is open, nothing else can be pulled down. return mNotificationPanel.getExpandedHeight() > 0 ? null - : mNotificationPanel; + : mNotificationPanel;*/ + return null ; } |
四.Android7.1 下拉快捷设置面板添加快捷开关
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
1 2 3 4 5 6 7 8 9 | @@ - 497 , 7 + 497 , 7 @@ public class NotificationPanelView extends PanelView implements @Override public void resetViews() { mIsLaunchTransitionFinished = false ; - mBlockTouches = false ; + mBlockTouches = true ; mUnlockIconActive = false ; if (!mLaunchingAffordance) { mAfforanceHelper.reset( false ); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】