2012-04-25 176 views
3

接收数据,我是新来的交际面。只是试图从android应用程序定期获取一些数据。但不知何故,它不工作..已经写了一个PHP脚本我需要添加更多的东西..? 我是否需要在androidmanifest中添加任何权限..? 也给我的android应用代码..它强制关闭时,我点击获取我的位置。PHP服务器从Android应用程序

PHP脚本

<?php 
echo 'Hello, world!'; 
$json = $_GET['jsonpost'];//get the post you sent... 
$data = json_decode($json); //decode the json formatted string... 
print_r($data); 
$id = $data->id; 
$devid = $data->devid; 
$latitude = $data->latitude; 
$longitude = $data->longitude; 
$service = $data->service; 
$con = mysql_connect("","",""); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 
mysql_select_db("a5234826_ul", $con); 
$devid = $_POST['devid']; 
$latitude = $_POST['latitude']; 
$longitude = $_POST['longitude']; 
echo "devid" +$devid; 
echo "latitude" + $latitude; 
echo "longitude" + $longitude; 
$sql = "INSERT INTO `a5234826_ul`.`locations` (
`id` , 
`devid` , 
`latitude` , 
`longitude` , 
`service` 
) 
VALUES (
NULL , '$devid', '$latitude', '$longitude', '$service' 
)"; 
if (!mysql_query($sql,$con)) 
    { 
    die('Error: ' . mysql_error()); 
    } 
mysql_close($con); 
echo json_encode($variable); 

?> 

LocationService.java

@Override 
public IBinder onBind(Intent intent) { 
// TODO Auto-generated method stub 
return null; 
} 

public int onStartCommand(Intent intent, int flags, int startId) { 
PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "lock"); 
wl.acquire(); 
context = this; 
final String who = intent.getStringExtra("who"); 
final LocationManager locMan = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
final LocationListener listener = new LocationListener(){ 

    // start location changed 

    public void onLocationChanged(Location loc) { 
     double latitude = loc.getLatitude(); 
     double longitude = loc.getLongitude(); 


     // Create a new HttpClient and Post Header 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://.../serverFile.php"); 
     JSONObject json = new JSONObject(); 


     TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     String devid = telephonyManager.getDeviceId(); 

     String postData = "{\"request\":{\"type\":\"locationinfo\"},\"userinfo\":{\"latitude\":\""+latitude+"\",\"longitude\":\""+longitude+"\",\"devid\":\""+devid+"\"}}"; 




     try { 

      json.put("longitude", longitude);//place each of the strings as you did in postData method 
      json.put("latitude", latitude); 

      json.put("devid", devid); 

      JSONArray postjson=new JSONArray(); 
      postjson.put(json); 
      httppost.setHeader("json",json.toString()); 
      httppost.getParams().setParameter("jsonpost",postjson);  
      HttpResponse response = httpclient.execute(httppost); 

      // for JSON retrieval: 
      if(response != null) 
      { 
      InputStream is = response.getEntity().getContent(); 
     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(); 
      } 
      } 
      String jsonStr = sb.toString(); //take the string you built place in a string 



      JSONObject rec = new JSONObject(jsonStr); 
      String longitudecord = rec.getString("lon"); 
       String latitudecord = rec.getString("lat"); 
      // ... 
      } 
      }catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 




     if (who.equals("me")){ 
      Intent i = new Intent(context.getPackageName()+".LocationReceived"); 
      i.putExtra("lat", String.valueOf(latitude)); 
      i.putExtra("longitude", String.valueOf(longitude)); 
      i.putExtra("accuracy", String.valueOf(loc.getAccuracy())); 
      context.sendBroadcast(i); 
      Notification notif = new Notification(); 
      NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE); 
      notif.tickerText = "Location Found!"; 
      notif.icon = R.drawable.ic_launcher; 
      notif.flags = Notification.FLAG_AUTO_CANCEL; 
      notif.when = System.currentTimeMillis(); 
      Intent notificationIntent = new Intent(context, TestLocatorActivity.class); 
      notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      notificationIntent.putExtra("lat", String.valueOf(latitude)); 
      notificationIntent.putExtra("longitude", String.valueOf(longitude)); 
      notificationIntent.putExtra("accuracy", String.valueOf(loc.getAccuracy())); 
      PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
      notif.setLatestEventInfo(context, "Location Found!", "Click to open.", contentIntent); 
      nm.notify(0, notif); 
     } else { 
      SmsManager smsMan = SmsManager.getDefault(); 
      smsMan.sendTextMessage(who, null, "http://maps.google.com/maps?q=loc:"+latitude+","+longitude, null, null); 
      smsMan.sendTextMessage(who, null, "Latitude: "+latitude+"\nLongitude: "+longitude, null, null); 
     } 
     locMan.removeUpdates(this); 
     try { 
      wl.release(); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
     stopSelf(); 
    } 

    public void onProviderDisabled(String provider){ 


    } 

    public void onProviderEnabled(String provider) { 
     //Log.i(tag, "GPS IS ON"); 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras){ 
     switch(status) { 
      case LocationProvider.OUT_OF_SERVICE: 
      case LocationProvider.TEMPORARILY_UNAVAILABLE: 
      case LocationProvider.AVAILABLE: 
       break; 
     } 
    } }; 


locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); 
locMan.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener); 

return 2; 
} 

} 

还有一两件事我想获得的纬度和经度弗朗LocationService类Post类的值是邮政代码一流的权利.. 请帮助我..

+0

您是否通过浏览器发送测试表单数据以查看错误是否由PHP输出? – 2012-04-25 02:36:05

+0

否..但是代码完整的PHP服务器接收数据..? – 2012-04-25 02:38:05

+0

它看起来像你有所有必要的部分给我。 – 2012-04-25 02:38:56

回答

1

我建议你制作一个简单的脚本来确保你确实正确地访问了数据库。你可以只运行在浏览器脚本,这种方式排除任何连接/访问问题的分贝:

<?php 
mysql_connect("localhost","user","pass"); 
mysql_select_db("dbName"); 
$sql=mysql_query("select * from TABLENAME where COLUMNNAME like 'searchparameter'"); 
while($row=mysql_fetch_assoc($sql)) 
$output[]=$row; 
print(json_encode($output)); 
mysql_close(); 
?> 
1

你在你的PHP代码有问题因为在Android端数据发送为json格式,如

String postData = "{\"request\":{\"type\":\"locationinfo\"},\"userinfo\":{\"latitude\":\""+latitude+"\",\"longitude\":\""+longitude+"\",\"deviceid\":\""+deviceid+"\"}}" 

但您直接尝试获取数据而不解码json。

所以需要以特定的顺序首先解码的JSON,然后获取数据

看到下面的链接查看更多细节

http://php.net/manual/en/function.json-decode.php

+0

你能帮我解码吗? – 2012-04-25 10:26:50

+0

我其实并没有太多的理解..你能帮我解决... – 2012-04-25 10:47:26

+0

是你通过给定的链接 – 2012-05-03 05:08:10

3

像@Vivek库马尔塔瓦说。

当您使用POSTDATA您发送它以JSON格式等你的PHP你到底需要实际解码它...

代码会是这样。

它也许更符合这样的Android代码创建一个JSON对象...

正如Vivek Kumar Srivastava说:

当您使用POSTDATA您发送它以JSON格式等等,你需要你的php结束实际解码它。

这可能是更好的在你的Android代码创建一个JSON对象像下面。

private postData() throws JSONException{ 
// Create a new HttpClient and Post Header 
HttpClient httpclient = new DefaultHttpClient(); 
HttpGet httppost = new HttpGet("http://.../serverFile.php"); 
JSONObject json = new JSONObject(); 

try {   
    json.put("longitude", longitude);//place each of the strings as you did in postData method 
    json.put("latitude", latitude); 
    json.put("service", service); 
    json.put("devid", devid); 

    JSONArray postjson=new JSONArray(); 
    postjson.put(json); 
    post.setHeader("json",json.toString()); 
    post.getParams().setParameter("jsonpost",postjson);  
    HttpResponse response = httpclient.execute(httppost); 

    // for JSON retrieval: 
    if(response != null) 
    { 
    InputStream is = response.getEntity().getContent(); 
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(); 
    } 
    } 
    String jsonStr = sb.toString(); //take the string you built place in a string 



    JSONObject rec = new JSONObject(jsonStr); 
    String longitudecord = rec.getString("lon"); 
     String latitudecord = rec.getString("lat"); 
    // ... 
    } 
    }catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     } 
    } 

现在你的PHP代码...

$json = $_SERVER['HTTP_JSON'];//get the post you sent... 
$data = json_decode($json); //decode the json formatted string... 
$longitude = $data->longitude; 
$latitude = $data->latitude; 
$service = $data->service; 
$devid = $data->devid; 

And then continue with your sql from there on. 您将编码成JSON,如果你想阅读它们放回Android作为显示在上面的代码...

+0

通过你好,谢谢你的回应..所以我只需要在我的代码中添加此..?你给的PHP部分和Java部分Post.java ..? – 2012-05-07 13:59:17

+0

我只是通过你的个人资料..你想要做的是发布经纬度和长期从你的应用程序发布到PHP的网站..你能帮我吗?请 – 2012-05-10 08:35:58

+0

是的。你有没有尝试使用我上面提出的建议? – inspired 2012-05-11 09:41:51

0

我看不出有任何PHP代码接受POST数据。我写了类似的应用程序,将数据发送到服务器并将其记录到数据库。我通常有一些脚本,我接受POST数据并使用它的值。您必须使用Android SDK中的POST方法将数据发送到URL。这比使用JSON发送数据然后在PHP端进行解码要容易。如果我需要从服务器接收数据,我将返回值为JSON,然后使用SDK在Android中对其进行解码。

相关问题