当Google更新到6.0以后为了用户的安全考虑.增加了权限问题,需要用户自己手动的开启权限.因此对于一些非开发人员,有的时候对于app的使用过程中会感觉到很困惑.一些功能无法使用.因此需要开发者去判断用户手机是否高于6.0,或者api23,如果高于的话就让用户自己去开启权限,代码包含一个封装的工具类.你也可以添加其他权限的信息.还有一个就是activity
工具类:
public class UserPermissionUtil {
// 要申请的权限
//本权限为获取到当前的位置,如果你有需要可以添加其他权限
public String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION};
public Dialog dialog;
//传递过来的activity
public Activity mActivity;
/**
* 构造函数
* @param mActivity 为传递过来的上下文
*/
public UserPermissionUtil(Activity mActivity) {
this.mActivity = mActivity;
}
/**
* 判断当前的权限是否满足条件
*/
public void getVersion() {
// 版本判断。当手机系统大于 23 时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(mActivity, permissions[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 如果没有授予该权限,就去提示用户请求
showDialogTipUserGoToAppSettting();
}
}
}
/**
* 弹出对话框.首都添加权限
*/
public void showDialogTipUserGoToAppSettting() {
dialog = new AlertDialog.Builder(mActivity)
.setTitle("获取当前位置权限")
.setMessage("请在-应用设置-权限-中,允许地图获取手机的位置权限")
.setPositiveButton("立即开启", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 跳转到应用设置界面
goToAppSetting();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).setCancelable(false).show();
}
/**
* 跳转到手动开启权限页面
*/
public void goToAppSetting() {
//通过意图打开权限页面,手动的开启权限
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", mActivity.getPackageName(), null);
intent.setData(uri);
//第二种开启activity的方式,不详细介绍.可以自己查一下
mActivity.startActivityForResult(intent, 123);
}
}
也是菜鸟,希望各大神指点
public class MainActivity extends AppCompatActivity implements AMapLocationListener {
private MapView mMapView;
private AMap aMap;
private UiSettings mUiSettings;//定义一个UiSettings对象
public double longitude;
public double latitude;
//声明AMapLocationClient类对象
public AMapLocationClient mLocationClient = null;
//声明定位回调监听器
public AMapLocationListener mLocationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//可在其中解析amapLocation获取相应内容。
int locationType = aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
latitude = aMapLocation.getLatitude();
longitude = aMapLocation.getLongitude();
aMapLocation.getAccuracy();//获取精度信息
aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
aMapLocation.getCountry();//国家信息
aMapLocation.getProvince();//省信息
aMapLocation.getCity();//城市信息
aMapLocation.getDistrict();//城区信息
aMapLocation.getStreet();//街道信息
aMapLocation.getStreetNum();//街道门牌号信息
aMapLocation.getCityCode();//城市编码
aMapLocation.getAdCode();//地区编码
aMapLocation.getAoiName();//获取当前定位点的AOI信息
aMapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
//获取定位时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date);
// 设置当前地图显示为当前位置
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 15));
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(new LatLng(latitude, longitude));
markerOptions.title("当前位置");
markerOptions.visible(true);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.dizhi));
markerOptions.icon(bitmapDescriptor);
aMap.addMarker(markerOptions);
} else {
//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
}
}
}
};
//声明AMapLocationClientOption对象
public AMapLocationClientOption mLocationOption = null;
private UserPermissionUtil util;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//'首先判断当前的权限问题
util = new UserPermissionUtil(this);
util.getVersion();
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
mMapView.onCreate(savedInstanceState);
//初始化地图变量
if (aMap == null) {
aMap = mMapView.getMap();
}
// mUiSettings = aMap.getUiSettings();//实例化UiSettings类
// mUiSettings.setScaleControlsEnabled(true);//显示比例尺控件
//
// LatLng latLng = new LatLng(latitude, longitude);
// final Marker marker = aMap.addMarker(new MarkerOptions().
// position(latLng).
// title("北京").
// snippet("DefaultMarker"));
//
MarkerOptions markerOption = new MarkerOptions();
markerOption.position(latLng);
markerOption.title("西安市").snippet("西安市:39.906901,116.397972");
markerOption.draggable(true);
//
// Animation animation = new RotateAnimation(marker.getRotateAngle(), marker.getRotateAngle() + 180, 0, 0, 0);
// long duration = 1000L;
// animation.setDuration(duration);
// animation.setInterpolator(new LinearInterpolator());
//
// marker.setAnimation(animation);
// marker.startAnimation();
// Circle circle = aMap.addCircle(new CircleOptions().
// center(latLng).
// radius(10000).
// fillColor(Color.argb(50, 1, 1, 1)).
// strokeColor(Color.argb(50, 1, 1, 1)).
// strokeWidth(15));
initPosition();
}
/**
* 初始化定位
*/
private void initPosition() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(mLocationListener);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(true);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
// mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
mMapView.onSaveInstanceState(outState);
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 123) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
// 检查该权限是否已经获取
int i = ContextCompat.checkSelfPermission(this, util.permissions[0]);
// 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
if (i != PackageManager.PERMISSION_GRANTED) {
// 提示用户应该去应用设置界面手动开启权限
util.showDialogTipUserGoToAppSettting();
} else {
Toast.makeText(this, "权限获取成功", Toast.LENGTH_SHORT).show();
initPosition();
}
}
}
}
}