Android 通过计算器暗码启动应用

项目不带通话功能,要求通过计算器输入暗码打开测试应用。

  • 查看布局文件 数字显示控件
    packages\apps\ExactCalculator\res\layout\display_one_line.xml
xml 复制代码
...

        <com.android.calculator2.CalculatorScrollView
            android:id="@+id/formula_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:overScrollMode="never"
            android:scrollbars="none">
			<!--用户输入显示控件-->
            <com.android.calculator2.CalculatorFormula
                android:id="@+id/formula"
                style="@style/DisplayTextStyle.Formula"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="bottom|end"
                android:ellipsize="none"
                android:gravity="bottom|end"
                android:longClickable="true"
                android:singleLine="true"
                android:textColor="@color/display_formula_text_color"
                android:textIsSelectable="false" />

        </com.android.calculator2.CalculatorScrollView>
...
  • 自定义控件CalculatorFormula最终继承了TextView,并且重写了onTextChanged方法。

packages/apps/ExactCalculator/src/com/android/calculator2/CalculatorFormula.java

java 复制代码
package com.android.calculator2;

...
import android.content.Intent;///mh.modify 

/**
 * TextView adapted for displaying the formula and allowing pasting.
 */
public class CalculatorFormula extends AlignedTextView implements MenuItem.OnMenuItemClickListener,
        ClipboardManager.OnPrimaryClipChangedListener {

    public static final String TAG_ACTION_MODE = "ACTION_MODE";

	...
    
    private Context mContext;///mh.modify

    public CalculatorFormula(Context context) {
        this(context, null /* attrs */);
    }

    public CalculatorFormula(Context context, AttributeSet attrs) {
        this(context, attrs, 0 /* defStyleAttr */);
    }
	//修改构造方法,context启动应用时需要
    public CalculatorFormula(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;//mh.modify

        mClipboardManager = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);

        final TypedArray a = context.obtainStyledAttributes(
                attrs, R.styleable.CalculatorFormula, defStyleAttr, 0);
        mMaximumTextSize = a.getDimension(
                R.styleable.CalculatorFormula_maxTextSize, getTextSize());
        mMinimumTextSize = a.getDimension(
                R.styleable.CalculatorFormula_minTextSize, getTextSize());
        mStepTextSize = a.getDimension(R.styleable.CalculatorFormula_stepTextSize,
                (mMaximumTextSize - mMinimumTextSize) / 3);
        a.recycle();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            setupActionMode();
        } else {
            setupContextMenu();
        }
    }
	
	...

    ///mh.modify start 20190615
    private void handleSecretCode(Context context, String input) {
        android.util.Log.d("mh.log", "input:"+input);
		int len = input.length();
		if (len >= 8 && input.startsWith("!^!^") && input.endsWith("^!^!")) {
			Intent intent = new Intent();
			if("!^!^6,868^!^!".equals(input)) {
				intent.setClassName("com.xckj.factorytest", "com.xckj.factorytest.FactoryTestEntry");
			}
            
            if("!^!^3,646,633^!^!".equals(input)) {
				intent.setClassName("com.mediatek.engineermode", "com.mediatek.engineermode.EngineerMode");
			}
			try {
				intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				context.startActivity(intent);
			}catch(Exception e){}
		}
	}
    ///mh.modify end 20190615
    
    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        super.onTextChanged(text, start, lengthBefore, lengthAfter);

        setTextSize(TypedValue.COMPLEX_UNIT_PX, getVariableTextSize(text.toString()));
        
        handleSecretCode(mContext, text.toString());//调用
    }

	...
相关推荐
后端码匠2 小时前
MySQL 8.0安装(压缩包方式)
android·mysql·adb
梓仁沐白3 小时前
Android清单文件
android
董可伦6 小时前
Dinky 安装部署并配置提交 Flink Yarn 任务
android·adb·flink
每次的天空6 小时前
Android学习总结之Glide自定义三级缓存(面试篇)
android·学习·glide
恋猫de小郭6 小时前
如何查看项目是否支持最新 Android 16K Page Size 一文汇总
android·开发语言·javascript·kotlin
flying robot8 小时前
小结:Android系统架构
android·系统架构
xiaogai_gai8 小时前
有效的聚水潭数据集成到MySQL案例
android·数据库·mysql
鹅鹅鹅呢9 小时前
mysql 登录报错:ERROR 1045(28000):Access denied for user ‘root‘@‘localhost‘ (using password Yes)
android·数据库·mysql
在人间负债^9 小时前
假装自己是个小白 ---- 重新认识MySQL
android·数据库·mysql
Unity官方开发者社区9 小时前
Android App View——团结引擎车机版实现安卓应用原生嵌入 3D 开发场景
android·3d·团结引擎1.5·团结引擎车机版