Android JSON从PHP获取数据

Android JSON从PHP获取数据,php,android,mysql,json,eclipse,Php,Android,Mysql,Json,Eclipse,有人知道我做错了什么吗?我尝试了所有的例子。我只想使用php从服务器上获取我的android手机的lat和lon坐标 感谢您在高级课程中的帮助 这是我的代码中有问题的部分: public void connect() { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(polic

有人知道我做错了什么吗?我尝试了所有的例子。我只想使用php从服务器上获取我的android手机的lat和lon坐标

感谢您在高级课程中的帮助

这是我的代码中有问题的部分:

public void connect()
{
    StrictMode.ThreadPolicy policy = new   
    StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    HttpClient httpclient = new DefaultHttpClient();

    // Prepare a request object
    HttpGet httpget = new HttpGet("SERVER URL"); 

    // Execute the request
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
        // Examine the response status
        //Log.i("Info",response.getStatusLine().toString());  Comes back with HTTP/1.1 200 OK

        // Get hold of the response entity
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            InputStream instream = entity.getContent();
            String result= convertStreamToString(instream);

            JSONArray arr = new JSONArray(result);
            JSONObject jObj = arr.getJSONObject(0);
            String lat = jObj.getString("Lat");
            Log.d("OutPut", jObj.getString("Lon"));
            Toast.makeText(this, lat, Toast.LENGTH_LONG).show();
            instream.close();
        }


    } catch (Exception e) {
        Log.e("Error",e.toString());
    }
}
我无法从JSONObject中获取数据。我总是遇到这个例外

03-31 17:23:41.457: E/Error(317): org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONArray
这是我的主要活动中的所有代码

package com.misterbusllc.misterbusllc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import org.json.JSONArray;
import org.json.JSONObject;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import android.os.Bundle;
import android.os.StrictMode;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.widget.SlidingDrawer;
import android.widget.SlidingDrawer.OnDrawerCloseListener;
import android.widget.SlidingDrawer.OnDrawerOpenListener;
import android.widget.Toast;


public class MainActivity extends FragmentActivity {

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


    connect();

    //contactServer();


    final SlidingDrawer slidingDrawerCost = (SlidingDrawer) findViewById(R.id.slidingDrawerCost);
    final SlidingDrawer slidingDrawerInfo = (SlidingDrawer) findViewById(R.id.slidingDrawerInfo);

    GoogleMap map = ((SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

    LatLng latLng = new LatLng(47.922612,-97.060776);
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    map.addMarker(new MarkerOptions().position(latLng).title("MisterBus").snippet("MisterBus is currently here").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
    map.getUiSettings().setCompassEnabled(true);
    map.getUiSettings().setZoomControlsEnabled(true);
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));

    slidingDrawerCost.setOnDrawerOpenListener(new OnDrawerOpenListener() {
        @Override
        public void onDrawerOpened() {
            Intent intent = new Intent(getApplicationContext(), Cost.class);
            startActivity(intent);
        }
        });
        slidingDrawerCost.setOnDrawerCloseListener(new OnDrawerCloseListener() {

        @Override
        public void onDrawerClosed() {
            slidingDrawerCost.close();
        }
        }); 

        slidingDrawerInfo.setOnDrawerOpenListener(new OnDrawerOpenListener() {
            @Override
            public void onDrawerOpened() {
                Intent intent = new Intent(getApplicationContext(), info.class);
                startActivity(intent);
            }
            });
            slidingDrawerInfo.setOnDrawerCloseListener(new OnDrawerCloseListener() {

            @Override
            public void onDrawerClosed() {
                slidingDrawerInfo.close();
            }
            }); 


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}




public void connect()
{
    StrictMode.ThreadPolicy policy = new   
    StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);

    HttpClient httpclient = new DefaultHttpClient();

    // Prepare a request object
    HttpGet httpget = new HttpGet("SERVER URL"); 

    // Execute the request
    HttpResponse response;
    try {
        response = httpclient.execute(httpget);
        // Examine the response status
        //Log.i("Info",response.getStatusLine().toString());  Comes back with HTTP/1.1 200 OK

        // Get hold of the response entity
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            InputStream instream = entity.getContent();
            String result= convertStreamToString(instream);

            JSONArray arr = new JSONArray(result);
            JSONObject jObj = arr.getJSONObject(0);
            String lat = jObj.getString("Lat");
            Log.d("OutPut", jObj.getString("Lon"));
            Toast.makeText(this, lat, Toast.LENGTH_LONG).show();
            instream.close();
        }


    } catch (Exception e) {
        Log.e("Error",e.toString());
    }
}

    private static String convertStreamToString(InputStream is) {
    /*
     * To convert the InputStream to String we use the BufferedReader.readLine()
     * method. We iterate until the BufferedReader return null which means
     * there's no more data to read. Each line will appended to a StringBuilder
     * and returned as String.
     */
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try {
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return sb.toString();
}

}//end of class
PHP代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset=utf-8" http-equiv="Content-Type" content="application/json"; />
<title>Gps Send</title>
</head>
<body>

<?php
header('Content-type: application/json');
mysql_connect("localhost", "root","password"); 
mysql_select_db("misterbus");
$last =mysql_query("SELECT * FROM location WHERE ID = (SELECT MAX(id)  FROM location)");

while($row=mysql_fetch_assoc($last))
$output[]=$row;
 print(json_encode($output));

mysql_close();
?>

</body>
</html>

您的PHP页面包含HTML标记:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gps Send</title>
</head>
<body>



[{"Lat":"47.9255072","Lon":"-97.0846979","id":"34"}]
</body>
</html>

将此代码放在PHP页面包含HTML标记的第一个后面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Gps Send</title>
</head>
<body>



[{"Lat":"47.9255072","Lon":"-97.0846979","id":"34"}]
</body>
</html>

将此代码放在第一个后面,这是我个人项目中的一个类: 这个类只适用于动词POST,但应该很容易重构以用于其他动词

package com.DevFound;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHttpResponse;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONTokener;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HttpPostThreadJSon {
    private static final int SUCCESS = 1;
    private static final int FAILURE = 0;

    protected static JSONArray doInBackground(HttpPost HttpPostObj) {
        HttpClient HttpClientObj = new DefaultHttpClient();
        ProtocolVersion ProtocolVersionObj = new HttpVersion(1, 1);
        Integer codeVar = 0;
        String ReasonObj = "";
        HttpResponse HttpResponseObj = new BasicHttpResponse(ProtocolVersionObj, codeVar, ReasonObj);
        try {
            HttpResponseObj = HttpClientObj.execute(HttpPostObj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(HttpResponseObj.getEntity().getContent()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONTokener tokener = new JSONTokener(stringBuilder.toString());
        JSONArray result = null;
        try {
            result = new JSONArray(tokener);
            return result;
        } catch (JSONException e) {
            //e.printStackTrace();
        }
        return result;
    }
}
从客户机类中,您必须使用以下内容构建post对象:

HttpPostObj = new HttpPost((DGSession.getSessionStr("HttpPost", getBaseContext()) + "login.php"));

以下是我个人项目中的一节课: 这个类只适用于动词POST,但应该很容易重构以用于其他动词

package com.DevFound;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.ProtocolVersion;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHttpResponse;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONTokener;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HttpPostThreadJSon {
    private static final int SUCCESS = 1;
    private static final int FAILURE = 0;

    protected static JSONArray doInBackground(HttpPost HttpPostObj) {
        HttpClient HttpClientObj = new DefaultHttpClient();
        ProtocolVersion ProtocolVersionObj = new HttpVersion(1, 1);
        Integer codeVar = 0;
        String ReasonObj = "";
        HttpResponse HttpResponseObj = new BasicHttpResponse(ProtocolVersionObj, codeVar, ReasonObj);
        try {
            HttpResponseObj = HttpClientObj.execute(HttpPostObj);
        } catch (IOException e) {
            e.printStackTrace();
        }
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        BufferedReader bufferedReader = null;
        try {
            bufferedReader = new BufferedReader(new InputStreamReader(HttpResponseObj.getEntity().getContent()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        JSONTokener tokener = new JSONTokener(stringBuilder.toString());
        JSONArray result = null;
        try {
            result = new JSONArray(tokener);
            return result;
        } catch (JSONException e) {
            //e.printStackTrace();
        }
        return result;
    }
}
从客户机类中,您必须使用以下内容构建post对象:

HttpPostObj = new HttpPost((DGSession.getSessionStr("HttpPost", getBaseContext()) + "login.php"));
$last=mysql\u querySELECT*从ID=SELECT MAXid的位置 从地理位置

我知道这个问题很久以前就解决了,但是您使用的mysql查询并不是获取结果的最佳方式。 您在Select中执行Select,这意味着它将在location选项卡中搜索两次。更好的办法是

按id描述限制1从位置订单中选择*

这将获取id最高的行,两个查询的结果仍然相等,但仅使用1个Select的查询的执行时间比使用2个Select的查询快

$last=mysql\u querySELECT*从ID=SELECT MAXid的位置 从地理位置

我知道这个问题很久以前就解决了,但是您使用的mysql查询并不是获取结果的最佳方式。 您在Select中执行Select,这意味着它将在location选项卡中搜索两次。更好的办法是

按id描述限制1从位置订单中选择*


这将获取id最高的行,两个查询的结果仍然相等,但仅使用1个Select的查询的执行时间比使用2个Select的查询快。

任何浏览器或应用程序中的json解析器都无法处理html/json混合html部分是服务器上的实际代码,而不是我的代码,这就是为什么我要纠正它。下次读得更好。明白了…只是在详细说明我明白了:谢谢,我删除了html标记,并将标题添加到php中。现在可以了。谢谢你的帮助。我真的很感激。几天来,我一直在用我的电脑来解决这个问题。我终于忍不住问了这个问题哈哈。谢谢,任何浏览器或应用程序中的json解析器都无法处理html/json混合。html部分是服务器上的实际代码,而不是我的,这就是为什么我要更正它。下次读得更好。明白了…只是在详细说明我明白了:谢谢,我删除了html标记,并将标题添加到php中。现在可以了。谢谢你的帮助。我真的很感激。几天来,我一直在用我的电脑来解决这个问题。我终于忍不住问了这个问题哈哈。谢谢你,你能发布php代码吗?如果你删除代码中的php文件URL,也不发布php代码,那就没用了。你能发布php代码吗?如果你删除代码中的php文件URL,也不发布php代码,那就没用了。明白了。谢谢你的澄清:明白了。感谢您的澄清: