Android对6.0及以上的版本做了更强的权限控制。如打电话这种需要动态申请。我推荐使用github上start最多的PermissionsDispatcher作为权限管理。

一,使用的Androidstudio版本为3.5.3

二,使用的permissionsdispatcher版本为3.2.0

github地址为:https://github.com/permissions-dispatcher/PermissionsDispatcher

 

基本步骤如下:AndroidManifest1.将以下行添加到AndroidManifest.xml

2.仓库地址:repositories {  jcenter()  maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' }}3.添加依赖dependencies {  implementation "org.permissionsdispatcher:permissionsdispatcher:${latest.version}"  annotationProcessor "org.permissionsdispatcher:permissionsdispatcher-processor:${latest.version}"}
4.添加代码:package com.***.***.module.my.active;import permissions.dispatcher.NeedsPermission;import permissions.dispatcher.OnNeverAskAgain;import permissions.dispatcher.OnPermissionDenied;import permissions.dispatcher.RuntimePermissions;@RuntimePermissionspublic class EstablishActiveActivity extends BaseActivity implements EstablishActiveContract.View, View.OnClickListener {    private static final String TAG = EstablishActiveActivity.class.getSimpleName();    @Inject    StandardDialog mStandardDialog;    @BindView(R.id.head_title)    TextView mHeadTitle;        protected String[] locationPermissions = {Manifest.permission.ACCESS_COARSE_LOCATION,       Manifest.permission.ACCESS_FINE_LOCATION};    private static final int GPS_REQUEST_CODE = 2000;    private double longitude;    private double latitude;    @Override    protected int getContentViewID() {        return R.layout.activity_establish_active;    }    @Override    protected void injectDagger() {        activityComponent().inject(this);    }    @Override    protected void initViewsAndEvents() {        mActivePresenter.attachView(this);        mHeadTitle.setText(getString(R.string.establish_create_active));    }
@OnClick(R.id.establish_exercise_location_layout)public void onViewClicked(View view) {    switch (view.getId()) {        case R.id.establish_exercise_location_layout:            SoftInputManager.closeSoftInput(this, mTvLocation);            if (!checkPermissions(mContext, locationPermissions)) {//是否有定位权限                EstablishActiveActivityPermissionsDispatcher.getLocationWithPermissionCheck(this);                return;            }            if (!isGPSOpen(mContext)) {//是否打开GPS                mStandardDialog.show();                mStandardDialog.setTitle(getString(R.string.permission_title));                mStandardDialog.setContent(getString(R.string.permission_location));                mStandardDialog.setOk(getString(R.string.goto_set));                mStandardDialog.setCancel(getString(R.string.cancel));                mStandardDialog.setOnDialogClickListener(new StandardDialog.OnDialogClickListener() {                    @Override                    public void btnOkClick() {                        //跳转GPS设置界面                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);                        startActivityForResult(intent, GPS_REQUEST_CODE);                    }                    @Override                    public void btnCancelClick() {                    }                });                return;            }            MapPointActivity.actionStart(this);            break;    }}    /**     * 权限操作   定位权限     * 相关操作在@NeedsPermission,@OnPermissionDenied,@OnNeverAskAgain中都有     */    //获取权限    @NeedsPermission({Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})    void getLocation() {//同意权限    }    //拒绝权限    @OnPermissionDenied({Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})    void getLocationDenied() {        if (!mStandardDialog.isShowing()) {            mStandardDialog.show();            mStandardDialog.setTitle(getString(R.string.permission_title));            mStandardDialog.setContent(getString(R.string.permission_location));            mStandardDialog.setOk(getString(R.string.goto_set));            mStandardDialog.setCancel(getString(R.string.cancel));            mStandardDialog.setOnDialogClickListener(new StandardDialog.OnDialogClickListener() {                @Override                public void btnOkClick() {                    JumpPermissionUtil.SystemConfig(EstablishActiveActivity.this);                }                @Override                public void btnCancelClick() {                }            });        }    }    //不在提醒权限    @OnNeverAskAgain({Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION})    void externalLocationNever() {        if (!mStandardDialog.isShowing()) {            mStandardDialog.show();            mStandardDialog.setTitle(getString(R.string.permission_title));            mStandardDialog.setContent(getString(R.string.permission_location));            mStandardDialog.setOk(getString(R.string.goto_set));            mStandardDialog.setCancel(getString(R.string.cancel));            mStandardDialog.setOnDialogClickListener(new StandardDialog.OnDialogClickListener() {                @Override                public void btnOkClick() {                    JumpPermissionUtil.SystemConfig(EstablishActiveActivity.this);                }                @Override                public void btnCancelClick() {                }            });        }    }    @Override    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        // 注意:将权限处理委托给生成的方法。        EstablishActiveActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);    }}
/** * 检查权限是否开启 */public static boolean checkPermissions(Context context, String[] permissions) {    for (String permission : permissions) {        if (ContextCompat.checkSelfPermission(context, permission)                != PackageManager.PERMISSION_GRANTED) {            return false;        }    }    return true;}/** * 判断GPS是否开启,GPS或者AGPS开启一个就认为是开启的 * * @return true 表示开启 */public static boolean isGPSOpen(final Context context) {    LocationManager locationManager            = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);    if (locationManager != null) {        // 通过GPS卫星定位,定位级别可以精确到街(通过24颗卫星定位,在室外和空旷的地方定位准确、速度快)        boolean gps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);        // 通过WLAN或移动网络(3G/2G)确定的位置(也称作AGPS,辅助GPS定位。主要用于在室内或遮盖物(建筑群或茂密的深林等)密集的地方定位)        boolean network = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);        if (gps || network) {            return true;        }    }    return false;}

4.EstablishActiveActivityPermissionsDispatcher类需要如下图操作才可以对应生成,规则是当前类名+PermissionsDispatcher。

更多相关文章

  1. 短信拦截与外拨电话拦截中的Action与权限
  2. Android(安卓)smb共享文件的下载
  3. Android(安卓)6.0 权限管理工具类
  4. Gallery初始化显示到指定位置
  5. 使用广播实现的Android关机及重启
  6. ubuntu10 集成android创建工程出错解决
  7. Android开发1——查找所需要出示权限的内容
  8. 开始搞个android定位demo(1)
  9. Android(安卓)为【apk】文件签名,增加修改系统时间等权限

随机推荐

  1. PHP的imageTtfText()函数深入详解
  2. php array_map()函数实例用法
  3. JSP 获取真实IP地址的代码
  4. php中使用array_filter()函数过滤数组实
  5. jdbc连接数据库步骤深刻分析
  6. windows系统php环境安装swoole具体步骤
  7. 模态框案例实战
  8. 透视怎么绘画?漫画背景透视画法步骤
  9. 通过vue学习react(四) - watch,computed,
  10. 初学者如何画脚部?动漫人物脚部画法步骤