任务
插入usb的时候需输入密码才能连接PC,并且可以重置密码
思考
需要创建一个Dialog弹窗进行验证。然后创建一个系统变量存储密码,为了防止忘记密码设置一个开发者密码(不可重置)。
过程
① 在 android\frameworks\base\core\java\android\provider\Settings.java 文件下创建系统变量,在System类中填写所需的系统变量
② 寻找目标代码文件,以任务为例,在此文件下是显示usb连接的界面
③ 在上述文件中(UsbDetailsFragment.class)添加创建的系统变量
因为添加的新变量是在下图路径的方法里,所以在此java文件中使用该变量,需要导入变量
④ 在此类中定义变量
⑤ 定义usb连接密码验证方法、修改密码前验证密码方法、重置密码方法
//usb连接密码验证方法
public void UsbConnectionCheck(){
final EditText editText = new EditText(mContext);
//明文输入
editText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
//密文输入
// editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
AlertDialog.Builder inputDialog = new AlertDialog.Builder(mContext).setCancelable(false);
inputDialog.setTitle("Please enter password").setView(editText);
inputDialog.setPositiveButton("True",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToastShort(editText.getText().toString());
if(editText.getText().toString().equals(usb_password) || editText.getText().toString().equals("aaa123")){
dialog.dismiss();
}else{
finish();
}
}
}).setNeutralButton("Reset",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
checkPwd();
}
}).show();
}
//重置密码方法
private void resetPassword(){
final EditText editText = new EditText(mContext);
AlertDialog.Builder inputDialog = new AlertDialog.Builder(mContext).setCancelable(false);
inputDialog.setTitle("Please enter new password");
inputDialog.setView(editText);
inputDialog.setPositiveButton("Reset",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(editText.getText().toString().equals("")){
showToastShort(editText.getText().toString());
resetPassword();
}else{
Settings.System.putString(mContext.getContentResolver(),USB_PASSWORD,editText.getText().toString());
finish();
}
}
}).show();
}
//修改密码前验证密码方法
private void checkPwd(){
final EditText editText = new EditText(mContext);
AlertDialog.Builder inputDialog = new AlertDialog.Builder(mContext).setCancelable(false);
inputDialog.setTitle("Please enter original password");
inputDialog.setView(editText);
inputDialog.setPositiveButton("True",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showToastShort(editText.getText().toString());
if(editText.getText().toString().equals(usb_password) || editText.getText().toString().equals("aaa123")){
resetPassword();
}else{
dialog.dismiss();
}
}
}).setNeutralButton("back",new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
UsbConnectionCheck();
}
}).show();
}
//提示框默认显示
private void showToastShort(String str){
if(str.equals(usb_password) || str.equals("aaa123")){
Toast.makeText(mContext, "Correct password", Toast.LENGTH_SHORT).show();
}else if (str.equals("")){
Toast.makeText(mContext, "Password cannot be empty", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(mContext, "Password error", Toast.LENGTH_SHORT).show();
}
}
⑥ 在onViewCreated()方法下初始化密码值,并且调用 UsbConnectionCheck() 方法
//此方法一打开界面就会运行
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Utils.setActionBarShadowAnimation(getActivity(), getSettingsLifecycle(), getListView());
usb_password = Settings.System.getString(mContext.getContentResolver(),USB_PASSWORD);
//设置初始化密码
if(usb_password==null){
Settings.System.putString(mContext.getContentResolver(),USB_PASSWORD,"123456");
usb_password = "123456";
}
UsbConnectionCheck();
}
⑦导入所需的包
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.content.DialogInterface;
import android.os.Bundle;
import android.provider.Settings;
//密文输入
import android.text.method.PasswordTransformationMethod;
//明文输入
import android.text.InputType;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
运行效果
注意:
- 编写Alertdialog需要设置外部不可点击(setCancelable(false)),不然dialog就无效。
- 结束dialog需要使用 finish() 方法
- 重置密码为空时的判断
- 增加了系统变量需要使用 make update-api 命令进行编译
- Settings.System.getString(mContext.getContentResolver(),USB_PASSWORD);此方法为取创建变量的值
- Settings.System.putString(mContext.getContentResolver(),USB_PASSWORD,editText.getText().toString()); 此方法为修改创建变量的值