热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android6.0动态权限及跳转GPS设置界面的方法

今天小编就为大家分享一篇Android6.0动态权限及跳转GPS设置界面的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

1.动态权限申请

模糊的位置信息android.permission.ACCESS_COARSE_LOCATION权限为例

在AndroidManifest文件中加入权限

1
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

然后java代码中动态申请

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//动态申请权限的测试方法
public void test() {
 // 要申请的权限 数组 可以同时申请多个权限
 String[] permissiOns= {Manifest.permission.ACCESS_COARSE_LOCATION};
 
 if (Build.VERSION.SDK_INT >= 23) {
  //如果超过6.0才需要动态权限,否则不需要动态权限
  //如果同时申请多个权限,可以for循环遍历
  int check = ContextCompat.checkSelfPermission(this,permissions[0]);
  // 权限是否已经 授权 GRANTED---授权 DINIED---拒绝
  if (check == PackageManager.PERMISSION_GRANTED) {
   //写入你需要权限才能使用的方法
   run();
  } else {
   //手动去请求用户打开权限(可以在数组中添加多个权限) 1 为请求码 一般设置为final静态变量
   requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
  }
 } else {
  //写入你需要权限才能使用的方法
  run();
 }
}

其中run()为你自己需要权限才能执行的方法

然后重写申请权限的回掉方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
          @NonNull int[] grantResults) {
 super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 //回调,判断用户到底点击是还是否。
 //如果同时申请多个权限,可以for循环遍历
 if (requestCode == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  //写入你需要权限才能使用的方法
  run();
 } else {
  // 没有获取 到权限,从新请求,或者关闭app
  Toast.makeText(this,"需要获得XXX权限",Toast.LENGTH_SHORT).show();
 }
}

2.跳转GPS设置界面

相关字符串

1
2
3
4
5
<string name="notifyTitle">提示</string>
<string name="notifyMsg">当前应用缺少必要权限。\n\n请点击\"设置\"-\"权限\"-打开所需权限。</string>
<string name="gpsNotifyMsg">当前应用需要打开定位功能。\n\n请点击\"设置\"-\"定位服务\"-打开定位功能。</string>
<string name="setting">设置</string>
<string name="cancel">取消</string>

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
private int GPS_REQUEST_CODE = 10;
 
/**
 * 检测GPS是否打开
 *
 * @return
 */
private boolean checkGPSIsOpen() {
 boolean isOpen;
 LocationManager locatiOnManager= (LocationManager) this
   .getSystemService(Context.LOCATION_SERVICE);
 isOpen = locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
 return isOpen;
}
 
/**
 * 跳转GPS设置
 */
private void openGPSSettings() {
 if (checkGPSIsOpen()) {
  initLocation(); //自己写的定位方法
 } else {
  //没有打开则弹出对话框
  new AlertDialog.Builder(this)
    .setTitle(R.string.notifyTitle)
    .setMessage(R.string.gpsNotifyMsg)
    // 拒绝, 退出应用
    .setNegativeButton(R.string.cancel,
      new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int which) {
        finish();
       }
      })
 
    .setPositiveButton(R.string.setting,
      new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog, int which) {
        //跳转GPS设置界面
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, GPS_REQUEST_CODE);
       }
      })
 
    .setCancelable(false)
    .show();
 
 }
}
 
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 if (requestCode == GPS_REQUEST_CODE) {
  //做需要做的事情,比如再次检测是否打开GPS了 或者定位
  openGPSSettings();
 }
}

最后在需要的地方调用 openGPSSettings()方法。

效果(是在相关权限是已经申请好的情况下的效果)

3.下面是我在高德地图Demo中看见的检测权限的Activity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
public class CheckPermissionsActivity extends Activity implements
  ActivityCompat.OnRequestPermissionsResultCallback {
 /**
  * 需要进行检测的权限数组
  */
 protected String[] needPermissiOns= {
   Manifest.permission.ACCESS_COARSE_LOCATION,
   Manifest.permission.ACCESS_FINE_LOCATION,
   Manifest.permission.WRITE_EXTERNAL_STORAGE,
   Manifest.permission.READ_EXTERNAL_STORAGE,
   Manifest.permission.READ_PHONE_STATE
 };
 
 private static final int PERMISSON_REQUESTCODE = 0;
 private static final int SETTING_REQUESTCODE = 1;
 
 /**
  * 判断是否需要检测,防止不停的弹框
  */
 private boolean isNeedCheck = true;
 
 @Override
 protected void onResume() {
  super.onResume();
  if (isNeedCheck) {
   checkPermissions(needPermissions);
  }
 }
 
 /**
  * @param permissions
  * @since 2.5.0
  */
 private void checkPermissions(String... permissions) {
  List<string> needRequestPermissOnList= findDeniedPermissions(permissions);
  if (null != needRequestPermissonList
    && needRequestPermissonList.size() > 0) {
   ActivityCompat.requestPermissions(this,
     needRequestPermissonList.toArray(
       new String[needRequestPermissonList.size()]),
     PERMISSON_REQUESTCODE);
  }
 }
 
 /**
  * 获取权限集中需要申请权限的列表
  *
  * @param permissions
  * @return
  * @since 2.5.0
  */
 private List<string> findDeniedPermissions(String[] permissions) {
  List<string> needRequestPermissOnList= new ArrayList<string>();
  for (String perm : permissions) {
   if (ContextCompat.checkSelfPermission(this,
     perm) != PackageManager.PERMISSION_GRANTED
     || ActivityCompat.shouldShowRequestPermissionRationale(
     this, perm)) {
    needRequestPermissonList.add(perm);
   }
  }
  return needRequestPermissonList;
 }
 
 /**
  * 检测是否说有的权限都已经授权
  *
  * @param grantResults
  * @return
  * @since 2.5.0
  */
 private boolean verifyPermissions(int[] grantResults) {
  for (int result : grantResults) {
   if (result != PackageManager.PERMISSION_GRANTED) {
    return false;
   }
  }
  return true;
 }
 
 @Override
 public void onRequestPermissionsResult(int requestCode,
           String[] permissions, int[] paramArrayOfInt) {
  if (requestCode == PERMISSON_REQUESTCODE) {
   if (!verifyPermissions(paramArrayOfInt)) {
    showMissingPermissionDialog();
    isNeedCheck = false;
   }
  }
 }
 
 /**
  * 显示提示信息
  *
  * @since 2.5.0
  */
 private void showMissingPermissionDialog() {
  AlertDialog.Builder builder = new AlertDialog.Builder(this);
  builder.setTitle(R.string.notifyTitle);
  builder.setMessage(R.string.notifyMsg);
 
  // 拒绝, 退出应用
  builder.setNegativeButton(R.string.cancel,
    new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      finish();
     }
    });
 
  builder.setPositiveButton(R.string.setting,
    new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      startAppSettings();
     }
    });
 
  builder.setCancelable(false);
 
  builder.show();
 }
 
 /**
  * 启动应用的设置
  *
  * @since 2.5.0
  */
 private void startAppSettings() {
  Intent intent = new Intent(
    Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  intent.setData(Uri.parse("package:" + getPackageName()));
  startActivityForResult(intent, SETTING_REQUESTCODE);
 }
 
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
  if (keyCode == KeyEvent.KEYCODE_BACK) {
   this.finish();
   return true;
  }
  return super.onKeyDown(keyCode, event);
 }
 
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == SETTING_REQUESTCODE) {
   checkPermissions(needPermissions);
  }
 }
}</string></string></string></string>

继承于CheckPermissionsActivity即可

不允许就跳转系统设置界面,若没设置再次检测权限并申请,直到允许为止。可和GPS设置搭配使用

以上这篇Android 6.0动态权限及跳转GPS设置界面的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


推荐阅读
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 如何在WPS Office for Mac中调整Word文档的文字排列方向
    本文将详细介绍如何使用最新版WPS Office for Mac调整Word文档中的文字排列方向。通过这些步骤,用户可以轻松更改文本的水平或垂直排列方式,以满足不同的排版需求。 ... [详细]
  • 本文总结了在使用Ionic 5进行Android平台APK打包时遇到的问题,特别是针对QRScanner插件的改造。通过详细分析和提供具体的解决方法,帮助开发者顺利打包并优化应用性能。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
author-avatar
無名--小貞貞貞貞貞貞貞貞_微博_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有