安卓随机密码生成应用如何将生成的密码上传至Firebase实时数据库
实现方案
上传逻辑放置位置
你需要把Firebase上传代码放在密码生成成功后的非空判断分支内,也就是onClick方法里pass.isEmpty()为false对应的else代码块中,此时密码已经生成完成,满足上传条件。
完整修改后的代码
import androidx.appcompat.app.AppCompatActivity; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; import java.util.Random; // 新增Firebase导入 import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.DatabaseReference; public class MainActivity extends AppCompatActivity { Button button; TextView textView; CheckBox num; CheckBox upper; CheckBox lower; CheckBox sym; EditText max_lenght; // 新增Firebase数据库实例声明 FirebaseDatabase db; DatabaseReference dbRef; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 移除原有重复的findViewById冗余代码 button = findViewById(R.id.button5); textView = findViewById(R.id.textView2); num = findViewById(R.id.num); upper = findViewById(R.id.upper) ; lower = findViewById(R.id.lower) ; sym = findViewById(R.id.sym) ; max_lenght = findViewById(R.id.editTextNumberSigned); // 初始化Firebase数据库实例,指向存储密码的节点 db = FirebaseDatabase.getInstance(); dbRef = db.getReference("generated_passwords"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View pas) { String pass = randompassword(Integer.parseInt(max_lenght.getText().toString()),upper.isChecked(),lower.isChecked(),num.isChecked(),sym.isChecked()); if (pass.isEmpty()){ Toast.makeText(getApplicationContext(),"请输入有效参数",Toast.LENGTH_SHORT).show(); } else { // 原有复制到剪贴板逻辑 ClipboardManager clipboardManager = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE); ClipData clipData = ClipData.newPlainText("Veri",pass); clipboardManager.setPrimaryClip(clipData); // 新增Firebase上传逻辑,push方法生成唯一键避免密码覆盖 String uploadKey = dbRef.push().getKey(); dbRef.child(uploadKey).setValue(pass).addOnCompleteListener(task -> { if(task.isSuccessful()){ Toast.makeText(getApplicationContext(),"密码生成并上传成功",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(getApplicationContext(),"上传失败:"+task.getException().getMessage(),Toast.LENGTH_LONG).show(); } }); } textView.setText(pass); } }); } private static String randompassword(int max_lenght, boolean upperCase, boolean lowerCase, boolean numbers, boolean specialCharacters) { String upperCaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; String lowerCaseChars = "abcdefghijklmnopqrstuvwxyz"; String numberChars = "0123456789"; String specialChars = "!@#$%^&*()_-+=<>?/{}~|"; String allowedChars = ""; Random rn = new Random(); StringBuilder sb = new StringBuilder(max_lenght); if (upperCase){ allowedChars+=upperCaseChars; sb.append(upperCaseChars.charAt(rn.nextInt(upperCaseChars.length()-1))); } if(lowerCase){ allowedChars+=lowerCaseChars; sb.append(lowerCaseChars.charAt(rn.nextInt(lowerCaseChars.length()-1))); } if (numbers){ allowedChars+=numberChars; sb.append(numberChars.charAt(rn.nextInt(numberChars.length()-1))); } if (specialCharacters){ allowedChars+=specialChars; sb.append(specialChars.charAt(rn.nextInt(specialChars.length()-1))); } if(allowedChars.isEmpty()){ return ""; } sb.append(allowedChars.charAt(rn.nextInt(allowedChars.length()-1))); for(int i=sb.length();i < max_lenght; ++i){ sb.append(allowedChars.charAt(rn.nextInt(allowedChars.length()))); } return sb.toString(); } }
注意事项
- 测试阶段可临时将Firebase实时数据库的安全规则设置为允许读写,正式上线前必须添加用户身份验证逻辑,修改为仅授权用户可读写的规则,避免数据泄露。
- 若仍上传失败,可检查控制台报错信息,确认包名、签名、google-services.json配置是否正确。
内容的提问来源于stack exchange,提问作者Murat Bektaş
相关产品推荐
相关产品推荐

