1

以下是我从其他工作中获得的编码。我正在尝试通过在我的应用程序中进行必要的更改来实现他的一些工作。这里的问题是单击 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;
    }
}
4

1 回答 1

0

自上一个问题以来,您似乎取得了一些进展。

首先,LocationManagerandroids 上的系统是侦听服务,您将其注册为侦听器并允许操作系统在进行更新时通知。这意味着您应该在需要之前OnClick运行您放入方法中的代码。您最好的选择是让您的 Activity 方法在 Activity 启动时注册侦听器,并使用回调作为将新的存储在类变量中的一种方式。OnCreateonLocationChangedLocation

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

至于您为什么它不适用于 GPS 的原因是因为您从未注册 GPS 侦听器。你有这条线的地方:

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

您需要替换此值:

LocationManager.GPS_PROVIDER

同样,正如我之前建议的那样,我真的建议花时间完全理解Android 开发者文档

至于您关于收听来电状态的其他问题,您应该先查看此处TelephonyManager的文档。专门寻找来电的使用及其附加功能。对于拨出电话,谷歌使用Intents。ACTION_PHONE_STATE_CHANGEDACTION_NEW_OUTGOING_CALL

于 2013-04-11T19:50:37.637 回答