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());//调用
    }

	...
相关推荐
Kapaseker5 分钟前
你知道屏幕上存在多少个 Window 吗
android·kotlin
Android技术之家11 分钟前
Android Studio 专属AI智能体+Skills完整版提示词(可直接复制使用)
android·ide·人工智能·android studio
xiegwei22 分钟前
Android 原生项目添加 Flutter Activity 示例及常见报错解决方案
android·flutter
于慨30 分钟前
Flutter Android gradle 8.14 file lock, incompatibility issue
android·flutter·issue
千百元33 分钟前
HBuildX 打包成apk完整过程
android
流星白龙10 小时前
【MySQL】7.MySQL基本查询(2)
android·mysql·adb
mldlds10 小时前
MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解
android·数据库·mysql
智算菩萨12 小时前
MP3音频编码原理深度解析与Python全参数调优实战:从心理声学模型到LAME编码器精细控制
android·python·音视频
studyForMokey14 小时前
【Android面试】Activity生命周期专题
android·面试·职场和发展
chehaoman14 小时前
MySQL的索引
android·数据库·mysql