Android JSON obtenir les données à partir de PHP
Quelqu'un a une idée de ce que je fais de mal? J'ai essayé de faire juste au sujet de chaque exemple là-bas. Je veux juste la lat et lon coords à partir du serveur à l'aide de php sur mon téléphone android.
Je vous remercie pour votre aide dans l'avancée
C'est la partie de mon code qui je vais avoir des problèmes avec:
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());
}
}
Je ne peux pas obtenir les données de la JSONObject. Je reçois cette exception.
03-31 17:23:41.457: E/Error(317): org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONArray
Le code PHP de mon serveur est sortie:
[{"Lat":"47.9255072","Lon":"-97.0846979","id":"34"}]
Voici tout le code dans mon 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
CODE 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>
- pouvez-vous poster le code php?
- Cela n'aide pas si vous supprimez le fichier PHP URL dans votre code et aussi de ne pas poster votre code PHP..
Vous devez vous connecter pour publier un commentaire.
Votre page PHP qui contient des balises HTML:
Par conséquent, l'erreur que vous obtenez est parce qu'Android n'est pas de comprendre correctement la réponse (il suppose que pure JSON, pas en HTML). Vous devez supprimer les balises HTML de sorte que la réponse ne contient que de la pure JSON.
Vous pouvez aussi définir un en-tête déclarant d'un JSON type de contenu.
Vous pouvez le faire de cette façon:
Mettre ce code juste après la première
<?php
tag, avant tout le reste.Voici une classe à partir de mon projet personnel: http://developersfound.com/HttpPostThreadJSon.zip
Cette classe ne fonctionne qu'avec les verbes de la POSTE, mais devrait être assez facile à refactoriser pour une utilisation avec d'autres verbes.
De la classe client vous devez construire le poste de l'Objet avec quelque chose comme:
je sais que cette question est résolue depuis longtemps, mais la requête mysql que vous utilisez n'est pas le meilleur moyen de récupérer le résultat.
Vous exécutez une sélection dans une sélection de sorte qu'il signifie qu'il va chercher deux fois dans l'emplacement de la table. une bien meilleure façon serait
"SELECT * from emplacement ORDER BY id DESC LIMIT 1"
ce serait extraction de la ligne avec les id les plus élevés, le résultat de la requête est toujours égal, mais le temps d'exécution de la requête avec seulement 1 Sélectionnez est plus rapide que la requête avec 2 Sélectionnez l'.