📅  最后修改于: 2020-10-11 05:54:29             🧑  作者: Mango
在本教程中,我们将使用Volley库和JSON创建基本的用户注册和登录模块。 Volley是一个HTTP库,它为我们的应用程序提供了网络连接功能。
使用Volley库的优点如下:
对于服务器端数据处理,我们使用带有XAMPP服务器的PHP和MySQL进行数据处理。
在创建Android应用程序模块之前,让我们首先创建服务器端数据处理API代码,以便在PHP和MySQL中进行注册和登录。
1.创建一个名称为registerlogin和表users的数据库,其中包含以下字段。
2.在C:\ xampp \ htdocs \ androidphpmysql目录下,使用PHP和数据库编写以下连接建立代码。
在androidphpmysql(您的项目位置)目录中,创建一个connection.php文件并编写以下代码。
connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>
3.在androidphpmysql目录中创建一个registrationapi.php文件,并编写以下代码。该文件处理来自Android应用程序的请求,并以JSON数组的形式生成对Android应用程序的响应。
prepare("SELECT id FROM users WHERE username = ? OR email = ?");
$stmt->bind_param("ss", $username, $email);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows > 0){
$response['error'] = true;
$response['message'] = 'User already registered';
$stmt->close();
}
else{
$stmt = $conn->prepare("INSERT INTO users (username, email, password, gender) VALUES (?, ?, ?, ?)");
$stmt->bind_param("ssss", $username, $email, $password, $gender);
if($stmt->execute()){
$stmt = $conn->prepare("SELECT id, id, username, email, gender FROM users WHERE username = ?");
$stmt->bind_param("s",$username);
$stmt->execute();
$stmt->bind_result($userid, $id, $username, $email, $gender);
$stmt->fetch();
$user = array(
'id'=>$id,
'username'=>$username,
'email'=>$email,
'gender'=>$gender
);
$stmt->close();
$response['error'] = false;
$response['message'] = 'User registered successfully';
$response['user'] = $user;
}
}
}
else{
$response['error'] = true;
$response['message'] = 'required parameters are not available';
}
break;
case 'login':
if(isTheseParametersAvailable(array('username', 'password'))){
$username = $_POST['username'];
$password = md5($_POST['password']);
$stmt = $conn->prepare("SELECT id, username, email, gender FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss",$username, $password);
$stmt->execute();
$stmt->store_result();
if($stmt->num_rows > 0){
$stmt->bind_result($id, $username, $email, $gender);
$stmt->fetch();
$user = array(
'id'=>$id,
'username'=>$username,
'email'=>$email,
'gender'=>$gender
);
$response['error'] = false;
$response['message'] = 'Login successfull';
$response['user'] = $user;
}
else{
$response['error'] = false;
$response['message'] = 'Invalid username or password';
}
}
break;
default:
$response['error'] = true;
$response['message'] = 'Invalid Operation Called';
}
}
else{
$response['error'] = true;
$response['message'] = 'Invalid API Call';
}
echo json_encode($response);
function isTheseParametersAvailable($params){
foreach($params as $param){
if(!isset($_POST[$param])){
return false;
}
}
return true;
}
?>
要检查您的PHP API是否正常运行,可以使用REST客户端(例如Postman工具)。
要检查API的注册代码,可以使用参数传递注册URL。
同样,您可以通过传递带有有效参数的登录URL来检查登录操作。
现在,在Android应用程序中,我们将创建三个活动类用于用户注册,用户登录并在主要活动中显示用户详细信息(作为配置文件)。
在布局中创建一个activity_main.xml并添加以下代码。此活动用于将用户的详细信息显示为配置文件。
现在,使用以下代码在布局目录中创建一个activity_login.xml文件。此活动用于用户登录UI。
使用以下代码在布局目录中创建一个activity_register.xml文件。此活动用于用户注册UI。
在build.gradle文件中添加volley库依赖项。
implementation 'com.android.volley:volley:1.0.0'
使用以下代码创建一个名为User.java的数据模型类。
package example.javatpoint.com.volleyregistrationloginsystem;
public class User {
private int id;
private String name, email, gender;
public User(int id, String name, String email, String gender) {
this.id = id;
this.email = email;
this.gender = gender;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
我们需要定义调用服务器端API的URL。
创建一个URLs.java类并定义URL。
package example.javatpoint.com.volleyregistrationloginsystem;
public class URLs {
private static final String ROOT_URL = "http://192.168.1.35/androidphpmysql/registrationapi.php?apicall=";
public static final String URL_REGISTER = ROOT_URL + "signup";
public static final String URL_LOGIN= ROOT_URL + "login";
}
package example.javatpoint.com.volleyregistrationloginsystem;
import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
public class VolleySingleton {
private static VolleySingleton mInstance;
private RequestQueue mRequestQueue;
private static Context mCtx;
private VolleySingleton(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
}
public static synchronized VolleySingleton getInstance(Context context) {
if (mInstance == null) {
mInstance = new VolleySingleton(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public void addToRequestQueue(Request req) {
getRequestQueue().add(req);
}
}
创建一个名为SharedPreferences.java的类。在此类中,我们使用SharedPreferences类存储用户详细信息。 SharedPreferences类包含具有以下功能的四个方法:
package example.javatpoint.com.volleyregistrationloginsystem;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class SharedPrefManager {
private static final String SHARED_PREF_NAME = "volleyregisterlogin";
private static final String KEY_USERNAME = "keyusername";
private static final String KEY_EMAIL = "keyemail";
private static final String KEY_GENDER = "keygender";
private static final String KEY_ID = "keyid";
private static SharedPrefManager mInstance;
private static Context ctx;
private SharedPrefManager(Context context) {
ctx = context;
}
public static synchronized SharedPrefManager getInstance(Context context) {
if (mInstance == null) {
mInstance = new SharedPrefManager(context);
}
return mInstance;
}
//this method will store the user data in shared preferences
public void userLogin(User user) {
SharedPreferences sharedPreferences = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(KEY_ID, user.getId());
editor.putString(KEY_USERNAME, user.getName());
editor.putString(KEY_EMAIL, user.getEmail());
editor.putString(KEY_GENDER, user.getGender());
editor.apply();
}
//this method will checker whether user is already logged in or not
public boolean isLoggedIn() {
SharedPreferences sharedPreferences = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
return sharedPreferences.getString(KEY_USERNAME, null) != null;
}
//this method will give the logged in user
public User getUser() {
SharedPreferences sharedPreferences = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
return new User(
sharedPreferences.getInt(KEY_ID, -1),
sharedPreferences.getString(KEY_USERNAME, null),
sharedPreferences.getString(KEY_EMAIL, null),
sharedPreferences.getString(KEY_GENDER, null)
);
}
//this method will logout the user
public void logout() {
SharedPreferences sharedPreferences = ctx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear();
editor.apply();
ctx.startActivity(new Intent(ctx, LoginActivity.class));
}
}
现在,在MainActivity.java类中,如果用户已登录,我们将显示用户信息,否则,它将重定向到LoginActivity.java类。单击按钮时,将使用onClick()方法注销用户。
package example.javatpoint.com.volleyregistrationloginsystem;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
TextView id,userName,userEmail,gender;
Button btnLogout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(SharedPrefManager.getInstance(this).isLoggedIn()){
id = findViewById(R.id.textViewId);
userName = findViewById(R.id.textViewUsername);
userEmail = findViewById(R.id.textViewEmail);
gender = findViewById(R.id.textViewGender);
btnLogout = findViewById(R.id.buttonLogout);
User user = SharedPrefManager.getInstance(this).getUser();
id.setText(String.valueOf(user.getId()));
userEmail.setText(user.getEmail());
gender.setText(user.getGender());
userName.setText(user.getName());
btnLogout.setOnClickListener(this);
}
else{
Intent intent = new Intent(MainActivity.this,LoginActivity.class);
startActivity(intent);
finish();
}
}
public void onClick(View view){
if(view.equals(btnLogout)){
SharedPrefManager.getInstance(getApplicationContext()).logout();
}
}
}
在LoginActivity.java类中,我们检查用户是否已经登录,如果为true,则重定向到MainActivity.java类,否则,允许用户登录。
Volley库的StringRequest类用于网络模块。 StringReuest类的对象采用请求方法类型,URL和响应的参数。
package example.javatpoint.com.volleyregistrationloginsystem;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class LoginActivity extends AppCompatActivity {
EditText etName, etPassword;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
if (SharedPrefManager.getInstance(this).isLoggedIn()) {
finish();
startActivity(new Intent(this, MainActivity.class));
}
progressBar = findViewById(R.id.progressBar);
etName = findViewById(R.id.etUserName);
etPassword = findViewById(R.id.etUserPassword);
//calling the method userLogin() for login the user
findViewById(R.id.btnLogin).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
userLogin();
}
});
//if user presses on textview not register calling RegisterActivity
findViewById(R.id.tvRegister).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
startActivity(new Intent(getApplicationContext(), RegisterActivity.class));
}
});
}
private void userLogin() {
//first getting the values
final String username = etName.getText().toString();
final String password = etPassword.getText().toString();
//validating inputs
if (TextUtils.isEmpty(username)) {
etName.setError("Please enter your username");
etName.requestFocus();
return;
}
if (TextUtils.isEmpty(password)) {
etPassword.setError("Please enter your password");
etPassword.requestFocus();
return;
}
//if everything is fine
StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_LOGIN,
new Response.Listener() {
@Override
public void onResponse(String response) {
progressBar.setVisibility(View.GONE);
try {
//converting response to json object
JSONObject obj = new JSONObject(response);
//if no error in response
if (!obj.getBoolean("error")) {
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
//getting the user from the response
JSONObject userJson = obj.getJSONObject("user");
//creating a new user object
User user = new User(
userJson.getInt("id"),
userJson.getString("username"),
userJson.getString("email"),
userJson.getString("gender")
);
//storing the user in shared preferences
SharedPrefManager.getInstance(getApplicationContext()).userLogin(user);
//starting the profile activity
finish();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
} else {
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
})
{
@Override
protected Map getParams() throws AuthFailureError {
Map params = new HashMap<>();
params.put("username", username);
params.put("password", password);
return params;
}
};
VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);
}
}
RegisterActivity.java类用于注册用户。此类最初检查用户登录是否正确,然后重定向到MainActivity.java类,否则,允许用户注册。
与LoginActivity.java类类似,我们使用Volley库的StringRequest类进行网络连接,并传递类型请求方法,URL和响应的参数。 Response.Listener
package example.javatpoint.com.volleyregistrationloginsystem;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class RegisterActivity extends AppCompatActivity {
EditText editTextUsername, editTextEmail, editTextPassword;
RadioGroup radioGroupGender;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
progressBar = findViewById(R.id.progressBar);
//if the user is already logged in we will directly start the MainActivity (profile) activity
if (SharedPrefManager.getInstance(this).isLoggedIn()) {
finish();
startActivity(new Intent(this, MainActivity.class));
return;
}
editTextUsername = findViewById(R.id.editTextUsername);
editTextEmail = findViewById(R.id.editTextEmail);
editTextPassword = findViewById(R.id.editTextPassword);
radioGroupGender = findViewById(R.id.radioGender);
findViewById(R.id.buttonRegister).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//if user pressed on button register
//here we will register the user to server
registerUser();
}
});
findViewById(R.id.textViewLogin).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//if user pressed on textview that already register open LoginActivity
finish();
startActivity(new Intent(RegisterActivity.this, LoginActivity.class));
}
});
}
private void registerUser() {
final String username = editTextUsername.getText().toString().trim();
final String email = editTextEmail.getText().toString().trim();
final String password = editTextPassword.getText().toString().trim();
final String gender = ((RadioButton) findViewById(radioGroupGender.getCheckedRadioButtonId())).getText().toString();
//first we will do the validations
if (TextUtils.isEmpty(username)) {
editTextUsername.setError("Please enter username");
editTextUsername.requestFocus();
return;
}
if (TextUtils.isEmpty(email)) {
editTextEmail.setError("Please enter your email");
editTextEmail.requestFocus();
return;
}
if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
editTextEmail.setError("Enter a valid email");
editTextEmail.requestFocus();
return;
}
if (TextUtils.isEmpty(password)) {
editTextPassword.setError("Enter a password");
editTextPassword.requestFocus();
return;
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, URLs.URL_REGISTER,
new Response.Listener() {
@Override
public void onResponse(String response) {
progressBar.setVisibility(View.GONE);
try {
//converting response to json object
JSONObject obj = new JSONObject(response);
//if no error in response
if (!obj.getBoolean("error")) {
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
//getting the user from the response
JSONObject userJson = obj.getJSONObject("user");
//creating a new user object
User user = new User(
userJson.getInt("id"),
userJson.getString("username"),
userJson.getString("email"),
userJson.getString("gender")
);
//storing the user in shared preferences
SharedPrefManager.getInstance(getApplicationContext()).userLogin(user);
//starting the profile activity
finish();
startActivity(new Intent(getApplicationContext(), MainActivity.class));
} else {
Toast.makeText(getApplicationContext(), obj.getString("message"), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map getParams() throws AuthFailureError {
Map params = new HashMap<>();
params.put("username", username);
params.put("email", email);
params.put("password", password);
params.put("gender", gender);
return params;
}
};
VolleySingleton.getInstance(this).addToRequestQueue(stringRequest);
}
}
在AndroidManifest.xml文件中添加以下权限
输出: