下拉快捷设置面板中都是一些设置的快捷开关,比如wifi,蓝牙,gps等,下面就介绍下添加一个NFC快捷开关的具体流程。
本文基于MTK 6.0

1.config.xml参数配置

  • 源码位置 frameworks/base/packages/SystemUI/res/values/config.xml;
 <!-- The default tiles to display in QuickSettings --><string name="quick_settings_tiles_default" translatable="false">wifi,bt,inversion,dnd,cell,airplane,nfc<!-- ,rotation,flashlight,cast -->,hotspot</string>

首先,在quick_settings_tiles_default中添加nfc字符,这个配置项确定了快捷设置面板上显示那些开关以及开关的显示顺序,它是在QSTileHost.java类中loadTileSpecs()方法中被调用,通过mContext.getResources().getString(R.string.quick_settings _tiles_default)获取默认加载的开关

2.创建SecNfcTile.java类
  • 源码位置 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/SecNfcTile.java;
 package com.android.systemui.qs.tiles;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.provider.*;import com.android.systemui.qs.QSTile;import com.android.systemui.qs.QSTile.BooleanState;import com.android.systemui.qs.QSTile.Host;import com.android.systemui.qs.QSTile.ResourceIcon;import com.android.systemui.R;import android.nfc.NfcAdapter;import android.nfc.NfcManager;import com.android.internal.logging.MetricsLogger;import android.util.Log;public class SecNfcTile extends QSTile<QSTile.BooleanState>{private static final String NFC_STATE_CHANGE = "com.android.NFC_STATE_CHANGE";private IntentFilter mIntentFilter;private int nfcState = NfcAdapter.STATE_OFF;  private Context mContext;public SecNfcTile(Host host){super(host);mContext = host.getContext()mIntentFilter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);mContext.registerReceiver(mReceiver, mIntentFilter);}// 点击之后的逻辑处理protected void handleClick(){  Intent intent = new Intent(NFC_STATE_CHANGE);if(nfcState == NfcAdapter.STATE_ON) {intent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE,NfcAdapter.STATE_OFF);}else if(nfcState == NfcAdapter.STATE_OFF) {intent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE,NfcAdapter.STATE_ON);}mContext.sendBroadcast(intent);// refreshState();}// 刷新界面改变开关的状态protected void handleUpdateState(QSTile.BooleanState paramBooleanState, Object paramObject){paramBooleanState.visible = true;paramBooleanState.label = mContext.getString(R.string.quick_settings_nfc_label);if(nfcState == NfcAdapter.STATE_ON){paramBooleanState.icon = QSTile.ResourceIcon.get(R.drawable.nfc_off);}else if (nfcState == NfcAdapter.STATE_OFF) {paramBooleanState.icon = QSTile.ResourceIcon.get(R.drawable.nfc_on);}}protected QSTile.BooleanState newTileState(){return new QSTile.BooleanState();}@Overridepublic int getMetricsCategory() {return MetricsLogger.QS_NFC;}public void setListening(boolean paramBoolean){}private final BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGED.equals(action)) {nfcState = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE,NfcAdapter.STATE_ON);refreshState();}}};}
3.NFC使能

由于nfc的服务实在systemui之后起来的,在SecNfcTile中取获取NfcAdapter为null,所以发广播在PhoneStatusBar.java中实现nfc使能控制。

  • 源码位置 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+   IntentFilter nfcFilter = new IntentFilter();
+   nfcFilter.addAction("com.android.NFC_STATE_CHANGE");
+   context.registerReceiver(mNfcReceiver, nfcFilter);+    private NfcAdapter mNfcAdapter;
+   private static final String NFC_STATE_CHANGE = "com.android.NFC_STATE_CHANGE";
+    private BroadcastReceiver mNfcReceiver = new BroadcastReceiver() {+        public void onReceive(Context context, Intent intent) {+            String action = intent.getAction();
+            int nfcState = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE,NfcAdapter.STATE_ON);
+            if (action.equals("com.android.NFC_STATE_CHANGE")) {+                if (mNfcAdapter == null) {+                    mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
+                }
+                if (mNfcAdapter != null) {+                    if (nfcState == NfcAdapter.STATE_ON) {+                        mNfcAdapter.enable();
+                    }else if (nfcState == NfcAdapter.STATE_OFF) {+                        mNfcAdapter.disable();
+                    }
+                }
+                Log.d("wxd"," mNfcReceiver :"+mNfcAdapter);
+            }
+        }
+    };
4.实例化SecNfcTile
  • 源码位置 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java;

在createTile()方法中添加nfc

   protected QSTile<?> createTile(String tileSpec) {IQuickSettingsPlugin quickSettingsPlugin = PluginFactory.getQuickSettingsPlugin(mContext);if (tileSpec.equals("wifi")) return new WifiTile(this);else if (tileSpec.equals("bt")) return new BluetoothTile(this);......else if (tileSpec.equals("nfc")) return new SecNfcTile(this);else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(this,tileSpec);else throw new IllegalArgumentException("Bad tile spec: " + tileSpec);}

注意:添加的tileSpec需要与config.xml中一致

到这里,快捷开关的添加就ok了。

Android SystemUI下拉状态栏添加快捷开关相关推荐

  1. Android 9.0 SystemUI 下拉状态栏快捷开关

    SystemUI 下拉状态栏快捷开关是 QSPanel,qs_panel.xml,@+id/quick_settings_panel,本篇文章就来看看这些快捷开关是如何呈现的以及如何新增一个快捷开关? ...

  2. Android 10.0 SystemUI下拉状态栏UI定制化开发系列(一)

    1.概述 10.0定制化开发中,由于客户需求要求对整个SystemUI下拉状态栏和下拉通知栏部分的UI做定制,所以需要修改整个下拉状态栏的 UI布局页面,这要求对整个NotificationPanel ...

  3. 9.0自定义SystemUI下拉状态栏和通知栏视图(十七)之自定义通知布局构建

    1.前言 在进行9.0的rom产品定制化开发中,在9.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品 ...

  4. 10.0 自定义SystemUI下拉状态栏和通知栏视图(八)之锁屏通知布局

    1.前言 在进行10.0的系统rom产品定制化开发中,在10.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以 ...

  5. 12.0 自定义SystemUI下拉状态栏和通知栏视图(二十)之锁屏通知布局

    1.前言 在进行12.0的系统rom产品定制化开发中,在12.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以 ...

  6. Android 8.0 SystemUI下拉状态栏快捷开关

    基于工作需要,基本是在Android源生代码上进行开发,从android 5.0到现在8.0,这两年碰到各种问题发现关于Android源生发开方面的特别少.于是想着开始把遇到的.解决的问题写下来,或许 ...

  7. Android 10.0 SystemUI下拉状态栏时间格式的修改(一)

    在原生的下拉状态栏时间格式为 某月某日周几 这样的格式 客户需要修改为年月日周几 某时某分这种格式 这就需要修改 显示时间的格式 在更新时间时 按照这个格式更新就可以了 首选来看 时间控件的布局文件q ...

  8. Android 10 禁止SystemUI 下拉状态栏和通知栏

    1.未锁屏时禁止状态栏和通知栏下拉 代码路径: frameworks/base/packages/SystemUI/src/com/android/systemui/keyguard/Keyguard ...

  9. Android 10.0 SystemUI下拉状态栏UI定制化开发系列(八)

    目录 1.概述 2.核心代码部分 3.核心代码分析 3.1状态栏黑色透明背景的分析

  10. Android 10.0 SystemUI下拉状态栏UI定制化开发系列(十二)

    目录 1.概述 2.核心代码 3.核心代码部分分析 3.1 NotificationStackScrollLayout.java代码分析 3.2接下来分析Activat

最新文章

  1. Windows下Python添加MySQLdb扩展模块
  2. 『Python基础-11』集合 (set)
  3. 生成和验证注册码的基本思路
  4. 我从Team Leader变成了CTO,有些不适应,不过我要调整
  5. Python爬虫(十三)_案例:使用XPath的爬虫
  6. 双向广搜 8数码问题
  7. android插件化-获取apkplug框架已安装插件-03
  8. jQuery Ajax 如何设置Timeout
  9. keil4怎么移植其他人的程序_简单和你聊聊造血干细胞移植!
  10. docker-compose参数介绍
  11. 请给 SpringBoot 多一些内存
  12. jQuery之.queue()
  13. 将home多余的空间分配到/分区下
  14. 超简单!Vue 短信验证码组件开发详解
  15. C#实现小写金额转大写金额
  16. 【优化算法】蛾群优化算法(MSA)【含Matlab源码 1807期】
  17. lj245a引脚功能图_干货|教你如何看懂单片机时序图
  18. std string与线程安全_是std :: regex线程安全吗?
  19. anaconda自带的python是什么版本_anaconda怎么查看python版本
  20. 多项式插值与样条插值的解释与示例(matlab)

热门文章

  1. ibm vios_使用IBM地理分散弹性解决方案在生产现场保留冗余VIOS配置
  2. 互联网创业者必备的十种思维
  3. Ubuntu没有屏幕亮度调节怎么调整屏幕亮度?
  4. 【4】Git查看版本库当前状态
  5. Spyder窗口布局调整
  6. cidaemon.exe进程
  7. 大一高数下册笔记整理_大学高等数学知识点整理(全)
  8. 获取mp3部分信息的python代码
  9. 女大学生 你的青春值多少钱
  10. 百度SEO全自动百度挂机循环提交工具(MIP 主动推送)泛目录专用