繁体   English   中英

无法使用经度和纬度Android获取地址

[英]Can't Get address using Longitude & Latitude Android

我正在尝试从经度和纬度获取地址,但无法获取地址。 我要隆吉了。 和拉提。 值,但是当我将其传递给getAddress函数时,它将停止工作。如果可以的话,请帮我。 这是我的代码

MainActivity.java文件

package com.example.mygps;

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

import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
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 MainActivity extends Activity {

    Button btnGet;
    GPS_Class gps;
    TextView adr,cty,ctry;

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

        btnGet = (Button)findViewById(R.id.btnGo);
        adr = (TextView)findViewById(R.id.adr);
        cty = (TextView)findViewById(R.id.cty);
        ctry = (TextView)findViewById(R.id.ctry);

        btnGet.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                gps = new GPS_Class(MainActivity.this);
                if(gps.canGetLocation())
                {

                    longi = gps.getLongitude();
                    lati = gps.getLatitude();
                    Toast.makeText(MainActivity.this, "Longitude is:"+longi+"Latidute is:"+lati, Toast.LENGTH_LONG).show();
                    getAddress(longi, lati);
                }
                else
                {
                    gps.showSettingsAlert();

                }
            }
        });

    }

    public void getAddress(double longitude, double latitude)
    {
        double long1,lati1;
        long1 = longitude;
        lati1 = latitude;
        if(lati>0 && long1>0)
        {
        Geocoder geocode = new Geocoder(this, Locale.getDefault());
        List<Address> addresses;

        try {
            addresses = geocode.getFromLocation(latitude,longitude, 1);

            String Addres_ = addresses.get(0).getAddressLine(0);
            String Country = addresses.get(0).getCountryName();
            String City = addresses.get(0).getLocality();

            adr.setText(Addres_);
            cty.setText(City);
            ctry.setText(Country);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            }
        }//if closing. . . 
        else
        {
            Toast.makeText(this, "No Vlaue", Toast.LENGTH_LONG).show();
        }


    }
}

我的GPS_Class.java文件代码

package com.example.mygps;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;

public class GPS_Class extends Service implements LocationListener{



    //To Get Context of the class...
    Context context;

    //Declaring Variable to use. . .
    double lattitude;
    double longitude;

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;

    boolean isGPSEnabled = false;
    boolean isNetWorkEnabled = false;
    boolean canGetLocation = false;

    //Declaring objects of different classes...
    Location location;
    LocationManager locationmanager;

    public GPS_Class(Context context) {
        this.context = context;
        GetLocation();
    }

    //Self Coded Function to perform all location works . . .
    private Location GetLocation()
    {
        locationmanager = (LocationManager)context.getSystemService(LOCATION_SERVICE);  

        isGPSEnabled = locationmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);

        isNetWorkEnabled = locationmanager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if(isNetWorkEnabled)
        {
            canGetLocation = true;
            locationmanager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES,this);

            if(locationmanager !=null)
            {
                location = locationmanager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if(location !=null)
                {
                    lattitude = location.getLatitude();
                    longitude = location.getLongitude();
                }
            }
        }

        if(isGPSEnabled)
        {
            canGetLocation = true;
            if(location == null)
            {
            locationmanager.requestLocationUpdates(LocationManager.GPS_PROVIDER,MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES,this);
            if(locationmanager != null)
            {
                location = locationmanager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

                if(location!=null)
                {
                    lattitude = location.getLatitude();
                    longitude = location.getLongitude();
                }
            }
        }
        }

        return location;
    }

     public void showSettingsAlert(){
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);

            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");

            // Setting Dialog Message
            alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");

            // On pressing Settings button
            alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int which) {
                    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                    context.startActivity(intent);
                }
            });

            // on pressing cancel button
            alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                dialog.cancel();
                }
            });

            // Showing Alert Message
            alertDialog.show();
        }


     public double getLatitude(){
            if(location != null){
                lattitude = location.getLatitude();
            }

            // return latitude
            return lattitude;
        }

    public double getLongitude()
    {
        if(location !=null)
        {
        longitude =location.getLongitude();
        }
        return longitude;
    }

    public boolean canGetLocation() {
        return this.canGetLocation;
    }
    @Override
    public void onLocationChanged(Location arg0) {
        // TODO Auto-generated method stub

    }

    @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

    }

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


}

解决方案上面提到的代码很好,它可以获取当前位置。 如果您尝试在模拟器上运行它,则会显示错误,因为“ Geocoder”类与模拟器不兼容。 在正常运行的设备上运行它。

尝试改变thisMainActivity.thisgetAddress方法:

Geocoder geocode = new Geocoder(MainActivity.this, Locale.getDefault());

getFromLocation方法抛出。 因此,请检查您的纬度值。 它不在正确的范围内:

IllegalArgumentException    if latitude is less than -90 or greater than 90

IllegalArgumentException    if longitude is less than -180 or greater than 180

IOException if the network is unavailable or any other I/O problem occurs

实际的功能是getFromLocation(double latitude, double longitude, int maxResults) 您正在通过longitude代替latitudelatitude代替longitude 尝试更改此行:

addresses = geocode.getFromLocation(longitude, latitude, 1);

对此:

addresses = geocode.getFromLocation(latitude, longitude, 1);

并且还要在访问数组之前向数组添加null和大小检查,以避免NullPointerExceptionIndexOutOfBoundException因为文档说它可以返回null数组

if (addresses != null && addresses.size() > 0) {
    String Addres_ = addresses.get(0).getAddressLine(0);
    String Country = addresses.get(0).getCountryName();
    String City = addresses.get(0).getLocality();

    adr.setText(Addres_);
    cty.setText(City);
    ctry.setText(Country);
} else {
    // Reset fields here
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM