gpt4 book ai didi

php - Android JSON 从 PHP 获取数据

转载 作者:行者123 更新时间:2023-11-29 04:48:06 25 4
gpt4 key购买 nike

有人知道我做错了什么吗?我试着做了几乎所有的例子。我只想使用 php 从服务器获取经纬度坐标到我的 android 手机。

感谢您的帮助

这是我遇到问题的代码部分:

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

来 self 的服务器的 PHP 代码正在输出:

[{"Lat":"47.9255072","Lon":"-97.0846979","id":"34"}]

这是我的 MainActivity 中的所有代码

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>

因此,您收到的错误是因为 Android 无法正确理解响应(它假定为纯 JSON,而不是 HTML)。您需要删除 HTML 标记,以便响应仅包含纯 JSON。

您可能还想设置一个 header ,声明其为 JSON 内容类型。您可以这样做:

header('Content-type: application/json');

将此代码放在第一个 <?php 之后标签,在其他一切之前。

关于php - Android JSON 从 PHP 获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15736181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com