我只是一个新手,我已经构建了我的应用程序,以一个名为user_login.xml的布局开始。当我单击登录按钮时,它无法将我重定向到activity_main.xml。 json应该可以正常工作。我该怎么做才能解决这个问题?对不起,如果我用错误的词语来解释我的问题。提前致谢。这是Android Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.alan.smarthome"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name="com.alan.smarthome.app.AppController"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat" >
<activity
android:name="com.alan.smarthome.UserLogin"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustPan"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".RegisterActivity"
android:label="Register New Account"
android:launchMode="singleTop"
android:windowSoftInputMode="adjustPan"/>
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop"/>
</application>
</manifest>
这是我创建的UserLogin.java
package com.alan.smarthome;
import com.alan.smarthome.app.AppConfig;
import com.alan.smarthome.app.AppController;
import com.alan.smarthome.helper.SessionManager;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.content.Intent;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
public class UserLogin extends Activity {
// LogCat tag
private static final String TAG = RegisterActivity.class.getSimpleName();
private Button btnLogin;
private TextView btnLinkToRegister;
private EditText inputUsername;
private EditText inputPassword;
private ProgressDialog pDialog;
private SessionManager session;
/*
private TextView attempts;
int counter = 3; */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.user_login);
inputUsername = (EditText) findViewById(R.id.btnUsername);
inputPassword = (EditText) findViewById(R.id.btnPassword);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnLinkToRegister = (TextView) findViewById(R.id.btnLinkToRegisterScreen);
// Progress dialog
pDialog = new ProgressDialog(this);
pDialog.setCancelable(false);
// Session manager
session = new SessionManager(getApplicationContext());
// Check if user is already logged in or not
if (session.isLoggedIn()) {
// User is already logged in. Take him to main activity
Intent intent = new Intent(UserLogin.this, MainActivity.class);
startActivity(intent);
finish();
}
// Login button Click Event
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
String name = inputUsername.getText().toString();
String password = inputPassword.getText().toString();
// Check for empty data in the form
if (name.trim().length() > 0 && password.trim().length() > 0) {
// login user
checkLogin(name, password);
} else {
// Prompt user to enter credentials
Toast.makeText(getApplicationContext(),
"Please enter the credentials!", Toast.LENGTH_LONG)
.show();
}
}
});
// Link to Register Screen
btnLinkToRegister.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(),
RegisterActivity.class);
startActivity(i);
finish();
}
});
}
/**
* function to verify login details in mysql db
* */
private void checkLogin(final String name, final String password) {
// Tag used to cancel the request
String tag_string_req = "req_login";
pDialog.setMessage("Logging in ...");
showDialog();
StringRequest strReq = new StringRequest(Method.POST,
AppConfig.URL_REGISTER, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Login Response: " + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response.substring(response.indexOf("{"), response.lastIndexOf("}") + 1));
boolean error = jObj.getBoolean("error");
// Check for error node in json
if (!error) {
// user successfully logged in
// Create login session
session.setLogin(true);
// Launch main activity
Intent intent = new Intent(UserLogin.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
// Error in login. Get the error message
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// JSON error
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Login Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting parameters to login url
Map<String, String> params = new HashMap<String, String>();
params.put("tag", "login");
params.put("name", name);
params.put("password", password);
return params;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
}
private void showDialog() {
if (!pDialog.isShowing())
pDialog.show();
}
private void hideDialog() {
if (pDialog.isShowing())
pDialog.dismiss();
}
}
这是我尝试登录activity_main.xml时从LogCat获得的错误
03-09 16:53:13.975: W/System.err(783): org.json.JSONException: Expected ':' after main at character 6 of {main}( )</td><td title='C:\wamp\www\android_login_api\index.php' bgcolor='#eeeeec'>..\index.php<b>:</b>0</td></tr>
03-09 16:53:13.975: W/System.err(783): <tr><td bgcolor='#eeeeec' align='center'>2</td><td bgcolor='#eeeeec' align='center'>0.0010</td><td bgcolor='#eeeeec' align='right'>279456</td><td bgcolor='#eeeeec'>DB_Functions->__construct( )</td><td title='C:\wamp\www\android_login_api\index.php' bgcolor='#eeeeec'>..\index.php<b>:</b>19</td></tr>
03-09 16:53:13.975: W/System.err(783): <tr><td bgcolor='#eeeeec' align='center'>3</td><td bgcolor='#eeeeec' align='center'>0.0020</td><td bgcolor='#eeeeec' align='right'>285592</td><td bgcolor='#eeeeec'>DB_Connect->connect( )</td><td title='C:\wamp\www\android_login_api\include\DB_Functions.php' bgcolor='#eeeeec'>..\DB_Functions.php<b>:</b>13</td></tr>
03-09 16:53:13.985: W/System.err(783): <tr><td bgcolor='#eeeeec' align='center'>4</td><td bgcolor='#eeeeec' align='center'>0.0020</td><td bgcolor='#eeeeec' align='right'>286432</td><td bgcolor='#eeeeec'><a href='http://www.php.net/function.mysql-connect' target='_new'>mysql_connect</a>
03-09 16:53:13.985: W/System.err(783): ( )</td><td title='C:\wamp\www\android_login_api\include\DB_Connect.php' bgcolor='#eeeeec'>..\DB_Connect.php<b>:</b>18</td></tr>
03-09 16:53:13.985: W/System.err(783): </table></font>
03-09 16:53:13.985: W/System.err(783): {"tag":"login","error":false,"uid":"54fdd87267a3f5.49630793","user":{"name":"Alan","email":"alan@hotmail.com","created_at":"2015-03-10 01:29:22","updated_at":null}}
03-09 16:53:13.985: W/System.err(783): at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
03-09 16:53:13.985: W/System.err(783): at org.json.JSONTokener.readObject(JSONTokener.java:379)
03-09 16:53:13.985: W/System.err(783): at org.json.JSONTokener.nextValue(JSONTokener.java:100)
03-09 16:53:13.995: W/System.err(783): at org.json.JSONObject.<init>(JSONObject.java:155)
03-09 16:53:13.995: W/System.err(783): at org.json.JSONObject.<init>(JSONObject.java:172)
03-09 16:53:13.995: W/System.err(783): at com.alan.smarthome.UserLogin$3.onResponse(UserLogin.java:129)
03-09 16:53:13.995: W/System.err(783): at com.alan.smarthome.UserLogin$3.onResponse(UserLogin.java:1)
03-09 16:53:13.995: W/System.err(783): at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60)
03-09 16:53:13.995: W/System.err(783): at com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30)
03-09 16:53:13.995: W/System.err(783): at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99)
03-09 16:53:13.995: W/System.err(783): at android.os.Handler.handleCallback(Handler.java:733)
03-09 16:53:13.995: W/System.err(783): at android.os.Handler.dispatchMessage(Handler.java:95)
03-09 16:53:13.995: W/System.err(783): at android.os.Looper.loop(Looper.java:136)
03-09 16:53:13.995: W/System.err(783): at android.app.ActivityThread.main(ActivityThread.java:5017)
03-09 16:53:13.995: W/System.err(783): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 16:53:13.995: W/System.err(783): at java.lang.reflect.Method.invoke(Method.java:515)
03-09 16:53:13.995: W/System.err(783): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-09 16:53:13.995: W/System.err(783): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-09 16:53:13.995: W/System.err(783): at dalvik.system.NativeStart.main(Native Method)
和php文件:
DB_Connect.php
<?php
class DB_Connect {
// constructor
function __construct() {
}
// destructor
function __destruct() {
// $this->close();
}
// Connecting to database
public function connect() {
require_once 'include/config.php';
// connecting to mysql
$con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
// selecting database
mysql_select_db(DB_DATABASE);
// return database handler
return $con;
}
// Closing database connection
public function close() {
mysql_close();
}
}
?>
的config.php
<?php
/**
* Database config variables
*/
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASSWORD", "");
define("DB_DATABASE", "android_api");
?>
DB_Functions.php
<?php
class DB_Functions {
private $db;
//put your code here
// constructor
function __construct() {
require_once 'DB_Connect.php';
// connecting to database
$this->db = new DB_Connect();
$this->db->connect();
}
// destructor
function __destruct() {
}
/**
* Storing new user
* returns user details
*/
public function storeUser($name, $email, $password) {
$uuid = uniqid('', true);
$hash = $this->hashSSHA($password);
$encrypted_password = $hash["encrypted"]; // encrypted password
$salt = $hash["salt"]; // salt
$result = mysql_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
// check for successful store
if ($result) {
// get user details
$uid = mysql_insert_id(); // last inserted id
$result = mysql_query("SELECT * FROM users WHERE uid = $uid");
// return user details
return mysql_fetch_array($result);
} else {
return false;
}
}
/**
* Get user by name and password
*/
public function getUserByNameAndPassword($name, $password) {
$result = mysql_query("SELECT * FROM users WHERE name = '$name'") or die(mysql_error());
// check for result
$no_of_rows = mysql_num_rows($result);
if ($no_of_rows > 0) {
$result = mysql_fetch_array($result);
$salt = $result['salt'];
$encrypted_password = $result['encrypted_password'];
$hash = $this->checkhashSSHA($salt, $password);
// check for password equality
if ($encrypted_password == $hash) {
// user authentication details are correct
return $result;
}
} else {
// user not found
return false;
}
}
/**
* Check user is existed or not
*/
public function isUserExisted($name) {
$result = mysql_query("SELECT name from users WHERE name = '$name'");
$no_of_rows = mysql_num_rows($result);
if ($no_of_rows > 0) {
// user existed
return true;
} else {
// user not existed
return false;
}
}
/**
* Encrypting password
* @param password
* returns salt and encrypted password
*/
public function hashSSHA($password) {
$salt = sha1(rand());
$salt = substr($salt, 0, 10);
$encrypted = base64_encode(sha1($password . $salt, true) . $salt);
$hash = array("salt" => $salt, "encrypted" => $encrypted);
return $hash;
}
/**
* Decrypting password
* @param salt, password
* returns hash string
*/
public function checkhashSSHA($salt, $password) {
$hash = base64_encode(sha1($password . $salt, true) . $salt);
return $hash;
}
}
?>
的index.php
<?php
/**
* File to handle all API requests
* Accepts GET and POST
* Each request will be identified by TAG
* Response will be JSON data
/**
* check for POST request
*/
if (isset($_POST['tag']) && $_POST['tag'] != '') {
// get tag
$tag = $_POST['tag'];
// include db handler
require_once 'include/DB_Functions.php';
$db = new DB_Functions();
// response Array
$response = array("tag" => $tag, "error" => FALSE);
// check for tag type
if ($tag == 'login') {
// Request type is check Login
$name = $_POST['name'];
$password = $_POST['password'];
// check for user
$user = $db->getUserByNameAndPassword($name, $password);
if ($user != false) {
// user found
$response["error"] = FALSE;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
// user not found
// echo json with error = 1
$response["error"] = TRUE;
$response["error_msg"] = "Incorrect name or password!";
echo json_encode($response);
}
} else if ($tag == 'register') {
// Request type is Register new user
$name = $_POST['name'];
$email = $_POST['email'];
$password = $_POST['password'];
// check if user is already existed
if ($db->isUserExisted($email)) {
// user is already existed - error response
$response["error"] = TRUE;
$response["error_msg"] = "User already existed";
echo json_encode($response);
} else {
// store user
$user = $db->storeUser($name, $email, $password);
if ($user) {
// user stored successfully
$response["error"] = FALSE;
$response["uid"] = $user["unique_id"];
$response["user"]["name"] = $user["name"];
$response["user"]["email"] = $user["email"];
$response["user"]["created_at"] = $user["created_at"];
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
// user failed to store
$response["error"] = TRUE;
$response["error_msg"] = "Error occured in Registration";
echo json_encode($response);
}
}
} else {
// user failed to store
$response["error"] = TRUE;
$response["error_msg"] = "Unknow 'tag' value. It should be either 'login' or 'register'";
echo json_encode($response);
}
} else {
$response["error"] = TRUE;
$response["error_msg"] = "Required parameter 'tag' is missing!";
echo json_encode($response);
}
?>
答案 0 :(得分:0)
org.json.JSONException:预期&#39;:&#39;在主角6之后......
显然,您没有收到有效的JSON响应(它看起来像HTML)。
这部分:
03-09 16:53:13.985:W / System.err(783):40.0020286432http://www.php.net/function.mysql-connect' target =&#39; _new&#39;&gt; mysql_connect 03-09 16:53:13.985:W / System.err(783): ().. \ DB_Connect.php : 18
建议您需要修复PHP脚本中的错误,还应记录错误,如果需要以json格式发送
答案 1 :(得分:0)
请先仔细检查应用的API后端是否存在错误。
解析复杂的Json层次结构。尝试使用此库:https://code.google.com/p/google-gson/
样本用法:
首先创建一个要插入json字符串的对象。注意:变量名称应与您的json标记匹配,或者您应该放置@SerializedName(“firstname”);在变量的开头。
public class UserDto implements Serializable {
private long _id;
private String id;
private String fname;
private String lname;
private String emp_code;
private String username;
private String password;
private String usertype;
public long get_id() {
return _id;
}
public void set_id(long _id) {
this._id = _id;
}
public String getUserId() {
return id;
}
public void setUserId(String id) {
this.id = id;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
public String getEmp_code() {
return emp_code;
}
public void setEmp_code(String emp_code) {
this.emp_code = emp_code;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsertype() {
return usertype;
}
public void setUsertype(String usertype) {
this.usertype = usertype;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
以下是如何解析JSON字符串:
Gson gson = new Gson();
UserDto userDto= gson.fromJson(stringJsonHere, UserDto.class);
答案 2 :(得分:0)
检查您的网络服务器设置是否为php。 PHP错误报告将您的index.php转换为html而不是json。
编辑php.ini并设置error_reporting设置。将其关闭
如果使用.htaccess文件,请插入php_flag display_errors 0
您可以在index.php
error_reporting(0)
还请检查您的Web服务器中的mysql php设置。错误报告显示它是由mysql_connect()触发的。
答案 3 :(得分:0)
您的响应字符串是json本身。 尝试在logcat中显示响应字符串。 而不是:
JSONObject jObj = new JSONObject(response.substring(response.indexOf("{"), response.lastIndexOf("}") + 1));
试试这个:
JSONObject jObj = new JSONObject(response);