簡體   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