订阅专栏
Android 6.0及其更高版本中,即API>=23之后的版本中某些受保护的权限无法直接通过Manifest来直接默认获取,只能通过动态获取,这样做的好处是显而易见的,可以让权限用在该用的地方。
动态获取权限要做的是这几件事情:
判断当前的系统版本,API版本的多少来确定使用哪种获取权限的方法,如果API小于23那么就不需要发起权限获取操作。
如果API大于或等于23那么就发起权限获取,ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1); this 为当前的操作主体Activity,string数组内为所请求的权限,可见可以同时获取多个权限,最后一位是请求码requestcode。
最后一步是确定回调函数onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult) 其中grantResult数组的第一位若等于PackageManager.PERMISSION_GRANTED那么说明权限被授予否则权限授予失败。
接下来show you the code:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
//权限申请函数
requestCameraPermission();
}catch (Exception e){
Log.d("CameraDemo Start",e.toString());
}
}
});
private void requestCameraPermission(){
//判断SDK版本是否大于23
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
int checkCameraPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(checkCameraPermission != PackageManager.PERMISSION_GRANTED){
//进入这个部分表示程序没有该权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},1);
return;
}else{
Toast.makeText(MainActivity.this,"相机权限已获取成功",Toast.LENGTH_LONG).show();
onCallCamera();
}
}else{
Toast.makeText(MainActivity.this,"API小于23无需获取权限,只需要声明即可",Toast.LENGTH_LONG).show();
onCallCamera();
}
}
public void onRequestPermissionsResult(int requestCode,String[] Permissions,int[] grantResult){
switch (requestCode){
case 1:
if(grantResult[0] == PackageManager.PERMISSION_GRANTED){
//TODO 相机调用函数
onCallCamera();
}else{
Toast.makeText(MainActivity.this,"权限被拒绝",Toast.LENGTH_LONG).show();
}
break;
default:
super.onRequestPermissionsResult(requestCode,Permissions,grantResult);
}
}
private void onCallCamera() {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, 1);
Toast.makeText(MainActivity.this, "函数调用成功", Toast.LENGTH_LONG).show();
}
protected void onActivityResult(int requestcode, int resultCode, Intent data){
//接收camera拍摄下来的照片回传到activity中
try{
if(requestcode !=1){
return;
}
super.onActivityResult(requestcode,resultCode,data);
Bundle extras = data.getExtras();
Bitmap bitmap = (Bitmap)extras.get("data");
imageView.setImageBitmap(bitmap);
}catch (Exception e){
Log.d("Camera",e.toString());
}
}
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
下面是另外一个动态获取权限的思路:
Intent i =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1);
}else {
startActivityForResult(i,1);
Toast.makeText(MainActivity.this,"test_1",Toast.LENGTH_LONG).show();
}
startActivityForResult(i,1);
Toast.makeText(MainActivity.this,"test_2",Toast.LENGTH_LONG).show();
1
2
3
4
5
6
7
8
9
核心部分是:
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CAMERA)!=PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA},1); }
1
其中的本质就是判断权限是否存在,然后若是不存在该权限那么就直接申请。但有一个坏处是这里申请的权限是写死的,最好的解决办法是写一个函数便于调用。
- 等 最代码怎么获取牛币啊?
- 完 谁来告诉我最代码上线的时间,答对者给5牛币,先来先得
- 等 牛友们,大家好,你们做程序员多久了?现在还好吗?
- 完 在微信打开的页面里进行app下载
- 等 最代码2014年欢乐聚声会
- 完 mysql如何查询表数据并且对3个字段降序的SQL?
- 完 最代码牛币机制改革
- 完 成功的在bae上使用了自定义运行环境 jetty+nginx的组合,大家对jetty+nginx优化有哪些心得?
- 完 进来分享一下各位牛牛是如何加入最代码大家庭的?
- 等 为什么java BufferedImage类处理大图直接抛出内存溢出的异常?
- 等 最代码是否开发手机app客户端?
- 完 java程序员学习哪些java的技术?java有哪些框架?都能做哪方面的开发?
- 等 php格式网页文件怎么运行?
- 等 Java volatile值获取的问题
- 等 前端vue,拦截了登录后台后,返回的token,requests拦截token,但是发送请求的时候,就出现跨越异常
- 等 大专本科计算机科班怎么找到Java工作?
- 等 eclipse怎么把三个java swing游戏项目合成一个项目?
- 完 伙伴们,大家都有什么好的解压方式么,分享一下~
- 完 三四线城市,6、7k,运维工作,索然无味,想去辞职上培训,各位牛牛有什么建议嘛
- 等 jsp页面输入中文变成问号
- 等 JPA在线上运行一段时间后报错Caused by: java.lang.IncompatibleClassChangeError: null
- 等 PHP 这个规则用preg_match_all怎么写
- 等 大佬们,有没有知道Alfresco如何配置LDAP登录呢?
- 等 php的install目录是框架带的吗?
- 等 Android Q如何获取所有运行进程的pid cpu 内存占用
- 等 android如何实现控制两个屏幕?
- 等 如何通过android aidl开发计算器?
- 等 android内嵌的SQLite创建数据库,在哪里查看?
- 等 Android如何真机调试?
- 等 android有没有能播放rtmp流媒体的开源播放器代码?
- 完 如何实现android访问oracle数据库?
- 等 Android开发中使用AsyncHttpClient框架怎么更新后台json数据?
- 等 如何确保开发出来的安卓APP能够兼容所有的android手机?
- 等 Android学习各阶段有那些比较好的书籍推荐?
- 等 Android如何开发简单的计算器并通过Service运算后显示到安卓手机前台界面?
- 等 android初学者如何自学安卓开发?