0

我正在制作一个每隔 10 秒向我的服务器报告其位置的 android 客户端。对于服务器,我使用的是动态 DNS。我必须发送纬度、经度和时间戳作为 GET 参数。我做了以下工作代码: package in.kirancity.trackapp;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity
{

TextView textLat;
TextView textLong;
TextView textRes;

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

    textLat = (TextView)findViewById(R.id.textLat);
    textLong = (TextView)findViewById(R.id.textLong);
    textRes = (TextView)findViewById(R.id.textRes);

    LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    LocationListener ll = new myLocationListener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, ll);
}

    class myLocationListener implements LocationListener{
        @Override
        public void onLocationChanged(Location arg0)
        {
            if(arg0 != null)
            {
                double plong = arg0.getLongitude();
                double plat = arg0.getLatitude();
                String url = "http://vishalhome.myftp.org/insert.php?la="+Double.toString(plat)+"&ln="+Double.toString(plong)+"&d='Arbitrary'";
                textLat.setText(Double.toString(plat));
                textLong.setText(Double.toString(plong));
                new RequestTask().execute(url);
             }
        }

        @Override
        public void onProviderDisabled(String arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            // TODO Auto-generated method stub

        }
}
class RequestTask extends AsyncTask<String, String, String>
{

        @Override
        protected String doInBackground(String... uri) {
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response;
            String responseString = null;
            try {
                response = httpclient.execute(new HttpGet(uri[0]));
                StatusLine statusLine = response.getStatusLine();
                if(statusLine.getStatusCode() == HttpStatus.SC_OK){
                    ByteArrayOutputStream out = new ByteArrayOutputStream();
                    response.getEntity().writeTo(out);
                    out.close();
                    responseString = out.toString();
                } else{
                    //Closes the connection.
                    response.getEntity().getContent().close();
                    throw new IOException(statusLine.getReasonPhrase());
                }
            } catch (ClientProtocolException e) {
                responseString = e.toString();
            } catch (IOException e) {
                responseString = e.toString();
            }
            return responseString;
        }

        @Override
        protected void onPostExecute(String result) {
            TextView tv=(TextView)findViewById(R.id.textRes);
            tv.setText(result);
        }
}

@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;
}

}

这段代码对我来说很好。但是我没有发送实际的时间戳,而是发送了“任意”字符串。成功执行 asyncTask 后,值被插入,响应为:“inserted”(由我的 php 页面返回)。

但是当我在 onLocationChanged 中尝试这个时:

String url = "http://vishalhome.myftp.org/insert.php?la="+Double.toString(plat)+"&ln="+Double.toString(plong)+"&d=\'";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String currentDateandTime = sdf.format(new Date());
url = url + currentDateandTime + "\'";

应用程序在位置更改事件时崩溃。我试图放置 try catch 块,但没有任何问题的线索。我认为在调用 new RequestTask(url) 后问题就出来了。请协助 !

4

1 回答 1

0

我认为您应该在使用之前对 url 进行编码。试试这个:

currentDateandTime = URLEncoder.encode(currentDateandTime, "utf-8");
url = url + currentDateandTime + "\'";

请参阅Android 中的 URL 编码

于 2013-04-30T03:31:29.660 回答