android12 给设置里面的按钮增加密码

实现目标:给设置里面的按钮加入密码,只有输入密码才能才能跳转,列如给关于平板电脑按钮增加密码选择,点击关于平板电脑后需要输入密码才能看到里面的内容,我是自己在设置里面新增了一个选项 无标题。

1、在packages/apps/Settings/res/xml/top_level_settings.xml中新增如下:

    <com.android.settings.widget.HomepagePreference
        android:fragment="com.android.settings.myceshi.MySettingsCeshi"
        android:icon="@drawable/ic_help"
        android:key="top_level_my_setting"
        android:order="40"
        android:title="无标题"
        android:summary="无标题"/>

 

2、在packages/apps/Settings/src/com/android/settings下新建一个文件夹名为myceshi,这个myceshi文件夹下创建一个MySettingsCeshi.java类

package com.android.settings.myceshi;

import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.os.Handler;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.Gravity;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.SwitchPreference;

import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
import android.widget.Toast;
import android.app.Dialog;

@SearchIndexable
public class MySettingsCeshi extends DashboardFragment implements Preference.OnPreferenceClickListener,Preference.OnPreferenceChangeListener{
    
    private static final String TAG = "mysettingsceshi";
    private Toast mDevHitToast;
    private SwitchPreference mShow;

     @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        mDevHitToast = null;

        mShow = (SwitchPreference) findPreference("myFunction2");
        mShow.setOnPreferenceChangeListener(this);
        Preference mPreference = findPreference("myFunction1");
        mPreference.setOnPreferenceClickListener(this);
    }

    @Override
    public boolean onPreferenceClick(Preference preference) {
        Log.e("onPreferenceClick","走了点击时间2");
        Toast.makeText(getActivity(), "Preference Clicked", Toast.LENGTH_SHORT).show();
        return true;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        boolean show = (boolean)newValue;
        if(show==true){
            Toast.makeText(getActivity(), "已打开", Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(getActivity(), "已关闭", Toast.LENGTH_SHORT).show();
        }
         return true;
    }

    @Override
    protected String getLogTag() {
        return TAG;
    }

    @Override
    protected int getPreferenceScreenResId() {
        return R.xml.my_settings_ceshi;
    }

    @Override
    public int getMetricsCategory() {
        return 5;
    }

    /**
     * For Search.
     */
    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
            new BaseSearchIndexProvider(R.xml.my_settings_ceshi);

}

3、在packages/apps/Settings/res/xml下创建给MySettingsCeshi.java用的界面,代码如下

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="展示内容">

        <Preference
            android:key="myFunction1"
            android:order="44"
            android:title="功能其一"
            android:summary="功能其一"/>

        <SwitchPreference
            android:key="myFunction2"
            android:order="45"
            android:title="功能其二"
            android:summary="功能其二"/>

        <com.android.settings.myceshi.PrivateDialogPreference
            android:key="myFunction3"
            android:order="46"
            android:title="功能其三"
            android:summary="功能其三"
            android:dialogLayout="@layout/my_dialog"/>

        <com.android.settings.myceshi.PrivateDialogPreference2
            android:key="myFunction4"
            android:order="47"
            android:title="功能其四"
            android:summary="功能其四"
            android:dialogLayout="@layout/my_dialog2"/>

        <com.android.settings.myceshi.PrivateDialogPreference3
            android:key="myFunction5"
            android:order="48"
            android:title="网络黑名单"
            android:summary="以太网络控制"
            android:dialogLayout="@layout/my_dialog3"/>

        <com.android.settings.myceshi.PrivateDialogPreference4
            android:key="myFunction6"
            android:order="49"
            android:title="软件黑名单"
            android:summary="软件安装控制"
            android:dialogLayout="@layout/my_dialog4"/>

    </PreferenceScreen>

4、在SettingsActivity.java中实现密码判断,现在密码是写死的,首先加入依赖

import android.app.AlertDialog;
import android.widget.EditText;
import android.content.DialogInterface;
import android.view.WindowManager;
import android.widget.Toast;

4-1、实现弹窗方法

private static AlertDialog.Builder builder;
    private static AlertDialog alert;
    //弹窗执行方法
    public void tanchuang(String initialFragmentName, Intent intent){
            // 创建弹窗
            builder = new AlertDialog.Builder(this);
            final EditText input = new EditText(this);
            builder.setMessage("请输入密码")
                   .setTitle("危险")
                   .setView(input)
                   //设置点击外部是否关闭弹窗
                   .setCancelable(true)
                   .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // 用户选择重启,不做任何操作,允许关闭继续
                            // mContext.sendBroadcast(rebootIntent);
                             String inputString = input.getText().toString();
                             if(inputString.equals("123456")){
                                 setTitleFromIntent(intent);
                                 Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
                                 switchToFragment(initialFragmentName, initialArguments, true,mInitialTitleResId, mInitialTitle);
                             }else{
                                 Toast.makeText(SettingsActivity.this, "密码错误", Toast.LENGTH_SHORT).show();
                                 mInitialTitleResId = R.string.dashboard_title;
                                 switchToFragment(TopLevelSettings.class.getName(), null /* args */, false,
                                 mInitialTitleResId, mInitialTitle);
                             }
                             
                        }
                    })
                   .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            // 取消关闭,需要通过反射机制取消关闭
                            try {
                                // 反射方法参数为空,无返回值
                                // Method cancelMethod = intent.getClass().getDeclaredMethod("cancel");
                                // cancelMethod.setAccessible(true);
                                // cancelMethod.invoke(intent);
                                // istanchuang =  false;
                                mInitialTitleResId = R.string.dashboard_title;
                                switchToFragment(TopLevelSettings.class.getName(), null /* args */, false,
                                mInitialTitleResId, mInitialTitle);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
            alert = builder.create();
            alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
            alert.show();
    }

4-2、最后需要在launchSettingFragment()方法内调用,其次还需要判断是否点击到我需要设置密码选项,代码如下:

if(initialFragmentName.equals("com.android.settings.myceshi.MySettingsCeshi")){
                tanchuang(initialFragmentName,intent);
            }else{
                setTitleFromIntent(intent);

                Bundle initialArguments = intent.getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
                switchToFragment(initialFragmentName, initialArguments, true,
                    mInitialTitleResId, mInitialTitle);
            }

大致流程就是这样了 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值