如何在我的 android 应用中实现重设密码功能?
How to implement a reset password feature in my android app?
我一直在开发一个应用程序,我想在其中实现密码重置。我现在已经创建了代码,但它似乎没有用。情况如下:当我单击 "Change Password" 按钮时,应用程序崩溃并重新启动。我在 Logcat.
有一个 NPE
ResetPasswordActivity.Java
package org.cvsuimus.theflare;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.kosalgeek.android.md5simply.MD5;
import com.kosalgeek.genasync12.AsyncResponse;
import com.kosalgeek.genasync12.ExceptionHandler;
import com.kosalgeek.genasync12.PostResponseAsyncTask;
import java.util.HashMap;
import static org.cvsuimus.theflare.StartupActivity.PREFS_NAME;
public class ResetPasswordActivity extends AppCompatActivity implements View.OnClickListener {
final String TAG = "ResetPasswordActivity";
EditText newPass, confirmPass;
TextView studentNumber;
Button btnChangePassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reset_password);
studentNumber = (TextView) findViewById(R.id.resetStudNum);
newPass = (EditText) findViewById(R.id.etNewPass);
confirmPass = (EditText) findViewById(R.id.etConfirmPassword);
btnChangePassword = (Button)findViewById(R.id.btn_ChangePassword);
btnChangePassword.setOnClickListener(this);
SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
String studNumString = pref.getString("studentNumber", "");
studentNumber.setText(String.valueOf(studNumString));
}
private boolean emptyValidate(EditText newPass, EditText confirmPass){
String newPassString = newPass.getText().toString();
String confirmPassString = confirmPass.getText().toString();
return (newPassString.isEmpty() && confirmPassString.isEmpty());
}
private boolean isNetworkAvailable()
{
final ConnectivityManager connectivityManager = ((ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE));
return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}
private boolean passwordLengthValidate(EditText newPass){
String password = newPass.getText().toString();
return (password.length() >= 6);
}
String newPassString = "";
String studentNumString = "";
@Override
public void onClick(View v) {
if (!emptyValidate(newPass, confirmPass)) {
if(passwordLengthValidate(newPass)) {
if (isNetworkAvailable()) {
newPassString = MD5.encrypt(newPass.getText().toString());
studentNumString = studentNumber.getText().toString();
HashMap<String, String> changePassData = new HashMap<>();
changePassData.put("studentNumber", studentNumString);
changePassData.put("newPass", newPassString);
PostResponseAsyncTask changePasswordTask = new PostResponseAsyncTask(this, changePassData, new AsyncResponse() {
@Override
public void processFinish(String s) {
Log.d(TAG, s);
if (s.contains("ChangePasswordSuccess")) {
Intent in = new Intent(getApplicationContext(), MainPageActivity.class);
startActivity(in);
} else { // else there is error in changing password
Toast.makeText(getApplicationContext(), "Something went wrong. Cannot change update password.", Toast.LENGTH_LONG).show();
}
}
});
changePasswordTask.setExceptionHandler(new ExceptionHandler() {
@Override
public void handleException(Exception e) {
if (e != null && e.getMessage() != null) {
Log.d(TAG, e.getMessage());
}
}
});
changePasswordTask.execute("http://192.168.0.31/theflare/app/changepassword.php");
}
else { // if device can't connect to the internet
Toast.makeText(getApplicationContext(), "Cannot connect to the server!", Toast.LENGTH_LONG).show();
}
}
else { // if etPassword > 7
Toast.makeText(getApplicationContext(), "Password must be 6 characters and above!", Toast.LENGTH_LONG).show();
}
}
else { // if fields are empty
Toast.makeText(getApplicationContext(), "Please fill up all fields!", Toast.LENGTH_LONG);
}
}
}
activity_reset_password.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
tools:context="org.cvsuimus.theflare.ResetPasswordActivity">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp">
<TextView
android:id="@+id/textView6"
android:layout_width="368dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:text="@string/reset_header"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textColor="@color/primaryTextColor"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView7"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:text="@string/reset_studNum"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView6" />
<TextView
android:id="@+id/resetStudNum"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintLeft_toRightOf="@+id/textView7"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView6" />
<TextView
android:id="@+id/textView9"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="15dp"
android:text="@string/enter_password"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView7" />
<EditText
android:id="@+id/etNewPass"
android:layout_width="255dp"
android:layout_height="44dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="15dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/textView9"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/resetStudNum" />
<TextView
android:id="@+id/textView14"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/confirm_password"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView9" />
<EditText
android:id="@+id/etConfirmPass"
android:layout_width="252dp"
android:layout_height="67dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintLeft_toRightOf="@+id/textView14"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etNewPass" />
<Button
android:id="@+id/btn_ChangePassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="24dp"
android:background="@color/primaryColor"
android:text="@string/btn_changepw"
android:textAppearance="@style/TextAppearance.AppCompat.Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etConfirmPass"
app:layout_constraintVertical_bias="1.0" />
</android.support.constraint.ConstraintLayout>
</ScrollView>
changepassword.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
if(isset($_POST['newPass']) && !empty(isset($_POST['newPass']))
&& isset($_POST['confirmPass']) && !empty(isset($_POST['confirmPass']))){
include_once("../connection.php");
$studentNumber = $_POST['studentNumber'];
$newPass = $_POST['newPass'];
$sql = "UPDATE users SET password='$newPass' where studentNumber='$studentNumber'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "ChangePasswordSuccess";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}?>
Logcat
FATAL EXCEPTION: main Process: org.cvsuimus.theflare, PID: 31500
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at org.cvsuimus.theflare.ResetPasswordActivity.emptyValidate(ResetPasswordActivity.java:51)
at org.cvsuimus.theflare.ResetPasswordActivity.onClick(ResetPasswordActivity.java:69)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
我找到问题了。它在这一行:
confirmPass = (EditText) findViewById(R.id.etConfirmPassword);
原来 EditText
的 id
是 android:id="@+id/etConfirmPass"
。所以我不得不把它改成confirmPass = (EditText) findViewById(R.id.etConfirmPass);
。该按钮现在可以单击了。我唯一的问题是它并没有真正根据 SharedPreferences studentNumber
更改密码。尽管如此,感谢所有帮助过的人!
我一直在开发一个应用程序,我想在其中实现密码重置。我现在已经创建了代码,但它似乎没有用。情况如下:当我单击 "Change Password" 按钮时,应用程序崩溃并重新启动。我在 Logcat.
有一个 NPEResetPasswordActivity.Java
package org.cvsuimus.theflare;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.kosalgeek.android.md5simply.MD5;
import com.kosalgeek.genasync12.AsyncResponse;
import com.kosalgeek.genasync12.ExceptionHandler;
import com.kosalgeek.genasync12.PostResponseAsyncTask;
import java.util.HashMap;
import static org.cvsuimus.theflare.StartupActivity.PREFS_NAME;
public class ResetPasswordActivity extends AppCompatActivity implements View.OnClickListener {
final String TAG = "ResetPasswordActivity";
EditText newPass, confirmPass;
TextView studentNumber;
Button btnChangePassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reset_password);
studentNumber = (TextView) findViewById(R.id.resetStudNum);
newPass = (EditText) findViewById(R.id.etNewPass);
confirmPass = (EditText) findViewById(R.id.etConfirmPassword);
btnChangePassword = (Button)findViewById(R.id.btn_ChangePassword);
btnChangePassword.setOnClickListener(this);
SharedPreferences pref = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
String studNumString = pref.getString("studentNumber", "");
studentNumber.setText(String.valueOf(studNumString));
}
private boolean emptyValidate(EditText newPass, EditText confirmPass){
String newPassString = newPass.getText().toString();
String confirmPassString = confirmPass.getText().toString();
return (newPassString.isEmpty() && confirmPassString.isEmpty());
}
private boolean isNetworkAvailable()
{
final ConnectivityManager connectivityManager = ((ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE));
return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected();
}
private boolean passwordLengthValidate(EditText newPass){
String password = newPass.getText().toString();
return (password.length() >= 6);
}
String newPassString = "";
String studentNumString = "";
@Override
public void onClick(View v) {
if (!emptyValidate(newPass, confirmPass)) {
if(passwordLengthValidate(newPass)) {
if (isNetworkAvailable()) {
newPassString = MD5.encrypt(newPass.getText().toString());
studentNumString = studentNumber.getText().toString();
HashMap<String, String> changePassData = new HashMap<>();
changePassData.put("studentNumber", studentNumString);
changePassData.put("newPass", newPassString);
PostResponseAsyncTask changePasswordTask = new PostResponseAsyncTask(this, changePassData, new AsyncResponse() {
@Override
public void processFinish(String s) {
Log.d(TAG, s);
if (s.contains("ChangePasswordSuccess")) {
Intent in = new Intent(getApplicationContext(), MainPageActivity.class);
startActivity(in);
} else { // else there is error in changing password
Toast.makeText(getApplicationContext(), "Something went wrong. Cannot change update password.", Toast.LENGTH_LONG).show();
}
}
});
changePasswordTask.setExceptionHandler(new ExceptionHandler() {
@Override
public void handleException(Exception e) {
if (e != null && e.getMessage() != null) {
Log.d(TAG, e.getMessage());
}
}
});
changePasswordTask.execute("http://192.168.0.31/theflare/app/changepassword.php");
}
else { // if device can't connect to the internet
Toast.makeText(getApplicationContext(), "Cannot connect to the server!", Toast.LENGTH_LONG).show();
}
}
else { // if etPassword > 7
Toast.makeText(getApplicationContext(), "Password must be 6 characters and above!", Toast.LENGTH_LONG).show();
}
}
else { // if fields are empty
Toast.makeText(getApplicationContext(), "Please fill up all fields!", Toast.LENGTH_LONG);
}
}
}
activity_reset_password.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
tools:context="org.cvsuimus.theflare.ResetPasswordActivity">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:layout_editor_absoluteX="0dp"
tools:layout_editor_absoluteY="0dp">
<TextView
android:id="@+id/textView6"
android:layout_width="368dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:text="@string/reset_header"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textColor="@color/primaryTextColor"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView7"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:text="@string/reset_studNum"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView6" />
<TextView
android:id="@+id/resetStudNum"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintLeft_toRightOf="@+id/textView7"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView6" />
<TextView
android:id="@+id/textView9"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="15dp"
android:text="@string/enter_password"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView7" />
<EditText
android:id="@+id/etNewPass"
android:layout_width="255dp"
android:layout_height="44dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="15dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toRightOf="@+id/textView9"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/resetStudNum" />
<TextView
android:id="@+id/textView14"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="@string/confirm_password"
android:textColor="@color/primaryTextColor"
android:textSize="18sp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView9" />
<EditText
android:id="@+id/etConfirmPass"
android:layout_width="252dp"
android:layout_height="67dp"
android:layout_marginEnd="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:ems="10"
android:inputType="textPassword"
app:layout_constraintLeft_toRightOf="@+id/textView14"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etNewPass" />
<Button
android:id="@+id/btn_ChangePassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="24dp"
android:background="@color/primaryColor"
android:text="@string/btn_changepw"
android:textAppearance="@style/TextAppearance.AppCompat.Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etConfirmPass"
app:layout_constraintVertical_bias="1.0" />
</android.support.constraint.ConstraintLayout>
</ScrollView>
changepassword.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
if(isset($_POST['newPass']) && !empty(isset($_POST['newPass']))
&& isset($_POST['confirmPass']) && !empty(isset($_POST['confirmPass']))){
include_once("../connection.php");
$studentNumber = $_POST['studentNumber'];
$newPass = $_POST['newPass'];
$sql = "UPDATE users SET password='$newPass' where studentNumber='$studentNumber'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "ChangePasswordSuccess";
}
else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}?>
Logcat
FATAL EXCEPTION: main Process: org.cvsuimus.theflare, PID: 31500
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at org.cvsuimus.theflare.ResetPasswordActivity.emptyValidate(ResetPasswordActivity.java:51)
at org.cvsuimus.theflare.ResetPasswordActivity.onClick(ResetPasswordActivity.java:69)
at android.view.View.performClick(View.java:4848)
at android.view.View$PerformClick.run(View.java:20262)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5631)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
我找到问题了。它在这一行:
confirmPass = (EditText) findViewById(R.id.etConfirmPassword);
原来 EditText
的 id
是 android:id="@+id/etConfirmPass"
。所以我不得不把它改成confirmPass = (EditText) findViewById(R.id.etConfirmPass);
。该按钮现在可以单击了。我唯一的问题是它并没有真正根据 SharedPreferences studentNumber
更改密码。尽管如此,感谢所有帮助过的人!