使用wifi /移动网络更新位置不正确,但使用GPS无法更新

时间:2013-04-11 19:33:38

标签: android gps location android-wifi

以下是我从其他人那里得到的编码。我正在尝试通过我的应用程序中的必要更改来实现他的工作。这里的问题是,当单击GET ADDRESS按钮时,它没有返回正确的地址。此外,它只适用于wifi /移动网络,但不适用于GPS。同时,我想知道如何在呼叫联系时自动发布数据到服务器。谢谢!

package com.yang.address;

import java.io.IOException;
import java.util.ArrayList;
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. */
    Double 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 = location.getLatitude();
                        lon = 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(Double lat2, Double lon2) {
        // Create a new HttpClient and Post Header
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet  htget = new HttpGet("http://myappurl.com/Home/Book/"+lat2+"/"+lon2);

        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(Double lat2, Double lon2)
    {
        Geocoder geocoder = new Geocoder(this, Locale.ENGLISH);
        String ret = "";
        try {
            List<Address> addresses = geocoder.getFromLocation(lat2,lon2, 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;
    }
}

1 个答案:

答案 0 :(得分:0)

看起来自上次提问以来你取得了一些进展。

首先,androids上的LocationManager系统是Listening Service,因为您将其注册为侦听器并允许操作系统在进行更新时通知。这意味着您需要在之前运行<{1}}方法中的代码。您最好的选择是让Activity的OnClick方法在Activity启动时注册监听器,并使用OnCreate回调作为将新onLocationChanged存储在类变量上的方法。 / p>

Location

至于你为何不使用GPS的原因,那是因为你从未注册过GPS监听器。你有这条线的地方:

private Location lastKnownLocation;
private TextView tv;

public void onCreate(Bundle savedInstanceState) {
  //....
  setupLocationServices();
  //....
  tv = (TextView) findViewById(R.id.txtLoc);
  Button btnLocation = (Button)findViewById(R.id.btnLocation);
  btnLocation.setOnClickListener(new OnClickListener() {
    public void onClick(View arg0) {
      updateLocation();
    }
  });
  //....
}

private void setupLocationServices() {
  //....
  LocationListener locationListener = new LocationListener() {
  public void onLocationChanged(Location location) {
    // Called when a new location is found by the network location provider.
    lastKnownLocation = location;
    updateLocation();
  }
  ....
}

private void updateLocation() {
  double lat = lastKnownLocation.getLatitude();
  double lat = lastKnownLocation.getLongitude();
  tv.setText("Your Location is:" + lat + "--" + lon);
}

您需要在此值中使用substitude:

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

同样,正如我之前建议的那样,我真的建议花时间充分理解Android Developer documentation

至于您关于收听来电状态的其他问题,您应该先查看LocationManager.GPS_PROVIDER 文档here。具体来说,请查看TelephonyManager及其附加内容对来电的使用情况。对于拨出电话谷歌使用ACTION_PHONE_STATE_CHANGED意图。