Android6.0动态权限

Android 6.0动态权限

android 6.0权限需要动态申请,分为两种,普通权限和高危权限,主要目的是保护用户隐私。
新的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是Normal Permissions,这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。

Normal Permissions(普通权限)

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUTINTERNETKILL_BACKGROUND_PROCESSESMODIFY_AUDIO_SETTINGSNFCREAD_SYNC_SETTINGSREAD_SYNC_STATSRECEIVE_BOOT_COMPLETEDREORDER_TASKSREQUEST_INSTALL_PACKAGESSET_ALARMSET_TIME_ZONESET_WALLPAPERSET_WALLPAPER_HINTSTRANSMIT_IRUNINSTALL_SHORTCUTUSE_FINGERPRINTVIBRATEWAKE_LOCKWRITE_SYNC_SETTINGS

Dangerous Permission(高危权限)

    该权限分为一组一组,申请一组里其中一个,相当于拥有了一组里所有权限,但还是建议把需要的权限都申请一下,避免因权限分组的变化,而引起不要的代码修改
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

相应的ApI

1.、在AndroidManifest文件中添加需要的权限。
这个步骤和我们之前的开发并没有什么变化,试图去申请一个没有声明的权限会导致程序崩溃。(动态申请的权限也需要申明)

2.、检查权限

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
 PackageManager.PERMISSION_GRANTED) {
                //没有权限      
 } else {    
        //有权限      
 }
这里涉及到一个API,ContextCompat.checkSelfPermission

,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED
或者PackageManager.PERMISSION_GRANTED
。当返回DENIED就需要进行申请授权了。
3、权限申请

       ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 
                  MY_PERMISSIONS_REQUEST_CALL_PHONE);

三个参数,第一个上下文,第二个,需要申请的权限,String数组,可以进行多权限同时申请,第三个参数为requestCode,主要用于回调的时候检测
4.、处理权限申请回调


@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE) {
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  callPhone();       
       } else {
                Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();        }
        return;  
  }
}

ok,对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你的事情了
5.、再次申请

// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,  
      Manifest.permission.READ_CONTACTS)) 
   // Show an expanation to the user *asynchronously* -- don't block 
   // this thread waiting for the user's response! After the user   
 // sees the explanation, try again to request the permission.
}

注意事项

  • 注意申请结果回调的数组进行非空判断
  • 注意动态申请的权限,也要申明,且申明不要使用
    uses-permission-sdk-23这种方式申明的在底版本不可用
  • 蓝牙权限无需动态,但需要位置权限,且位置权限需要动态

实例一

java代码

public class MainActivity extends AppCompatActivity {
private static final int MY_PERMISSIONS_REQUEST_CALL_PHONE = 1;    
@Override    
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testCall();
    }
public void testCall() {
if (ContextCompat.checkSelfPermission(this,  Manifest.permission.CALL_PHONE)!= 
PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_PHONE_STATE},                   
                                   MY_PERMISSIONS_REQUEST_CALL_PHONE);
        } else {
          callPhone();
        }
}
public void callPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
        Uri data = Uri.parse("tel:" + "10086");
        intent.setData(data);
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) !=
 PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
           //    ActivityCompat#requestPermissions    
        // here to request the missing permissions, and then overriding   
         //   public void onRequestPermissionsResult(int requestCode, String[] permissions,   
         //                                          int[] grantResults)        
    // to handle the case where the user grants the permission. See the documentation    
        // for ActivityCompat#requestPermissions for more details.   
         return;        }
      startActivity(intent);  
  }
@Override 
   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] 
grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == MY_PERMISSIONS_REQUEST_CALL_PHONE){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED){
callPhone();
            } else            {
  Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();  
          }
return;
        }
    }
}

xml文件

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission-sdk-23 android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

实例二

Java代码

public void get() {
int phone = ContextCompat.checkSelfPermission(this, 
Manifest.permission.READ_PHONE_STATE);
    int fineLocation = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
   int coarseLocation = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION);    int readStorage = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);    int writeStorage = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if ((phone != PackageManager.PERMISSION_GRANTED) ||(fineLocation !=
     PackageManager.PERMISSION_GRANTED) ||(coarseLocation != 
    PackageManager.PERMISSION_GRANTED) ||(readStorage != 
    PackageManager.PERMISSION_GRANTED) ||(writeStorage != 
    PackageManager.PERMISSION_GRANTED)){
    Log.i("testCall", "testCall: into");  
      ActivityCompat.requestPermissions(this,  new String[
{Manifest.permission.READ_PHONE_STATE, 
                      Manifest.permission.ACCESS_FINE_LOCATION, 
                      Manifest.permission.ACCESS_COARSE_LOCATION,
                      Manifest.permission.READ_EXTERNAL_STORAGE,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
MY_PERMISSIONS_REQUEST_LOCATION);
    } else {
  init();
    }
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);    switch (requestCode) {case MY_PERMISSIONS_REQUEST_LOCATION:Log.i("TAG-->", "onRequestPermissionsResult: " + grantResults.length);            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {init();            } else {// Permission Denied                Toast.makeText(SplashActivity.this, "没有权限,本应用无法使用", Toast.LENGTH_SHORT).show();
                finishAll();
            }
break;
    }
}

xml文件

<!--Normal Permission-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />
<!--Dengon Permission-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容