Android中利用LocationManager来获取地理位置信息

1.内容介绍:

在Android应用开发中,可以使用系统框架层(Framework)提供的LocationManager来获取地理位置信息。

2. 例子代码:

第一步,需要在AndroidManifest.xml中添加相关权限。并且,在代码中需要根据版本来动态申请。

<uses-permission android:name="android.permission.ACCESSFINELOCATION"/>
<uses-permission android:name="android.permission.ACCESSCOARSELOCATION"/>

第二步,真正的代码实现如下:

/**
     * 获取Location实例
     * @param context
     * @return
*/
public Location getGpsLocation(Context context) {
        if (!isLocationPermissionGranted(context, LOCATION_TYPE_GPS)) {
            Trace.d(Trace.TagUtil, "user permission of location is not granted!");
            return null;
        }

        LocationManager locationManager = (LocationManager) context.
                getSystemService(Context.LOCATION_SERVICE);
        Location location = null;
        try {
            location = Locations.getLastKnownLocation(locationManager,LocationManager.GPS_PROVIDER);
        } catch (Exception e) {
            Trace.d(e);
        }
        return location;
    }

/**
     * 动态权限申请
     * @param context
     * @param locationType
     * @return
*/

public boolean isLocationPermissionGranted(Context context, int locationType) {
        final int SDK = Build.VERSION.SDK_INT;
        final int Q = 29;
        boolean isQ = SDK == Q - 1 && getPreviewSDKInt() > 0 || Build.VERSION.SDK_INT >= Q;
        if (isQ) {
            int targetSdkVersion = context.getApplicationInfo().targetSdkVersion;
            if (targetSdkVersion > 28) {
                if (CurrentStateUtil.isAppForground()) {
                    return checkLocationPermission(locationType);
                } else {
                    return checkLocationPermission(locationType) && Utils.checkSelfPermission(context,
                            "android.permission.ACCESS_BACKGROUND_LOCATION") == PackageManager.PERMISSION_GRANTED;
                }
            } else {
                // System is Android Q
                return checkLocationPermission(locationType);
            }
        } else {
            // System is NOT Android Q
            return checkLocationPermission(locationType);
        }
    }

/**
     * 动态权限申请进一步封装
     * @param locationType
     * @return
*/
private boolean checkLocationPermission(int locationType) {
        if (locationType == LOCATION_TYPE_GPS) {
            // GPS_PROVIDER need : ACCESS_FINE_LOCATION
            return Utils.getPermissionSafety(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
        } else if (locationType == LOCATION_TYPE_NET) {
            // NETWORK_PROVIDER need : either ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION
            return Utils.getPermissionSafety(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED ||
                    Utils.getPermissionSafety(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
        } else {
            return false;
        }
    }

动态获取权限工具类:

    public static int getPermissionSafety(String permisson) {
        int ret = PackageManager.PERMISSION_DENIED;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            try {
                Context ctx = ExtensionContext.getInstance().context;
                if (ctx != null)
                    ret = checkSelfPermission(ctx, permisson);
            } catch (Exception e) {
                Trace.e("util", "getPermissSafety Exception " + e.toString());
            }
        } else {
            try {
                Context ctx = ExtensionContext.getInstance().context;
                if (ctx != null)
                    ret = ctx.getPackageManager().checkPermission(permisson, ctx.getPackageName());
//                ret = ctx.checkCallingOrSelfPermission(permisson);
            } catch (Exception e) {
                Trace.e("util", "getPermissSafety Exception " + e.toString());
            }
        }
        return ret;
    }

第三步,在Activity中调用:

private String getLocationInfo(Location location) { 
        String latLongStr; 
        TextView lo=(TextView)findViewById(R.id.textView1); 
        if(location!=null){ 
            double lat=location.getLatitude(); 
            double lng=location.getLongitude(); 
            latLongStr="lat:"+lat+";lng:"+lng; 
        }else { 
            latLongStr="";
        }
        return latLongStr;   
    } 

说明:

getLocationInfo是自定义Activity中的一个方法,我们将Location作为参数,传入到getLocationInfo方法中,从而得到位置信息,作为字符串返回。


不同的版本,不同的权限处理方式。

上一篇: Android中设置、打开GPS的两种方法,包括反射的应用
下一篇: * daemon not running.starting it now on port 5037 * 问题解决
liranke
博客等级 码龄20年 4939粉丝 594原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值