有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Android创建强大的密码生成器

因此,我正在构建一个应用程序,根据用户的规格生成一个强大的密码。UI的规范部分看起来像this

enter image description here

以下是Main活动的onCreate。java类。我尝试创建一些逻辑,比如当选中某个单选按钮时if语句,以及每当选中复选框时向字符串变量添加允许的字符。视图对象都是全局的,但我不知道如何在用户设置的字符限制内,使用每个允许的字符中的至少一个创建随机字符串

以下是代码:

private static int MAX_LENGTH;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        capitalLetter = (CheckBox) findViewById(R.id.capital_letter);
        lowercaseLetter = (CheckBox) findViewById(R.id.lowercase_letter);
        numbers = (CheckBox) findViewById(R.id.numbers);
        symbols = (CheckBox) findViewById(R.id.symbols);

        passGroup = (RadioGroup) findViewById(R.id.passRadioGroup);

        sizeFour = (RadioButton) findViewById(R.id.size_four);
        sizeEight = (RadioButton) findViewById(R.id.size_eight);
        sizeTwelve = (RadioButton) findViewById(R.id.size_twelve);
        sizeSixteen = (RadioButton) findViewById(R.id.size_sixteen);

        passHint = (EditText) findViewById(R.id.passwordHint);

        passShow = (TextView) findViewById(R.id.passwordDisplay);

        passGenerate = (Button) findViewById(R.id.passwordGenerate);
        passClear = (Button) findViewById(R.id.passwordClear);

        String allowedCharacters = "";

        // Determines the types of characters permitted when a check box is checked.
        if (capitalLetter.isChecked()) {allowedCharacters += "ABCDEFGHIJKLMNOPQRSTUVWXYZ";}
        if (lowercaseLetter.isChecked()) {allowedCharacters += "abcdefghijklmnopqrstuvwxyz";}
        if (numbers.isChecked()) {allowedCharacters += "0123456789";}
        if (symbols.isChecked()) {allowedCharacters += "!@#$%^&*()_-+=<>?/{}~|";}

        //Determines the length of the string based on which radio button the user has selected.
        int checkedRadioButtonId = passGroup.getCheckedRadioButtonId();

        if (checkedRadioButtonId == 1) {MAX_LENGTH = 4;}
        if (checkedRadioButtonId == 2) {MAX_LENGTH = 8;}
        if (checkedRadioButtonId == 3) {MAX_LENGTH = 12;}
        if (checkedRadioButtonId == 4) {MAX_LENGTH = 16;}
    }

共 (2) 个答案

  1. # 1 楼答案

    关于生成随机字符串的基本思想:

    private static final String ALLOWED_CHARACTERS ="0123456789qwertyuiopasdfghjklzxcvbnm";
    
    private static String getRandomString(final int sizeOfPasswordString){
      final Random random=new Random();
      final StringBuilder sb=new StringBuilder(sizeOfPasswordString);
      
      for(int i=0;i<sizeOfRandomString;++i){
          sb.append(ALLOWED_CHARACTERS.charAt(random.nextInt(ALLOWED_CHARACTERS.length())));
        
      }
      return sb.toString();
    }
    
  2. # 2 楼答案

    检查以下答案:

    private static final String NUMBERS = "0123456789";
    private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz";
    private static final String SPECIALCHARACTERS = "@#$%&*";
    CheckBox chkCapital, chkSmall, chkNumber, chkSpec;
    Button btnSUbmit;
    int MAX_CHAR = 0;
    private RadioGroup radioGroup;
    private RadioButton radiobtnm;
    
    private static String getRandomPasswordCharacters(int pos) {
        Random randomNum = new Random();
        StringBuilder randomChar = new StringBuilder();
        switch (pos) {
            case 0:
                randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1)));
                break;
            case 1:
                randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1)));
                break;
            case 2:
                randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1)));
                break;
            case 3:
                randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1)));
                break;
        }
        return randomChar.toString();
    
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        chkCapital = (CheckBox) findViewById(R.id.checkBox1);
        chkSmall = (CheckBox) findViewById(R.id.checkBox2);
        chkNumber = (CheckBox) findViewById(R.id.checkBox3);
        chkSpec = (CheckBox) findViewById(R.id.checkBox4);
    
    
        radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
        btnSUbmit = (Button) findViewById(R.id.btnSUbmit);
    
        btnSUbmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                StringBuilder password = new StringBuilder();
                ArrayList<Integer> passSel = new ArrayList<Integer>();
                int selectedId = radioGroup.getCheckedRadioButtonId();
    
                radiobtnm = (RadioButton) findViewById(selectedId);
    
                MAX_CHAR = Integer.parseInt(radiobtnm.getText().toString());
    
                // when  UPPER CASE selected
                if (chkCapital.isChecked())
                    passSel.add(1);
    
                // when  LOWER CASE selected
                if (chkSmall.isChecked())
                    passSel.add(3);
    
                // when  Number  selected
                if (chkNumber.isChecked())
                    passSel.add(0);
    
                // when  Special selected
                if (chkSpec.isChecked())
                    passSel.add(2);
    
                for (int i = 1; i <= MAX_CHAR; ) {
    
                    if (passSel.contains(0) && i <= MAX_CHAR) {
                        password.append(getRandomPasswordCharacters(0));
                        i++;
                    }
                    if (passSel.contains(1) && i <= MAX_CHAR) {
                        password.append(getRandomPasswordCharacters(1));
                        i++;
                    }
                    if (passSel.contains(2) && i <= MAX_CHAR) {
                        password.append(getRandomPasswordCharacters(2));
                        i++;
                    }
                    if (passSel.contains(3) && i <= MAX_CHAR) {
                        password.append(getRandomPasswordCharacters(3));
                        i++;
                    }
                }
                Log.e("!_@@:your password is :> > ", password + "");
            }
        });
    }