Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android_設備隱私獲取,忽略6.0權限管理

Android_設備隱私獲取,忽略6.0權限管理

編輯:關於android開發

Android_設備隱私獲取,忽略6.0權限管理


1.前言

(1).由於MIUI等部分國產定制系統也有權限管理,沒有相關api,故無法判斷用戶是否允許獲取聯系人等隱私。在Android 6.0之後,新增權限管理可以通過官方api判斷用戶的運行狀態;

(2).我們指定targetSdkVersion為23或者之後我們還需要在運行時請求這些所需的權限。這很重要,因為已經出現了很多開發者把targetSdkVersion飙到了最新,然後發現自己的app瘋狂的崩潰,這是由於他們沒有實現執行運行時權限請求的代碼。當你已經把一個targeting API 為23或者之後的app發布到了Google Play上,這更是一個問題,你無法立即把那個apk的targeting API替換成更早的版本。

2.權限分析

從Android6.0開始,權限分為普通權限和許可權限。許可權限分類歸組,一個權限授權之後,該組下的權限均可使用。

(1)普通權限

只需要在xml申請即可,使用方法和之前6.0以前的一樣。在應用安裝應用時,會默認獲得許可。

(2)許可權限

可執行 $adb shell pm list permissions -d -g

Permission Group Permissions android.permission-group.CALENDAR
  • android.permission.READ_CALENDAR
  • android.permission.WRITE_CALENDAR
android.permission-group.CAMERA
  • android.permission.CAMERA
android.permission-group.CONTACTS
  • android.permission.READ_CONTACTS
  • android.permission.WRITE_CONTACTS
  • android.permission.GET_ACCOUNTS
android.permission-group.LOCATION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_COARSE_LOCATION
android.permission-group.MICROPHONE
  • android.permission.RECORD_AUDIO
android.permission-group.PHONE
  • android.permission.READ_PHONE_STATE
  • android.permission.CALL_PHONE
  • android.permission.READ_CALL_LOG
  • android.permission.WRITE_CALL_LOG
  • com.android.voicemail.permission.ADD_VOICEMAIL
  • android.permission.USE_SIP
  • android.permission.PROCESS_OUTGOING_CALLS
android.permission-group.SENSORS
  • android.permission.BODY_SENSORS
android.permission-group.SMS
  • android.permission.SEND_SMS
  • android.permission.RECEIVE_SMS
  • android.permission.READ_SMS
  • android.permission.RECEIVE_WAP_PUSH
  • android.permission.RECEIVE_MMS
  • android.permission.READ_CELL_BROADCASTS
android.permission-group.STORAGE
  • android.permission.READ_EXTERNAL_STORAGE
  • android.permission.WRITE_EXTERNAL_STORAGE

同一組的任何一個權限被授權了,其他權限也自動被授權。例如,一旦WRITE_CONTACTS被授權了,app也有READ_CONTACTS和GET_ACCOUNTS了。
源碼中被用來檢查和請求權限的方法分別是Activity的checkSelfPermission和requestPermissions,這些方法api23引入。
 

3.相關方法

(1).ContextCompat.checkSelfPermission()

檢查應用是否擁有該權限,被授權返回值為PERMISSION_GRANTED,否則返回PERMISSION_DENIED

(2).ActivityCompat.requestPermissions()

將彈出請求授權對話框,這個方法在M之前版本調用,OnRequestPermissionsResultCallback 直接被調用,帶著正確的 PERMISSION_GRANTED或者 PERMISSION_DENIED 。

(3).AppCompatActivity.onRequestPermissionsResult()

該方法類似於Activity的OnActivityResult()的回調方法,主要接收請求授權的返回

  1. //版本判斷
  2. if(Build.VERSION.SDK_INT>=23){
  3. //減少是否擁有權限
  4. intcheckCallPhonePermission=ContextCompat.checkSelfPermission(getApplicationContext(),permission);
  5. if(checkCallPhonePermission!=PackageManager.PERMISSION_GRANTED){
  6. //彈出對話框接收權限
  7. ActivityCompat.requestPermissions(BaseActivity.this,newString[]{permission},id);
  8. return;
  9. }  
    1. @Override
    2. publicvoidonRequestPermissionsResult(intrequestCode,@NonNullString[]permissions,@NonNullint[]grantResults){
    3. super.onRequestPermissionsResult(requestCode,permissions,grantResults);
    4.  
    5. if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
    6. //TODO:已授權
    7. }else{
    8. //TODO:用戶拒絕
    9. }
    10. }

4.封裝

  1. publicclassBaseActivityextendsAppCompatActivity{
  2. privateMapallowablePermissionRunnables=newHashMap<>();
  3. privateMapdisallowablePermissionRunnables=newHashMap<>();
  4.  
  5. @Override
  6. protectedvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. }
  9.  
  10. /**
  11. *請求權限
  12. *@paramid請求授權的id唯一標識即可
  13. *@parampermission請求的權限
  14. *@paramallowableRunnable同意授權後的操作
  15. *@paramdisallowableRunnable禁止權限後的操作
  16. */
  17. protectedvoidrequestPermission(intid,Stringpermission,RunnableallowableRunnable,RunnabledisallowableRunnable){
  18. if(allowableRunnable==null){
  19. thrownewIllegalArgumentException("allowableRunnable==null");
  20. }
  21.  
  22. allowablePermissionRunnables.put(id,allowableRunnable);
  23. if(disallowableRunnable!=null){
  24. disallowablePermissionRunnables.put(id,disallowableRunnable);
  25. }
  26.  
  27. //版本判斷
  28. if(Build.VERSION.SDK_INT>=23){
  29. //減少是否擁有權限
  30. intcheckCallPhonePermission=ContextCompat.checkSelfPermission(getApplicationContext(),permission);
  31. if(checkCallPhonePermission!=PackageManager.PERMISSION_GRANTED){
  32. //彈出對話框接收權限
  33. ActivityCompat.requestPermissions(BaseActivity.this,newString[]{permission},id);
  34. return;
  35. }else{
  36. allowableRunnable.run();
  37. }
  38. }else{
  39. allowableRunnable.run();
  40. }
  41. }
  42.  
  43. @Override
  44. publicvoidonRequestPermissionsResult(intrequestCode,@NonNullString[]permissions,@NonNullint[]grantResults){
  45. super.onRequestPermissionsResult(requestCode,permissions,grantResults);
  46.  
  47. if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
  48. RunnableallowRun=allowablePermissionRunnables.get(requestCode);
  49. allowRun.run();
  50. }else{
  51. RunnabledisallowRun=disallowablePermissionRunnables.get(requestCode);
  52. disallowRun.run();
  53. }
  54. }
  55. }  
    1. publicclassMainActivityextendsBaseActivityimplementsView.OnClickListener{
    2. privateButtonbtCallPhone;
    3. privateButtonbtContact;
    4.  
    5. @Override
    6. protectedvoidonCreate(BundlesavedInstanceState){
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_main);
    9.  
    10. btCallPhone=(Button)findViewById(R.id.call_phone);
    11. btContact=(Button)findViewById(R.id.contact);
    12.  
    13. btCallPhone.setOnClickListener(this);
    14. btContact.setOnClickListener(this);
    15. }
    16.  
    17. @Override
    18. publicvoidonClick(Viewv){
    19. if(v==btCallPhone){
    20. //撥打電話
    21. requestPermission(1,Manifest.permission.CALL_PHONE,newRunnable(){
    22. @Override
    23. publicvoidrun(){
    24. callPhone();
    25. }
    26. },newRunnable(){
    27. @Override
    28. publicvoidrun(){
    29. callPhoneDenied();
    30. }
    31. });
    32. }elseif(v==btContact){
    33. //讀取聯系人信息
    34. requestPermission(2,Manifest.permission.WRITE_CONTACTS,newRunnable(){
    35. @Override
    36. publicvoidrun(){
    37. readContact();
    38. }
    39. },newRunnable(){
    40. @Override
    41. publicvoidrun(){
    42. readContactDenied();
    43. }
    44. });
    45. }
    46. }
    47.  
    48. privatevoidcallPhone(){
    49. Toast.makeText(MainActivity.this,"CALL_PHONEOK",Toast.LENGTH_SHORT)
    50. .show();
    51. }
    52.  
    53. privatevoidcallPhoneDenied(){
    54. Toast.makeText(MainActivity.this,"CALL_PHONEDenied",Toast.LENGTH_SHORT)
    55. .show();
    56. }
    57.  
    58. privatevoidreadContact(){
    59. ContentResolvercr=getContentResolver();
    60. Stringstr[]={ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER,
    61. ContactsContract.CommonDataKinds.Phone.PHOTO_ID};
    62. Cursorcur=cr.query(
    63. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,str,null,
    64. null,null);
    65. intcount=cur.getCount();
    66. cur.close();
    67.  
    68. Toast.makeText(MainActivity.this,String.format("發現%s條",count),Toast.LENGTH_SHORT)
    69. .show();
    70. }
    71.  
    72. privatevoidreadContactDenied(){
    73. Toast.makeText(MainActivity.this,"ContactDenied",Toast.LENGTH_SHORT)
    74. .show();
    75. }
    76. }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved