2016-09-28 41 views
1

我已经创建了一个应用程序,该应用程序应该在用户可以登录到应用程序的数据库(mySQL)中注册新用户。我遇到的问题是,当我尝试按下按钮进行登录或注册时,出现无法将java字符串转换为JSONObject的错误。Android注册和登录应用程序错误

LoginActivity.java

package com.loginregister.loginregister; 

import android.content.Intent; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.toolbox.Volley; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class LoginActivity extends AppCompatActivity { 

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

    final EditText etUsername = (EditText) findViewById(R.id.etUsername); 
    final EditText etPassword = (EditText) findViewById(R.id.etPassword); 
    final Button bLogin = (Button) findViewById(R.id.bLogin); 
    final TextView tvRegisterHere = (TextView) findViewById(R.id.tvRegisterHere); 

    tvRegisterHere.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent registerIntent = new Intent(LoginActivity.this, RegisterActivity.class); 
      LoginActivity.this.startActivity(registerIntent); 
     } 
    }); 

    bLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      final String username = etUsername.getText().toString(); 
      final String password = etPassword.getText().toString(); 

      Response.Listener<String> responseListener = new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try{ 
         JSONObject jsonResponse = new JSONObject(response); 
         boolean success = jsonResponse.getBoolean("success"); 

         if(success){ 
          String name = jsonResponse.getString("name"); 
          int age = jsonResponse.getInt("age"); 

          Intent intent = new Intent(LoginActivity.this, UserAreaActivity.class); 
          intent.putExtra("name", name); 
          intent.putExtra("username", username); 
          intent.putExtra("age", age); 

          LoginActivity.this.startActivity(intent); 

         } else{ 
          AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this); 
          builder.setMessage("Login Failed").setNegativeButton("Retry", null).create().show(); 
         } 
        } catch (JSONException e){ 
         e.printStackTrace(); 
        } 
       } 
      }; 

      LoginRequest loginRequest = new LoginRequest(username, password, responseListener); 
      RequestQueue queue = Volley.newRequestQueue(LoginActivity.this); 
      queue.add(loginRequest); 
     } 
    }); 
} 
} 

LoginRequest.java

package com.loginregister.loginregister; 

import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.toolbox.StringRequest; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by ---- on 2016-09-24. 
*/ 

public class LoginRequest extends StringRequest { 

private static final String LOGIN_REQUEST_URL = "Webserver with my php file"; 
private Map<String, String> params; 

public LoginRequest(String username, String password, Response.Listener<String> listener){ 
    super(Request.Method.POST, LOGIN_REQUEST_URL, listener, null); 
    params = new HashMap<>(); 
    params.put("username", username); 
    params.put("password", password); 
} 

@Override 
public Map<String, String> getParams() { 
    return params; 
} 
} 

RegisterActivity.java 

package com.loginregister.loginregister; 

import android.content.Intent; 
import android.support.v7.app.AlertDialog; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.toolbox.Volley; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class RegisterActivity extends AppCompatActivity { 

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

    final EditText etName = (EditText) findViewById(R.id.etName); 
    final EditText etUsername = (EditText) findViewById(R.id.etUsername); 
    final EditText etPassword = (EditText) findViewById(R.id.etPassword); 
    final EditText etAge = (EditText) findViewById(R.id.etAge); 
    final Button bRegister = (Button) findViewById(R.id.bRegister); 

    bRegister.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      final String name = etName.getText().toString(); 
      final String username = etUsername.getText().toString(); 
      final String password = etPassword.getText().toString(); 
      final int age = Integer.parseInt(etAge.getText().toString()); 

      Response.Listener<String> responseListener = new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        try { 
         JSONObject jsonResponse = new JSONObject(response); 
         boolean success = jsonResponse.getBoolean("success"); 

         if (success){ 
          Intent intent = new Intent(RegisterActivity.this, LoginActivity.class); 
          startActivity(intent); 
         }else{ 
          AlertDialog.Builder builder = new AlertDialog.Builder(RegisterActivity.this); 
          builder.setMessage("Register Failed").setNegativeButton("Retry", null).create().show(); 
         } 
        } catch (JSONException e){ 
         e.printStackTrace(); 
        } 

       } 
      }; 

      RegisterRequest registerRequest = new RegisterRequest(name, username, age, password, responseListener); 
      RequestQueue queue = Volley.newRequestQueue(RegisterActivity.this); 
      queue.add(registerRequest); 

     } 
    }); 
} 
} 

RegisterRequest.java

package com.loginregister.loginregister; 

import com.android.volley.Response; 
import com.android.volley.toolbox.StringRequest; 

import java.util.HashMap; 
import java.util.Map; 

/** 
* Created by ---- on 2016-09-24. 
*/ 

public class RegisterRequest extends StringRequest { 

private static final String REGISTER_REQUEST_URL = "Webserver with my php file"; 
private Map<String, String> params; 

public RegisterRequest(String name, String username, int age, String password, Response.Listener<String> listener){ 
    super(Method.POST, REGISTER_REQUEST_URL, listener, null); 
    params = new HashMap<>(); 
    params.put("name", name); 
    params.put("username", username); 
    params.put("password", password); 
    params.put("age", age + ""); 
} 

@Override 
public Map<String, String> getParams() { 
    return params; 
} 
} 

的login.php

<?php 
$con = mysqli_connect("my_host", "my_user", "my_password", "my_db"); 

$username = $_POST["username"]; 
$password = $_POST["password"]; 

$statement = mysqli_prepare($con, "SELECT * FROM user WHERE username = ? AND password = ?"); 
mysqli_stmt_bind_param($statement, "ss", $username, $password); 
mysqli_stmt_execute($statement); 

mysqli_stmt_store_result($statement); 
mysqli_stmt_bind_result($statement, $userID, $name, $username, $age, $password); 

$response = array(); 
$response["success"] = false; 

while(mysqli_stmt_fetch($statement)){ 
    $response["success"] = true; 
    $response["name"] = $name; 
    $response["age"] = $age; 
    $response["username"] = $username; 
    $response["password"] = $password; 
} 

echo json_encode($response); 
?> 

Register.php

<?php 
$con = mysqli_connect("my_host", "my_user", "my_password", "my_db"); 

$name = $_POST["name"]; 
$age = $_POST["age"]; 
$username = $_POST["username"]; 
$password = $_POST["password"]; 

$statement = mysqli_prepare($con, "INSERT INTO user (name, username, age, password) VALUES (?, ?, ?, ?)"); 
mysqli_stmt_bind_param($statement, "siss", $name, $username, $age, $password); 
mysqli_stmt_execute($statement); 

$response = array(); 
$response["success"] = true; 

echo json_encode($response); 
?> 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.loginregister.loginregister"> 

    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".LoginActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".RegisterActivity" /> 
     <activity android:name=".UserAreaActivity"></activity> 
    </application> 

</manifest>¨ 

错误日志LoginActivity

W/System.err: org.json.JSONException: Value <br><table of type java.lang.String cannot be converted to JSONObject 
W/System.err:  at org.json.JSON.typeMismatch(JSON.java:111) 
W/System.err:  at org.json.JSONObject.<init>(JSONObject.java:160) 
W/System.err:  at org.json.JSONObject.<init>(JSONObject.java:173) 
W/System.err:  at com.loginregister.loginregister.LoginActivity$2$1.onResponse(LoginActivity.java:49) 
W/System.err:  at com.loginregister.loginregister.LoginActivity$2$1.onResponse(LoginActivity.java:45) 
W/System.err:  at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 
W/System.err:  at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 
W/System.err:  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6077) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

错误日志RegisterActivity

W/System.err: org.json.JSONException: Value <br><table of type java.lang.String cannot be converted to JSONObject 
W/System.err:  at org.json.JSON.typeMismatch(JSON.java:111) 
W/System.err:  at org.json.JSONObject.<init>(JSONObject.java:160) 
W/System.err:  at org.json.JSONObject.<init>(JSONObject.java:173) 
W/System.err:  at com.loginregister.loginregister.RegisterActivity$1$1.onResponse(RegisterActivity.java:44) 
W/System.err:  at com.loginregister.loginregister.RegisterActivity$1$1.onResponse(RegisterActivity.java:40) 
W/System.err:  at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 
W/System.err:  at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 
W/System.err:  at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
W/System.err:  at android.os.Handler.handleCallback(Handler.java:751) 
W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:95) 
W/System.err:  at android.os.Looper.loop(Looper.java:154) 
W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:6077) 
W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

回答

2

您API不得到安宁g适当的JSON格式。的字符串开头{(左大括号),并结束}(右括号)

请参见下面的代码

JSONObject object=new JSONObject("{your String}"); 

在你的情况下的响应字符串不正确

+0

响应字符串没有正确的JSON –

+0

但是,它不是在PHP文件中转换为JSON字符串吗? echo json_encode($ response); – user2125673

+0

通过REST API客户端检查你的API响应 –