LocationManager的使用

MainActivity.java

package com.sdutacm.locationservice;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity implements LocationListener{

    //android中进行地理位置定位主要使用的类是LocationManager类,
    //使用LocationManager的方法就先使用其他服务,只需要调用getSystemService()就能获得他的实例,
    // 并获得他的引用,当然这里需要传入参数Context.LOCATION_SERVICE
    LocationManager locationManager;
    //当获得Location对象后,直接通过LocationManager调用LastKnownLocation()方法就可以获得Location对象,
    //而Location类正是保存位置信息的类
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
        initLocation();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(locationManager != null){
            checkPermission(new String[]{
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
            });
            //解除监听
            locationManager.removeUpdates(this);
            locationManager =null;
        }
    }
    private void initLocation() {
        checkPermission(new String []{
            Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION
        });
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //这里使用GPS位置提供者作为案例
        Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        //监听位置变化,每个两秒且距离差距为10米时更新位置信息,这助于控制电量
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,10,this);
        if(location != null){
            Log.d("location","1 纬度: "+location.getLatitude()+",经度: "+location.getLongitude());
            getLocation(location);
        }
    }

    private void getLocation(Location location) {
        Log.d("location","123321");
        Geocoder geocoder = new Geocoder(this);
        Log.d("location","123");
        if(geocoder.isPresent()){
            Log.d("location","geocoder is OK");
        }


        try {
            Log.d("location","123456");
            //使用Geocoder获得具体的地址,参数为纬度和经度
            List<Address> addresses = new ArrayList<Address>();
            addresses = geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);

                Log.d("location","as is the "+geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1));

            Log.d("location","123654addresses.get(0) is the "+addresses.get(0));

            Address address = addresses.get(0);
            Log.d("location","12333333");
            Log.d("location","address is the "+address+" addresses.get(0) "+addresses.get(0));
            Log.d("location",address.getAddressLine(1)+address.getFeatureName());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onLocationChanged(Location location) {
        //当符合监听条件时,会更新地理位置
        Log.d("location","纬度: "+location.getLatitude()+", 经度"+location.getLatitude());
        getLocation(location);
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }
    private void checkPermission(String[] permissions) {
        int permission_granted = PackageManager.PERMISSION_GRANTED;
        boolean flag = false;
        for (int i=0;i<permissions.length;i++){
            int checkPermission = ActivityCompat.checkSelfPermission(this,permissions[i]);
            if(permission_granted != checkPermission){
                flag = true;
                break;
            }
        }
        if(flag){
            ActivityCompat.requestPermissions(this,permissions,111);
            return;
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode){
            case 111:
                if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    Toast.makeText(this,"获取权限成功!",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(this,"获取权限失败",Toast.LENGTH_SHORT).show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }

    }
}
原文地址:https://www.cnblogs.com/CCCrunner/p/11781867.html