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方法中,从而得到位置信息,作为字符串返回。
不同的版本,不同的权限处理方式。



被折叠的 条评论
为什么被折叠?



