安卓6.0动态权限定位权限怎么打开

安卓怎么控制定位权限?
有个s助手 经常性的定位 还删不掉 有没有类似苹果一样可以控制软件定位权限的?
安全,应用程序许可里试试。我觉得S助手挺好用的呢……或者关了它[img]./mon_/-7_556fa.png[/img][img]./mon_/-7_556fa3aac57cb.png[/img]
360手机助手极客版
[quote][pid=37345,1]Reply[/pid] [b]Post by [uid=]我先骑个墙[/uid] ( 09:02):[/b]安全,应用程序许可里试试。我觉得S助手挺好用的呢……或者关了它[img]./mon_/-7_556fa.png[/img][img]./mon_/-7_556fa3aac57cb.png[/img][/quote]好像系统不同啊 我没找到s助手 只有自己的装的一些[img]./mon_/-7_556fab6552b89.png[/img]
S助手?三星的?4.4版本以上设置
找到应用权限许可,读一遍上面的字你就明白了
[b]Reply to [pid=37345,1]Reply[/pid] Post by [uid=]Lasthome[/uid] ( 09:48)[/b]表示完全找不到。。。。系统5。0。2 怎么破 只有自己安装的能控制
[quote][pid=37345,1]Reply[/pid] [b]Post by [uid=412717]rockgom[/uid] ( 09:50):[/b][b]Reply to [pid=37345,1]Reply[/pid] Post by [uid=]Lasthome[/uid] ( 09:48)[/b]表示完全找不到。。。。系统5。0。2 怎么破 只有自己安装的能控制[/quote]看你尾巴是s6。应该可以直接干掉预装软件,如果干不掉,你试试在应用程序里的
然后找到s助手
看看选项是否有关闭
还是只有 强行停止?
随便一个权限软件都可以关了
[quote][pid=37345,1]Reply[/pid] [b]Post by [uid=]gengzi、、[/uid] ( 10:18):[/b]随便一个权限软件都可以关了[/quote]楼主肯定是不想root才来问的啊,权限软件要root啊。再说现在为了实现这一个功能去root没必要
发个图,我关闭的预装,不主动启动他们
他们一辈子都不会启动。我现在去售后刷完系统就没折腾过[img]./mon_/-7_556fb740c47fd.png[/img]
设置里不是可以关闭定位么
[quote][pid=37345,1]Reply[/pid] [b]Post by [uid=]Lasthome[/uid] ( 10:27):[/b]楼主肯定是不想root才来问的啊,权限软件要root啊。再说现在为了实现这一个功能去root没必要
发个图,我关闭的预装,不主动启动他们
他们一辈子都不会启动。我现在去售后刷完系统就没折腾过[img]./mon_/-7_556fb740c47fd.png[/img][/quote]多谢 我就是不想折腾root 请教下你是怎么关掉的
[quote][pid=37345,1]Reply[/pid] [b]Post by [uid=]Lasthome[/uid] ( 10:13):[/b]看你尾巴是s6。应该可以直接干掉预装软件,如果干不掉,你试试在应用程序里的
然后找到s助手
看看选项是否有关闭
还是只有 强行停止?[/quote]有强行停止 但是好像会自启动?
[quote][pid=37345,1]Reply[/pid] [b]Post by [uid=412717]rockgom[/uid] ( 10:51):[/b]有强行停止 但是好像会自启动?[/quote]只有强行停止的话 机器重启以后是会再启动的,没有关闭选项的都不会跟我发图那样。但是你还是好好找找吧,或者你
他刚买完就卸载预装了。
所有权限都在一起,想关自己划叉[img]./mon_/-7_556fde03195d9.png[/img]Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应用权限. 时代总是不断发展, 程序总是以人为本, 让我们为应用添加动态权限管理吧! 这里提供了一个非常不错的解决方案, 提供源码, 项目可以直接使用.
Permissions
Android系统包含默认的授权提示框, 但是我们仍需要设置自己的页面. 原因是系统提供的授权框, 会有不再提示的选项. 如果用户选择, 则无法触发授权提示. 使用自定义的提示页面, 可以给予用户手动修改授权的指导.
本文示例的GitHub
在Api 23中, 权限需要动态获取, 核心权限必须满足. 标准流程:
如果用户点击, 不再提示, 则系统授权弹窗将不会弹出. 流程变为:
流程就这些, 让我们看看代码吧.
在AndroidManifest中, 添加两个权限, 录音和修改音量.
危险权限必须要授权, 一般权限不需要.
检测权限类
假设首页需要使用权限, 在页面显示前, 即onResume时, 检测权限,如果缺少, 则进入权限获取页面; 接收返回值, 拒绝权限时, 直接关闭.
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 0;
核心权限必须满足, 如摄像应用, 摄像头权限就是必须的, 如果用户不予授权, 则直接关闭.
授权页, 首先使用系统默认的授权页, 当用户拒绝时, 指导用户手动设置, 当用户再次操作失败后, 返回继续提示. 用户手动退出授权页时, 给使用页发送授权失败的通知.
注意isRequireCheck参数的使用, 防止和系统提示框重叠.系统授权提示: ActivityCompat.requestPermissions, ActivityCompat兼容低版本.
自定义授权
关键部分就这些了, 动态权限授权虽然给程序员带来了一些麻烦, 但是对用户还是很有必要的, 我们也应该欢迎, 毕竟每个程序员都是半个产品经理.
危险权限列表
阅读(...) 评论()Android6.0动态权限申请步骤以及需要注意的一些坑 - 简书
Android6.0动态权限申请步骤以及需要注意的一些坑
因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo。算是自己的笔记吧,可能会比较混乱,主要是方便以后查看。后期有别的问题,随时更新~
6.0权限的基本知识,以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTS
group:android.permission-group.PHONE
permission:android.permission.READ_CALL_LOG
permission:android.permission.READ_PHONE_STATE
permission:android.permission.CALL_PHONE
permission:android.permission.WRITE_CALL_LOG
permission:android.permission.USE_SIP
permission:android.permission.PROCESS_OUTGOING_CALLS
permission:com.android.voicemail.permission.ADD_VOICEMAIL
group:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDAR
group:android.permission-group.CAMERA
permission:android.permission.CAMERA
group:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORS
group:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATION
group:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGE
group:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIO
group:android.permission-group.SMS
permission:android.permission.READ_SMS
permission:android.permission.RECEIVE_WAP_PUSH
permission:android.permission.RECEIVE_MMS
permission:android.permission.RECEIVE_SMS
permission:android.permission.SEND_SMS
permission:android.permission.READ_CELL_BROADCASTS
以下是普通权限,只需要在AndroidManifest.xml中申请即可。
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
将targetSdkVersion设置为23,注意,如果你将targetSdkVersion设置为&=23,则必须按照Android谷歌的要求,动态的申请权限,如果你暂时不打算支持动态权限申请,则targetSdkVersion最大只能设置为22.
在AndroidManifest.xml中申请你需要的权限,包括普通权限和需要申请的特殊权限。
3.开始申请权限,此处分为3部。
(1)检查是否由此权限checkSelfPermission(),如果已经开启,则直接做你想做的。
(2)如果未开启,则判断是否需要向用户解释为何申请权限shouldShowRequestPermissionRationale。
(3)如果需要(即返回true),则可以弹出对话框提示用户申请权限原因,用户确认后申请权限requestPermissions(),如果不需要(即返回false),则直接申请权限requestPermissions()。(这里是一部门代码,底部有比较完善的代码,整个demo可以在github中下载)。
单个权限申请.png
* Requests permission.
* @param activity
* @param requestCode request code, e.g. if you need request CAMERA permission,parameters is PermissionUtils.CODE_CAMERA
public static void requestPermission(final Activity activity, final int requestCode, PermissionGrant permissionGrant) {
if (activity == null) {
Log.i(TAG, "requestPermission requestCode:" + requestCode);
if (requestCode & 0 || requestCode &= requestPermissions.length) {
Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);
final String requestPermission = requestPermissions[requestCode];
//如果是6.0以下的手机,ActivityCompat.checkSelfPermission()会始终等于PERMISSION_GRANTED,
// 但是,如果用户关闭了你申请的权限(如下图,在安装的时候,将一些权限关闭了),ActivityCompat.checkSelfPermission()则可能会导致程序崩溃(java.lang.RuntimeException: Unknown exception code: 1 msg null),
// 你可以使用try{}catch(){},处理异常,也可以判断系统版本,低于23就不申请权限,直接做你想做的。permissionGrant.onPermissionGranted(requestCode);
if (Build.VERSION.SDK_INT & 23) {
permissionGrant.onPermissionGranted(requestCode);
int checkSelfP
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
Toast.makeText(activity, "please open this permission", Toast.LENGTH_SHORT)
Log.e(TAG, "RuntimeException:" + e.getMessage());
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");
shouldShowRationale(activity, requestCode, requestPermission);
Log.d(TAG, "requestCameraPermission else");
ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);
Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");
Toast.makeText(activity, "opened:" + requestPermissions[requestCode], Toast.LENGTH_SHORT).show();
//得到权限的时候,就可以在回调里面做你想做的事情了
permissionGrant.onPermissionGranted(requestCode);
6.0以下系统的应用程序安装界面.png
备注!!!
(1)checkSelfPermission:检查是否拥有这个权限 (2)requestPermissions:请求权限,一般会弹出一个系统对话框,询问用户是否开启这个权限。 (3)shouldShowRequestPermissionRationale:Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。然而,在实际开发中,需要注意的是,很多手机对原生系统做了修改,比如小米,小米4的6.0的shouldShowRequestPermissionRationale 就一直返回false,而且在申请权限时,如果用户选择了拒绝,则不会再弹出对话框了。。。。 所以说这个地方有坑,我的解决方法是,在回调里面处理,如果用户拒绝了这个权限,则打开本应用信息界面,由用户自己手动开启这个权限。(4)每个应用都有自己的权限管理界面,里面有本应用申请的权限以及各种状态,即使用户已经同意了你申请的权限,他也随时可以关闭
权限管理界面.png
一次申请多个权限
其实和申请一个权限是一样的,只是requestPermissions(final @NonNull Activity activity,
final @NonNull String[] permissions, final int requestCode),里面的permissions给的参数多些而已。
申请多个权限.png
* 一次申请多个权限
public static void requestMultiPermissions(final Activity activity, PermissionGrant grant) {
final List&String& permissionsList = getNoGrantedPermission(activity, false);
final List&String& shouldRationalePermissionsList = getNoGrantedPermission(activity, true);
//TODO checkSelfPermission
if (permissionsList == null || shouldRationalePermissionsList == null) {
Log.d(TAG, "requestMultiPermissions permissionsList:" + permissionsList.size() + ",shouldRationalePermissionsList:" + shouldRationalePermissionsList.size());
if (permissionsList.size() & 0) {
ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
} else if (shouldRationalePermissionsList.size() & 0) {
showMessageOKCancel(activity, "should open those permission",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
grant.onPermissionGranted(CODE_MULTI_PERMISSION);
关于权限请求结果的回调。Activity实现ActivityCompat.OnRequestPermissionsResultCallback接口,重写onRequestPermissionsResult方法。
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);
整个申请权限工具类代码
package com.example.android.system.
import android.M
import android.app.A
import android.content.DialogI
import android.content.I
import android.content.pm.PackageM
import android.net.U
import android.provider.S
import android.support.annotation.NonN
import android.support.v4.app.ActivityC
import android.support.v7.app.AlertD
import android.util.L
import android.widget.T
import java.util.ArrayL
import java.util.HashM
import java.util.L
import java.util.M
* Created by qianxiaoai on .
public class PermissionUtils {
private static final String TAG = PermissionUtils.class.getSimpleName();
public static final int CODE_RECORD_AUDIO = 0;
public static final int CODE_GET_ACCOUNTS = 1;
public static final int CODE_READ_PHONE_STATE = 2;
public static final int CODE_CALL_PHONE = 3;
public static final int CODE_CAMERA = 4;
public static final int CODE_ACCESS_FINE_LOCATION = 5;
public static final int CODE_ACCESS_COARSE_LOCATION = 6;
public static final int CODE_READ_EXTERNAL_STORAGE = 7;
public static final int CODE_WRITE_EXTERNAL_STORAGE = 8;
public static final int CODE_MULTI_PERMISSION = 100;
public static final String PERMISSION_RECORD_AUDIO = Manifest.permission.RECORD_AUDIO;
public static final String PERMISSION_GET_ACCOUNTS = Manifest.permission.GET_ACCOUNTS;
public static final String PERMISSION_READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
public static final String PERMISSION_CALL_PHONE = Manifest.permission.CALL_PHONE;
public static final String PERMISSION_CAMERA = Manifest.permission.CAMERA;
public static final String PERMISSION_ACCESS_FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
public static final String PERMISSION_ACCESS_COARSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
public static final String PERMISSION_READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;
public static final String PERMISSION_WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
private static final String[] requestPermissions = {
PERMISSION_RECORD_AUDIO,
PERMISSION_GET_ACCOUNTS,
PERMISSION_READ_PHONE_STATE,
PERMISSION_CALL_PHONE,
PERMISSION_CAMERA,
PERMISSION_ACCESS_FINE_LOCATION,
PERMISSION_ACCESS_COARSE_LOCATION,
PERMISSION_READ_EXTERNAL_STORAGE,
PERMISSION_WRITE_EXTERNAL_STORAGE
interface PermissionGrant {
void onPermissionGranted(int requestCode);
* Requests permission.
* @param activity
* @param requestCode request code, e.g. if you need request CAMERA permission,parameters is PermissionUtils.CODE_CAMERA
public static void requestPermission(final Activity activity, final int requestCode, PermissionGrant permissionGrant) {
if (activity == null) {
Log.i(TAG, "requestPermission requestCode:" + requestCode);
if (requestCode & 0 || requestCode &= requestPermissions.length) {
Log.w(TAG, "requestPermission illegal requestCode:" + requestCode);
final String requestPermission = requestPermissions[requestCode];
//如果是6.0以下的手机,ActivityCompat.checkSelfPermission()会始终等于PERMISSION_GRANTED,
// 但是,如果用户关闭了你申请的权限,ActivityCompat.checkSelfPermission(),会导致程序崩溃(java.lang.RuntimeException: Unknown exception code: 1 msg null),
// 你可以使用try{}catch(){},处理异常,也可以在这个地方,低于23就什么都不做,
// 个人建议try{}catch(){}单独处理,提示用户开启权限。
if (Build.VERSION.SDK_INT & 23) {
int checkSelfP
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
Toast.makeText(activity, "please open this permission", Toast.LENGTH_SHORT)
Log.e(TAG, "RuntimeException:" + e.getMessage());
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED");
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
Log.i(TAG, "requestPermission shouldShowRequestPermissionRationale");
shouldShowRationale(activity, requestCode, requestPermission);
Log.d(TAG, "requestCameraPermission else");
ActivityCompat.requestPermissions(activity, new String[]{requestPermission}, requestCode);
Log.d(TAG, "ActivityCompat.checkSelfPermission ==== PackageManager.PERMISSION_GRANTED");
Toast.makeText(activity, "opened:" + requestPermissions[requestCode], Toast.LENGTH_SHORT).show();
permissionGrant.onPermissionGranted(requestCode);
private static void requestMultiResult(Activity activity, String[] permissions, int[] grantResults, PermissionGrant permissionGrant) {
if (activity == null) {
Log.d(TAG, "onRequestPermissionsResult permissions length:" + permissions.length);
Map&String, Integer& perms = new HashMap&&();
ArrayList&String& notGranted = new ArrayList&&();
for (int i = 0; i & permissions. i++) {
Log.d(TAG, "permissions: [i]:" + i + ", permissions[i]" + permissions[i] + ",grantResults[i]:" + grantResults[i]);
perms.put(permissions[i], grantResults[i]);
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
notGranted.add(permissions[i]);
if (notGranted.size() == 0) {
Toast.makeText(activity, "all permission success" + notGranted, Toast.LENGTH_SHORT)
permissionGrant.onPermissionGranted(CODE_MULTI_PERMISSION);
openSettingActivity(activity, "those permission need granted!");
* 一次申请多个权限
public static void requestMultiPermissions(final Activity activity, PermissionGrant grant) {
final List&String& permissionsList = getNoGrantedPermission(activity, false);
final List&String& shouldRationalePermissionsList = getNoGrantedPermission(activity, true);
//TODO checkSelfPermission
if (permissionsList == null || shouldRationalePermissionsList == null) {
Log.d(TAG, "requestMultiPermissions permissionsList:" + permissionsList.size() + ",shouldRationalePermissionsList:" + shouldRationalePermissionsList.size());
if (permissionsList.size() & 0) {
ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
} else if (shouldRationalePermissionsList.size() & 0) {
showMessageOKCancel(activity, "should open those permission",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
CODE_MULTI_PERMISSION);
Log.d(TAG, "showMessageOKCancel requestPermissions");
grant.onPermissionGranted(CODE_MULTI_PERMISSION);
private static void shouldShowRationale(final Activity activity, final int requestCode, final String requestPermission) {
String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
showMessageOKCancel(activity, "Rationale: " + permissionsHint[requestCode], new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity,
new String[]{requestPermission},
requestCode);
Log.d(TAG, "showMessageOKCancel requestPermissions:" + requestPermission);
private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(context)
.setMessage(message)
.setPositiveButton("OK", okListener)
.setNegativeButton("Cancel", null)
* @param activity
* @param requestCode
Need consistent with requestPermission
* @param permissions
* @param grantResults
public static void requestPermissionsResult(final Activity activity, final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults, PermissionGrant permissionGrant) {
if (activity == null) {
Log.d(TAG, "requestPermissionsResult requestCode:" + requestCode);
if (requestCode == CODE_MULTI_PERMISSION) {
requestMultiResult(activity, permissions, grantResults, permissionGrant);
if (requestCode & 0 || requestCode &= requestPermissions.length) {
Log.w(TAG, "requestPermissionsResult illegal requestCode:" + requestCode);
Toast.makeText(activity, "illegal requestCode:" + requestCode, Toast.LENGTH_SHORT).show();
Log.i(TAG, "onRequestPermissionsResult requestCode:" + requestCode + ",permissions:" + permissions.toString()
+ ",grantResults:" + grantResults.toString() + ",length:" + grantResults.length);
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "onRequestPermissionsResult PERMISSION_GRANTED");
//TODO success, do something, can use callback
permissionGrant.onPermissionGranted(requestCode);
//TODO hint user this permission function
Log.i(TAG, "onRequestPermissionsResult PERMISSION NOT GRANTED");
String[] permissionsHint = activity.getResources().getStringArray(R.array.permissions);
openSettingActivity(activity,
"Result" + permissionsHint[requestCode]);
private static void openSettingActivity(final Activity activity, String message) {
showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Log.d(TAG, "getPackageName(): " + activity.getPackageName());
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivity(intent);
* @param activity
* @param isShouldRationale true: return no granted and shouldShowRequestPermissionRationale permissions, false:return no granted and !shouldShowRequestPermissionRationale
public static ArrayList&String& getNoGrantedPermission(Activity activity, boolean isShouldRationale) {
ArrayList&String& permissions = new ArrayList&&();
for (int i = 0; i & requestPermissions. i++) {
String requestPermission = requestPermissions[i];
//TODO checkSelfPermission
int checkSelfPermission = -1;
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
Toast.makeText(activity, "please open those permission", Toast.LENGTH_SHORT)
Log.e(TAG, "RuntimeException:" + e.getMessage());
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "getNoGrantedPermission ActivityCompat.checkSelfPermission != PackageManager.PERMISSION_GRANTED:" + requestPermission);
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
Log.d(TAG, "shouldShowRequestPermissionRationale if");
if (isShouldRationale) {
permissions.add(requestPermission);
if (!isShouldRationale) {
permissions.add(requestPermission);
Log.d(TAG, "shouldShowRequestPermissionRationale else");
界面调用代码
package com.example.android.system.
import android.os.B
import android.support.annotation.NonN
import android.support.v4.app.ActivityC
import android.support.v4.app.FragmentA
import android.support.v4.app.FragmentT
import android.view.V
import android.widget.T
import com.mon.logger.L
* Created by qianxiaoai on .
public class PermissionActivity extends FragmentActivity implements ActivityCompat.OnRequestPermissionsResultCallback{
private static final String TAG = PermissionActivity.class.getSimpleName();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
PermissionsFragment fragment = new PermissionsFragment();
transaction.replace(R.id.content_fragment, fragment);
* Called when the 'show camera' button is clicked.
* Callback is defined in resource layout definition.
public void showCamera(View view) {
Log.i(TAG, "Show camera button pressed. Checking permission.");
PermissionUtils.requestPermission(this, PermissionUtils.CODE_CAMERA, mPermissionGrant);
public void getAccounts(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_GET_ACCOUNTS, mPermissionGrant);
public void callPhone(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_CALL_PHONE, mPermissionGrant);
public void readPhoneState(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_READ_PHONE_STATE, mPermissionGrant);
public void accessFineLocation(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_ACCESS_FINE_LOCATION, mPermissionGrant);
public void accessCoarseLocation(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_ACCESS_COARSE_LOCATION, mPermissionGrant);
public void readExternalStorage(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_READ_EXTERNAL_STORAGE, mPermissionGrant);
public void writeExternalStorage(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE, mPermissionGrant);
public void recordAudio(View view) {
PermissionUtils.requestPermission(this, PermissionUtils.CODE_RECORD_AUDIO, mPermissionGrant);
private PermissionUtils.PermissionGrant mPermissionGrant = new PermissionUtils.PermissionGrant() {
public void onPermissionGranted(int requestCode) {
switch (requestCode) {
case PermissionUtils.CODE_RECORD_AUDIO:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_RECORD_AUDIO", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_GET_ACCOUNTS:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_GET_ACCOUNTS", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_READ_PHONE_STATE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_READ_PHONE_STATE", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_CALL_PHONE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_CALL_PHONE", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_CAMERA:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_CAMERA", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_ACCESS_FINE_LOCATION:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_ACCESS_FINE_LOCATION", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_ACCESS_COARSE_LOCATION:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_ACCESS_COARSE_LOCATION", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_READ_EXTERNAL_STORAGE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_READ_EXTERNAL_STORAGE", Toast.LENGTH_SHORT).show();
case PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE:
Toast.makeText(PermissionActivity.this, "Result Permission Grant CODE_WRITE_EXTERNAL_STORAGE", Toast.LENGTH_SHORT).show();
* Callback received when a permissions request has been completed.
public void onRequestPermissionsResult(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
PermissionUtils.requestPermissionsResult(this, requestCode, permissions, grantResults, mPermissionGrant);
&LinearLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/horizontal_page_margin"
android:paddingRight="@dimen/horizontal_page_margin"
android:paddingTop="@dimen/vertical_page_margin"
android:paddingBottom="@dimen/vertical_page_margin"
android:orientation="vertical"
&FrameLayout
android:id="@+id/content_fragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/&
&ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Camera"
android:id="@+id/button_camera"
android:onClick="showCamera"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RECORD_AUDIO"
android:onClick="recordAudio"/&
&/LinearLayout&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="GET_ACCOUNTS"
android:onClick="getAccounts"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CALL_PHONE"
android:onClick="callPhone"/&
&/LinearLayout&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="PERMISSION_READ_PHONE_STATE"
android:onClick="readPhoneState"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACCESS_FINE_LOCATION"
android:onClick="accessFineLocation"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ACCESS_COARSE_LOCATION"
android:onClick="accessCoarseLocation"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="READ_EXTERNAL_STORAGE"
android:onClick="readExternalStorage"/&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="WRITE_EXTERNAL_STORAGE"
android:onClick="writeExternalStorage"/&
&/LinearLayout&
&/ScrollView&
&/LinearLayout&
清单文件申请的权限
&uses-permission android:name="android.permission.CAMERA"/&
&uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/&
&uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/&
&uses-permission android:name="android.permission.CALL_PHONE"/&
&uses-permission android:name="android.permission.SEND_SMS"/&
&uses-permission android:name="android.permission.READ_SMS"/&
&uses-permission android:name="android.permission.GET_ACCOUNTS"/&
&uses-permission android:name="android.permission.READ_PHONE_STATE"/&
&uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
&uses-permission android:name="android.permission.RECORD_AUDIO"/&
部分 资源文件
&?xml version="1.0" encoding="utf-8"?&
&resources&
&string-array name="permissions"&
&item&@string/permission_recode_audio_hint&/item&
&item&@string/permission_get_accounts_hint&/item&
&item&@string/permission_read_phone_hint&/item&
&item&@string/permission_call_phone_hint&/item&
&item&@string/permission_camera_hint&/item&
&item&@string/permission_access_fine_location_hint&/item&
&item&@string/permission_access_coarse_location_hint&/item&
&item&@string/permission_read_external_hint&/item&
&item&@string/permission_white_external_hint&/item&
&/string-array&
&/resources&
&string name="permission_get_accounts_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_GET_ACCOUNTS&/string&
&string name="permission_read_phone_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_PHONE_STATE&/string&
&string name="permission_call_phone_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_CALL_PHONE&/string&
&string name="permission_camera_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_CAMERA&/string&
&string name="permission_access_fine_location_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_ACCESS_FINE_LOCATION&/string&
&string name="permission_access_coarse_location_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_ACCESS_COARSE_LOCATION&/string&
&string name="permission_read_external_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_READ_EXTERNAL_STORAGE&/string&
&string name="permission_white_external_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_WRITE_EXTERNAL_STORAGE&/string&
&string name="permission_recode_audio_hint"&没有此权限,无法开启这个功能,请开启权限。PERMISSION_RECORD_AUDIO&/string&
认真的生活,开心的编程。
我的博客: /

我要回帖

更多关于 andorid 6.0 动态权限 的文章

 

随机推荐