使用phpmyadmin数据库在登录Android应用程序中插入用户名和密码时出错



因此,当我尝试插入已经在phpmyadmin数据库中的用户名和密码时,它会得到toast输出,该输出位于onErrorResponse(VolleyError错误(中,当我看到Logcat时,它说

09-30 19:25:34.535 18067-18364/com.example.devarsh.googlemapsbustracker E/Volley: [7269] NetworkDispatcher.processRequest: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at com.example.devarsh.googlemapsbustracker.MainActivity$4.getParams(MainActivity.java:91)
at com.android.volley.Request.getBody(Request.java:464)
at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:275)
at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:249)
at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:94)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:123)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:131)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)
09-30 19:25:34.552 18067-18067/com.example.devarsh.googlemapsbustracker E/MainActivity: com.android.volley.VolleyError: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

我已经尝试在我的 php 脚本中硬核用户名和密码,但它对我不起作用

这是安卓代码:

package com.example.devarsh.googlemapsbustracker;

import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GoogleApiAvailability;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int ERROR_DIALOG_REQUEST = 9001;
private Button btnlogin;
private EditText User_name, Pass_word;
private static String URL_LOGIN = "http://192.168.50.127/Android/login.php";


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnlogin = findViewById(R.id.button2);
User_name =  findViewById(R.id.username);
Pass_word =  findViewById(R.id.password);

btnlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Login();
}
});

isServicesOK();
}
private void Login(){
String URL = "http://192.168.2.8/parul/login.php";
RequestQueue requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
if(response.trim().equals("success")){
Toast.makeText(getApplicationContext(), "Login Successfull", Toast.LENGTH_LONG).show();
Intent intent = new Intent(getApplicationContext(), Selection_Activity.class);
startActivity(intent);
}else{
Toast.makeText(getApplicationContext(), "Login Failed", Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), "Login Unsuccessfull", Toast.LENGTH_LONG).show();
Log.e(TAG, String.valueOf(error));
System.out.println("VolleyError start : " + error + ": End of VolleyError");
}
}) {
@Override
protected Map<String, String> getParams() {
user = User_name.getText().toString().trim();
pass = Pass_word.getText().toString().trim();
Map<String, String> params = new HashMap<>();
params.put("UserName", User_name.getText().toString().trim());
params.put("PassWord", Pass_word.getText().toString().trim());
return params;
}
};
requestQueue.add(stringRequest);
}

public void isServicesOK() {
Log.d(TAG, "isServicesOK: checking google services version");
int available = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);
if(available == ConnectionResult.SUCCESS){
//everything is fine and user can make map request
Log.d(TAG, "isServicesOK: Google Play Services is working");
}
else if(GoogleApiAvailability.getInstance().isUserResolvableError(available)){
//there is an error but we can fix it
Log.d(TAG, "isServicesOK: An error is there but we can fix it");
Dialog dialog = GoogleApiAvailability.getInstance().getErrorDialog(this, available, ERROR_DIALOG_REQUEST);
dialog.show();
}else{
Toast.makeText(this, "We cant make maps request", Toast.LENGTH_SHORT).show();
}
}
}

这是我的 php 脚本,用于从应用程序中获取用户名和密码以检查天气它是否存在于数据库中,此代码适用于使用 Xampp 的本地主机数据库:

<?php
$conn = mysqli_connect("localhost","root","","users");
mysqli_query($conn, "SET NAMES 'utf8'");
$username = "parul";
$password = "parul1998";
$query = 'SELECT id FROM logintb WHERE username = "'.$username.'" and password = "'.$password.'"';
$result = mysqli_query($conn,$query) or die('error: ' .mysql_error());
if(mysqli_num_rows($result) == 1){
echo "success";
}else{
echo "error";
}

?>

以下代码用于使用实时 000 虚拟主机测试应用程序:

<?php
$conn = mysqli_connect("localhost","id7263189_root","dev@1234","id7263189_logintb");
mysqli_query($conn, "SET NAMES 'utf8'");
$username = $_POST["UserName"];
$password = $_POST["PassWord"];
$query = 'SELECT id FROM logintb WHERE username = "'.$username.'" and password = "'.$password.'"';
$result = mysqli_query($conn,$query) or die('error: ' .mysql_error());
if(mysqli_num_rows($result) == 1){
echo "success";
}else{
echo "error";
}

?>

我不知道如何解决调用虚拟方法:

com.android.volley.VolleyError: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

仅供参考,我正在真实设备中对此进行测试。 但是当我在 PHP 文件中硬核用户名和密码并在模拟器中运行该应用程序时,它工作正常,但是当我在真实设备上尝试时,它会显示登录不成功 Toast。

当我尝试在模拟器中运行此应用程序时,它工作正常,没有任何错误,但是当我在真实设备中尝试时,它会显示来自OnerrorResponse(VolleyError错误(的错误,这是登录失败的吐司

我是安卓应用程序开发的新手,所以需要任何可以为我解决这个问题的人的帮助。

我的activity_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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:hardwareAccelerated="true"
android:background="@color/white"
tools:context=".MainActivity">
<View
android:id="@+id/view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:hardwareAccelerated="true" />

<ImageView
android:id="@+id/imageView2"
android:contentDescription="@string/todo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="76dp"
android:background="@color/blend"
app:srcCompat="@drawable/imagelogo" />
<EditText
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="252dp"
android:ems="10"
android:hint="@string/User_name"
android:importantForAutofill="no"
android:inputType="text" />
<EditText
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="186dp"
android:ems="10"
android:hint="@string/Pass_word"
android:importantForAutofill="no"
android:inputType="textPassword" />
<Button
android:id="@+id/button2"
android:layout_width="210dp"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_marginStart="81dp"
android:layout_marginBottom="112dp"
android:background="@color/colorPrimary"
android:text="@string/login" />

</RelativeLayout>

提前致谢

@Override
protected Map<String, String> getParams() {
User_name =  findViewById(R.id.username);
Pass_word =  findViewById(R.id.password);
user = User_name.getText().toString().trim();
pass = Pass_word.getText().toString().trim();
Map<String, String> params = new HashMap<>();
params.put("UserName", user);  // direct use user
params.put("PassWord", pass);  // direct use pass
return params;
}

更新您的getParams方法 在其中找到视图,这不是更好的方法,但为什么不尝试一下。

删除

android:importantForAutofill="no"

android:ems="10"

从编辑文本

com.android.volley.VolleyError: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

发生这种情况是因为您尝试从中获取文本的EditText为空。但有趣的是,你说它适用于模拟器。

我们可以建议的唯一解决方案是使用并从EditText中获取字符串,如下所示:

String user = User_name.getText().toString().trim();
String pass = Pass_word.getText().toString().trim();

Map中声明变量可能会有所帮助。

最新更新