How can I send the GPS and Network location cordinates to a server (static IP)?

依然范特西╮ 提交于 2019-12-19 04:21:56

问题


I am a beginner in the Android Development.I want to make an android app which sends the GPS and network locations (lat & long) to my server (static IP). I have found the following code and it worked successfully, data receive at the app which is already made at server side (Right now it has nothing to do with client app)

Data received at my Server when I click the button 'Send Location' on my Android App.

  • GET /31.4244456/74.7349772 HTTP/1.1

  • Host: 180.178.169.77:6081

  • Connection: keep-Alive

  • User-Agent: Apache-HttpClient/Unavailable (java 1.4)

180.178.169.77 is my server IP and 6081 is the port

At this point everything is going fine and I acheived almost what I wanted but the real problem I'm facing is that my Android app hangs and crash after sending this data to server. Please resolve my problem if anybody has an idea.

I have found the Code from here. http://www.gideondsouza.com/blog/how-to-get-the-current-location-address-and-send-it-to-a-server-on-android#.UNLbTOT0Dxo

Here is my AddressActivity.java

package com.gideon.address;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import org.apache.http.HttpResponse;
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.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class AddressActivity extends Activity {
/** Called when the activity is first created. */
String lat="", lon="";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btnLocation = (Button)findViewById(R.id.btnLocation);
    btnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
            // Acquire a reference to the system Location Manager
            LocationManager locationManager = (LocationManager) AddressActivity.this.getSystemService(Context.LOCATION_SERVICE);
            // Define a listener that responds to location updates
            LocationListener locationListener = new LocationListener() {
                public void onLocationChanged(Location location) {
                    // Called when a new location is found by the network location provider.
                    lat = Double.toString(location.getLatitude());
                    lon = Double.toString(location.getLongitude());
                    TextView tv = (TextView) findViewById(R.id.txtLoc);
                    tv.setText("Your Location is:" + lat + "--" + lon);
                }

                public void onStatusChanged(String provider, int status, Bundle extras) {}
                public void onProviderEnabled(String provider) {}
                public void onProviderDisabled(String provider) {}
            };
            // Register the listener with the Location Manager to receive location updates
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
        }
    });

    Button btnSend = (Button)findViewById(R.id.btnSend);
    btnSend.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            postData(lat, lon);
        }
    });

    Button btnAdd = (Button)findViewById(R.id.btnAddress);
    btnAdd.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            TextView tv = (TextView)findViewById(R.id.txtAddress);
            tv.setText(GetAddress(lat, lon));
        }
    });

}

public void postData(String la, String lo) {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    //HttpGet  htget = new HttpGet("http://myappurl.com/Home/Book/"+la+"/"+lo);
    HttpGet  htget = new HttpGet("http://180.178.169.77:6081/"+la+"/"+lo);

    try {
        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(htget);
        String resp = response.getStatusLine().toString();
        Toast.makeText(this, resp, 5000).show();


    } catch (ClientProtocolException e) {
        Toast.makeText(this, "Error", 5000).show();
    } catch (IOException e) {
        Toast.makeText(this, "Error", 5000).show();
    }
} 
public String GetAddress(String lat, String lon)
{
    Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
    String ret = "";
    try {
        List<Address> addresses = geocoder.getFromLocation(Double.parseDouble(lat), Double.parseDouble(lon), 1);
        if(addresses != null) {
            Address returnedAddress = addresses.get(0);
            StringBuilder strReturnedAddress = new StringBuilder("Address:\n");
            for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) {
                strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
            }
            ret = strReturnedAddress.toString();
        }
        else{
            ret = "No Address returned!";
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        ret = "Can't get Address!";
    }
    return ret;
}
}

And here is my AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gideon.address"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".AddressActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

回答1:


Move postData off the main thread to a secondary thread. Look at Async task for examples here: http://developer.android.com/reference/android/os/AsyncTask.html




回答2:


Your problem is that

 public void onClick(View v) {
            postData(lat, lon);
        }

runs on the UI thread. It means that while you do the "post" action, the UI isn't refreshed and cannot be accessed - your app get stuck until the post ends.

You need to do something like:

  public void onClick(View v) {
        PostAsyncTask postAsyncTask = new PostAsyncTask();
        postAsyncTask.execute();
    }



 private class PostAsyncTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     postData(lat, lon);
     return 0;
 }

 protected void onPreExecute() {
     // show progress dialog
 }


     protected void onPostExecute(Long result) {
         // hide  progress dialog
     }
 }



回答3:


The solution for the Problem is :

Added a new thread

                             new Thread(new Runnable() {
                    public void run() {
                         // your code goes here
                        postData(lat, lon);
                        }

                  }).start();

        } 

and the code is like :

            Button btnSend = (Button)findViewById(R.id.btnSend);
    btnSend.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                new Thread(new Runnable() {
                    public void run() {
                         // your code goes here
                        postData(lat, lon);
                        }

                  }).start();

        }

    });

And my complete code for AddressActivity.java is like :

package com.gideon.address;

import java.io.IOException;
import java.util.List;
import java.util.Locale;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.content.Context;
 //import android.location.Address;
  //import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class AddressActivity extends Activity {
    /** Called when the activity is first created. */
    String lat="", lon="";
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btnLocation = (Button)findViewById(R.id.btnLocation);
    btnLocation.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
            // Acquire a reference to the system Location Manager
            LocationManager locationManager = (LocationManager)       AddressActivity.this.getSystemService(Context.LOCATION_SERVICE);
            // Define a listener that responds to location updates
            LocationListener locationListener = new LocationListener() {
                public void onLocationChanged(Location location) {
                    // Called when a new location is found by the network location provider.
                    lat = Double.toString(location.getLatitude());
                    lon = Double.toString(location.getLongitude());
                    TextView tv = (TextView) findViewById(R.id.txtLoc);
                    tv.setText("Your Location is:" + lat + "--" + lon);
                }

                public void onStatusChanged(String provider, int status, Bundle extras) {}
                public void onProviderEnabled(String provider) {}
                public void onProviderDisabled(String provider) {}
            };
            // Register the listener with the Location Manager to receive location updates
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
        }
    });

    Button btnSend = (Button)findViewById(R.id.btnSend);
    btnSend.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                new Thread(new Runnable() {
                    public void run() {
                         // your code goes here
                        postData(lat, lon);
                        }

                  }).start();

        }

    });

//  Button btnAdd = (Button)findViewById(R.id.btnAddress);
    //btnAdd.setOnClickListener(new OnClickListener() {
        //public void onClick(View v) {
            //TextView tv = (TextView)findViewById(R.id.txtAddress);
            //tv.setText(GetAddress(lat, lon));
        //}
    //});

}






public void postData(String la, String lo) {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();

    HttpPost httppost = new HttpPost("http://180.178.169.77:6081/"+la+"/"+lo);


    try {

        // Execute HTTP Post Request
        //HttpResponse response = httpclient.execute(htget);
        HttpResponse response = httpclient.execute(httppost);
        //String resp = response.getStatusLine().toStrinkatyg(); try this now 
        //Toast.makeText(this, resp, 5000).show();



    } catch (ClientProtocolException e) {
        //Toast.makeText(this, "Error", 5000).show();
    }
    catch (IOException e) {
        //Toast.makeText(this, "Error", 5000).show();
    }
} 
//public String GetAddress(String lat, String lon)
//{
    //Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
//  String ret = "";
    //try {
        //List<Address> addresses = geocoder.getFromLocation(Double.parseDouble(lat), Double.parseDouble(lon), 1);
        //if(addresses != null) {
            //Address returnedAddress = addresses.get(0);
            //StringBuilder strReturnedAddress = new StringBuilder("Address:\n");
            //for(int i=0; i<returnedAddress.getMaxAddressLineIndex(); i++) {
                //strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
            //}
            //ret = strReturnedAddress.toString();
        //}
        //else{
            //ret = "No Address returned!";
        //}
    //} catch (IOException e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        //ret = "Can't get Address!";
    //}
    //return ret;
//}
}

I don,t need address ,geolocations feature so i commented everything related to it. That was my First working on a Android app so if i m wrong somewhere please guide me and tell me how can i Improve it.

Also please help me if:

1)I want to remove the send location button so that my location automatically goes to my server periodically on the defined time interval say 10 mins.

And the 2nd thing:

2)I want my app to choose the best provider ,GPS or GSM NETWORK , if one is not available send the location using the other.



来源:https://stackoverflow.com/questions/14088095/how-can-i-send-the-gps-and-network-location-cordinates-to-a-server-static-ip

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!