Android提示用户获取相应手机权限

一,简介

Android 6.0 为了保护用户隐私,将一些权限的申请放在了应用运行的时候去申请, 比如以往的开发中,开发人员只需要将需要的权限在清单文件中配置即可,安装后用户可以在设置中的应用信息中看到:XX应用以获取****权限。用户点击可以选择给应用相应的权限。此前的应用权限用户可以选择允许、提醒和拒绝。在安装的时候用户是已经知道应用需要的权限的。但是这样存在一个问题,就是用户在安装的时候,应用需要的权限十分的多(有些开发者为了省事,会请求一些不必要的权限或者请求全部的权限),这个时候用户在安装应用的时候也许并没有发现某些侵犯自己隐私的权限请求,安装之后才发现自己的隐私数据被窃取。其实Android6.0 动态权限一方面是为了广大用户考虑,另一方面其实是Google为了避免一些不必要的官司。下面就说一下Android6.0对权限的分割:

二,一些权限知识

下面是对权限的总结:(此处内容摘抄自:http://blog.csdn.net/u011200604/article/details/52874599)
 
 

首先是大家感兴趣的危险权限

这类权限需要在需要的时候,需要我们动态申请,比如:当我们需要打开相机拍摄照片的时候需要我们通过代码的方式在需要的地方去申请权限。Android6.0中权限问题中我们需要注意的是:

1:由于权限API的问题,我们的Actiivty最好是AppCompatActivity类型的,也就是说在你的BaseActivity需要继承AppCompatActivity

2:权限是分组的,同一组的权限申请其中一个,同组的权限就全部都申请了

 

特殊权限 组:

CALENDAR 日历

CAMERA 相机

CONTACTS 联系人

LOCATION 定位

MICROPHONE 麦克相关,比如录音

PHONE 手机状态

SENSORS 传感器

SMS 短信

STORAGE 存储权限

 

具体的权限分组情况如下表:

以下是需要单独申请的权限,共分为9组,每组只要有一个权限申请成功了,就默认整组权限都可以使用了。  
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_CONTACTSgroup: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_VOICEMAILgroup:android.permission-group.CALENDAR
permission:android.permission.READ_CALENDAR
permission:android.permission.WRITE_CALENDARgroup:android.permission-group.CAMERA
permission:android.permission.CAMERAgroup:android.permission-group.SENSORS
permission:android.permission.BODY_SENSORSgroup:android.permission-group.LOCATION
permission:android.permission.ACCESS_FINE_LOCATION
permission:android.permission.ACCESS_COARSE_LOCATIONgroup:android.permission-group.STORAGE
permission:android.permission.READ_EXTERNAL_STORAGE
permission:android.permission.WRITE_EXTERNAL_STORAGEgroup:android.permission-group.MICROPHONE
permission:android.permission.RECORD_AUDIOgroup: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


普通权限的总结:

ACCESS_LOCATION_EXTRA_COMMANDS	定位权限ACCESS_NETWORK_STATE	网络状态权限ACCESS_NOTIFICATION_POLICY	通知 APP通知显示在状态栏ACCESS_WIFI_STATE	WiFi状态权限BLUETOOTH	使用蓝牙权限BLUETOOTH_ADMIN	控制蓝牙开关BROADCAST_STICKY	粘性广播CHANGE_NETWORK_STATE	改变网络状态CHANGE_WIFI_MULTICAST_STATE	改变WiFi多播状态,应该是控制手机热点(猜测)CHANGE_WIFI_STATE	控制WiFi开关,改变WiFi状态DISABLE_KEYGUARD	改变键盘为不可用EXPAND_STATUS_BAR	扩展bar的状态GET_PACKAGE_SIZE	获取应用安装包大小INTERNET	网络权限KILL_BACKGROUND_PROCESSES	杀死后台进程MODIFY_AUDIO_SETTINGS	改变音频输出设置NFC	支付READ_SYNC_SETTINGS	获取手机设置信息READ_SYNC_STATS	数据统计RECEIVE_BOOT_COMPLETED	监听启动广播REORDER_TASKS	创建新栈REQUEST_INSTALL_PACKAGES	安装应用程序SET_TIME_ZONE	允许应用程序设置系统时间区域SET_WALLPAPER	设置壁纸SET_WALLPAPER_HINTS	设置壁纸上的提示信息,个性化语言TRANSMIT_IR	红外发射USE_FINGERPRINT	指纹识别VIBRATE	震动WAKE_LOCK	锁屏WRITE_SYNC_SETTINGS	改变设置SET_ALARM	设置警告提示INSTALL_SHORTCUT	创建快捷方式UNINSTALL_SHORTCUT	删除快捷方式
以上这些只是普通权限,我们开发的时候,正常使用就行了,需要的权限在清单文件配置即可

三,demo

1,效果,分两种情况,

第一种:点击允许



第二种:点击拒绝,并再次点击拒绝+不在询问

   


2,代码:

视图层:

permission.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_marginTop="200dp"android:id="@+id/btn_get2"android:layout_width="match_parent"android:layout_height="50dp"android:onClick="get"android:text="读取手机内存"/></LinearLayout>

权限:

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

testPermission.java

public class testPermission extends Activity {private static final int REQUEST_EXTERNAL_STORAGE = 1;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.permission);}public void get(View v){String[] permissions;//读取内存权限permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};if (checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE)) {//如果已经获得权限String   dir= Environment.getExternalStorageDirectory().getAbsolutePath();Intent intent=new Intent(testPermission.this,FileManager.class);intent.putExtra("dir",dir);intent.putExtra("title","文件管理");startActivity(intent);}else{//否则去获取权限getPermission(Manifest.permission.READ_EXTERNAL_STORAGE,permissions);}}//检查某个权限是否已经获得private boolean checkPermission(String permission){//检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION_GRANTED表示同意授权if (ActivityCompat.checkSelfPermission(this, permission)== PackageManager.PERMISSION_GRANTED)return true;elsereturn false;}//获取权限private void getPermission(String permission,String [] permissions) {//申请权限ActivityCompat.requestPermissions(this,permissions,REQUEST_EXTERNAL_STORAGE);//用户已经拒绝过一次,再次弹出权限申请对话框需要给用户一个解释if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission))Toast.makeText(this, "请开通相关权限,否则无法正常使用本应用!", Toast.LENGTH_SHORT).show();}/*** 一个或多个权限请求结果回调** @param requestCode* @param permissions* @param grantResults*//当点击了不在询问,但是想要实现某个功能,必须要用到权限,可以提示用户,引导用户去设置@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);boolean hasAllGranted = true;for (int i = 0; i < grantResults.length; ++i) {if (grantResults[i] == PackageManager.PERMISSION_DENIED) {hasAllGranted = false;//在用户已经拒绝授权的情况下,如果shouldShowRequestPermissionRationale返回false则// 可以推断出用户选择了“不在提示”选项,在这种情况下需要引导用户至设置页手动授权if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])) {//解释原因,并且引导用户至设置页手动授权new AlertDialog.Builder(this).setMessage("\r\n" +"获取相关权限失败:xxxxxx,将导致部分功能无法正常使用,需要到设置页面手动授权").setPositiveButton("去授权", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//引导用户至设置页手动授权Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);Uri uri = Uri.fromParts("package", getApplicationContext().getPackageName(), null);intent.setData(uri);startActivity(intent);}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//引导用户手动授权,权限请求失败Toast.makeText(testPermission.this,"权限获取失败",Toast.LENGTH_SHORT).show();}}).setOnCancelListener(new DialogInterface.OnCancelListener() {@Overridepublic void onCancel(DialogInterface dialog) {//引导用户手动授权,权限请求失败}}).show();} else {//权限请求失败,但未选中“不再提示”选项}break;}}if (hasAllGranted) {}}}

FileManager.java//当权限获取成功时,跳到此activity;

public class FileManager extends Activity {ListView listView;TextView title;String dir;//用存放路劲FileAdapter adapter;//适配器List<File> dateList;//File 数据@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.file_manager);findVById();init();//初始化}private void findVById() {listView=(ListView)findViewById(R.id.file_listview);title=(TextView)findViewById(R.id.file_title);}//初始化private void init() {Intent intent=getIntent();//获取Intent的,接收activity传来的值,dir= intent.getStringExtra("dir");//如果为null,dir的值为 :Environment.getExternalStorageDirectory().getAbsolutePath();//这个路劲就是一般打开手机文件管理文件目录的路劲if (dir!=null);elsedir= Environment.getExternalStorageDirectory().getAbsolutePath();//获取title:让其显示文件路劲:如Android>data>com......if(intent.getStringExtra("title")!=null)title.setText(intent.getStringExtra("title"));elsetitle.setText("文件管理");//为listView注册上下文菜单,当长按某一个文件出现菜单:this.registerForContextMenu(listView);dateList=new ArrayList<>();adapter=new FileAdapter(this,getDate());listView.setAdapter(adapter);//listView 点击事件,当点击的文件为目录时,// 把dir的值赋值为:dir+点击的目录,再次跳到此页,既可以达到循环,不要再去新建一个activity在现实:// intent.putExtra("dir",dir+"/"+dateList.get(i).getName());//intent.putExtra("title",title.getText()+">"+dateList.get(i).getName());listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {if(dateList.get(i).isDirectory()){Intent intent=new Intent(FileManager.this,FileManager.class);intent.putExtra("dir",dir+"/"+dateList.get(i).getName());intent.putExtra("title",title.getText()+">"+dateList.get(i).getName());startActivity(intent);}}});}//为上下文菜单添加菜单项@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);menu.setHeaderTitle("文件操作");menu.setHeaderIcon(R.drawable.ic_brightness_high_black_24dp);menu.add(1,1,1,"复制");menu.add(1,2,1,"粘贴");menu.add(1,3,1,"剪切");menu.add(1,4,1,"重命名");}//选中菜单项点击事件,这里就Toast一下,@Overridepublic boolean onContextItemSelected(MenuItem item) {switch (item.getItemId()){case 1:Toast.makeText(FileManager.this,"已复制",Toast.LENGTH_SHORT).show();break;case 2:Toast.makeText(FileManager.this,"已粘贴",Toast.LENGTH_SHORT).show();break;case 3:Toast.makeText(FileManager.this,"剪切",Toast.LENGTH_SHORT).show();break;case 4:Toast.makeText(FileManager.this,"重命名",Toast.LENGTH_SHORT).show();break;}return super.onContextItemSelected(item);}//获取dir下所有的文件public List< File> getDate() {File file=new File(dir);if(file.exists()){File[] file1=file.listFiles();for (File filename :file1) {dateList.add(filename);}}return dateList;}private static final int REQUEST_EXTERNAL_STORAGE = 1;private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE};public void myPermission() {int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);if (permission != PackageManager.PERMISSION_GRANTED) {// 没有权限就提示用户ActivityCompat.requestPermissions(this,PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);}}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45297.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓手机权限总结安卓权限列表

1.android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词 2.android.permission.WRITE_SYNC_SETTINGS写入Google在线同步设置 3.android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流 4.android.permission.WRITE_SMS允许程序写短信 5.androi…

手机特殊访问权限设置

前言 在使用手机过程中&#xff0c;权限设置比较重要&#xff0c;有一些特殊访问权限入口较为隐秘&#xff0c;例如电池优化权限&#xff0c;下面以华为鸿蒙系统为例&#xff0c;介绍如何设置特殊访问权限。 步骤 打开系统设置&#xff0c;进入应用和服务&#xff0c;进入权…

推荐几个优质的公众号!

点击上方“Python大本营”&#xff0c;选择“置顶公众号”Python大本营 IT人的职业提升平台技术之路就是漫长的打怪升级&#xff0c;不断学习前人的踩坑经验才能提升自己&#xff0c;切忌闭门造车。所谓独乐乐不如众乐乐&#xff0c;强烈推荐以下公众号&#xff0c;让你的生活…

微信公众号每日推送给女朋友的程序

微信公众日常推送保姆教程&#xff08;node版&#xff09; 1.先安装node环境(https://nodejs.org/en/) 安装过程就是&#xff1a;双击直接安装&#xff0c;不建议更改默认安装位置&#xff08;C:\&#xff09;&#xff0c;中途也保持默认设置&#xff0c;一路 “Next” 即可。…

推荐几个优质 IT 公众号

为大家推荐几个优质公众号&#xff1a; 学习需要技能&#xff0c;更需要有好的领路人&#xff0c;关注几个优质公众号&#xff0c;帮助你在学习中科学有效的成长。 以下是特地给大家挑选了几个大佬的优质号&#xff0c;强烈推荐关注。 人工智能爱好者社区 专注人工智能、机器学…

推荐9个最顶级的IT公众号

固步自封只会让自己落后于他人 如今&#xff0c;网络已将人与人之间的距离拉近 我们应开拓自己的眼界&#xff0c;结识更多的大能来丰富自己的知识 以下是8个技术公众号&#xff0c;每日共享最新的技术资讯。 快收下这波安利吧&#xff01; stormzhang stormzhang&#xff0c;大…

为大家推荐几个不错的公众号!

分享编程技能、互联网技术、生活感悟、打造干货分享平台&#xff0c;将总结的技术、心得、经验(数据结构与算法、源码分析)分享给大家&#xff0c;这里不只限于技术&#xff01;还有职场心得、生活感悟、以及面经。 工作、生活节奏超快的今天&#xff0c;想要不断提升自我&…

大模型技术发展概述 -(二)

文本内容参考论文《A Survey of Large Language Models》 论文标题&#xff1a;A Survey of Large Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -&#xff08;二&#xff09; 4. LLM预训练4.1 数据收集4.1.1 数据源4.1.2…

chatgpt赋能python:Python区域截图教程

Python区域截图教程 截图是我们常用的操作之一。有时候&#xff0c;我们只需要截取屏幕上的某个区域&#xff0c;而不是整个屏幕。这时&#xff0c;Python的区域截图功能可以派上用场。本文将为大家详细讲解Python如何实现区域截图。 Python区域截图&#xff1a;第三方库介绍…

chatgpt赋能python:Python实现滚动截屏

Python 实现滚动截屏 现代的网页通常都会使用滚动条来展示更多的信息&#xff0c;但是传统的截图工具并不能完整地截取整个网页内容&#xff0c;因此需要使用更加智能的截屏工具。本文将介绍使用 Python 实现滚动截屏的方法。 使用 Python 的优势 Python 是一门高效的编程语…

真机telnet登录eNSP防火墙USG6000V

这次说说真机telnet防火墙USG6000V的配置方法&#xff0c;拓扑如下 cloud1配置省略。 首先呢是配置一下端口的ip、安全区域等等 接下来就是配置telnet了&#xff08;见下图&#xff09; 开启USG6000V的telnet服务 测试一下 输入用户名和密码就成功登录了 抓个包看看 可以看到…

【学习笔记】unity脚本学习(四)【inputManager、键盘输入、鼠标输入、Raycast】

目录 输入inputManagerHorizontal虚拟轴的各个属性含义&#xff08;摘选自ChatGpt&#xff0c;部分回答不准确&#xff09;键值的含义键名称命名约定&#xff1a; 键盘输入静态函数GetKeyGetButtonKeyCodeGetButton/Down/upGetAxisGetAxisRaw 返回由 axisName 标识的虚拟轴的值…

【Unity3D】用InputField做一个简易UI,为GameObject的高度y赋值

目录 一些废话之前卡过的bugInputField更新了类名&#xff0c;引用后无法拖拽单独对GameObject的Transform.position中的某一坐标赋值float.Parse()&#xff0c;格式报错FormatException点击按钮&#xff0c;值只改变了一瞬间又回到原来状态 完整代码后记 一些废话 我是一只总…

【Unity入门】3.3D物体

【Unity入门】3D物体 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;物体移动旋转缩放 &#xff08;1&#xff09;物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…

UnityWeb端和Js互调(MQTT通讯篇)

TOC关于Unity与Js互调&#xff08;MQTT通讯篇&#xff09;踩了很多坑接下来总结一下 总体思路 工程项目当时是PC端项目转成Web端项目。PC端采用的通讯方式是MQTT通讯订阅端&#xff0c;而如果发布成Web端的话不能直接进行MQTT通讯&#xff0c;就想了个办法通过Unity与JS互调的…

Unity Houdini插件编写data Table传递数据给Houdini

上次说到Unity Houdini插件将Tag设为group&#xff0c;里面用到了自定义输入接口。然后那个Houdini教程又给我出难题了&#xff0c;unreal 可以用一种叫data Table的数据结构来完成向Houdini结构化数据的传递&#xff08;链接&#xff09;&#xff0c;我没找到Unity类似的功能&…

【Unity】动态生成圆环体Mesh

代码由ChatGPT生成&#xff0c;后经人工调整。 /// <summary> /// 创建一个3维圆环体Mesh。 /// </summary> /// <param name"outerRadius">外半径。</param> /// <param name"innerRadius">内半径。</param> /// <…

关于vsCode中文插件突然无效的解决办法

今天今天github上下载了一个devtools 用vsCode打开,发现中文插件无效了 解决办法: 按ctrlshiftp 输入Configure Display Language 在弹出的语言中&#xff0c;选中zh-cn 然后重启vsCode

Android的EditText超出字数限制,给用户提示

Android的EditText超出字数限制&#xff0c;给用户提示 导语 如果项目着急使用&#xff0c;直接将下面代码复制到项目中&#xff0c;当做自定义的EditText使用就可以了。 建议将后面的解决思路看一遍&#xff0c;增强自己阅读源码的能力。 自定义的MaxLengthEditText /*** C…

最好理解的,用jeecms搭建一个新闻发布网站

1 前期环境配置 首先需要有jdk、tomcat和mysql&#xff0c;这里对于不同的jeecms版本对以上三种要求是不同的&#xff0c;我本人用的是jdk1.8&#xff0c;tomcat7,mysql5的版本。我们这里需要将从官网下载的压缩包解压出的ROOT文件放入tomcat下面的webapp下&#xff0c;替换掉…