天天看點

Android 權限申請

Android 權限申請

參考資料

https://www.jianshu.com/p/338741725cd0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Android權限(普通權限+危險權限)

https://blog.csdn.net/feibendexiaoma/article/details/80093354

允許安裝未知來源權限(一)

https://blog.csdn.net/qq_34330286/article/details/79660059

Android6.0以上允許讀寫權限

  • Android權限分類*

正常權限,危險權限,特殊權限

  1. 正常權限

正常權限涵蓋應用需要通路其沙盒外部資料或資源,但對使用者隐私或其他應用操作風險很小的區域。例如,設定時區的權限就是正常權限。此類權限都是正常保護的權限,隻需要在Manifest檔案中簡單聲明,安裝即授權,如網絡權限

配置方法,在Manifest檔案中簡單聲明,安裝即授權

  1. 危險權限

危險權限涵蓋應用需要涉及使用者隐私資訊的資料或資源,或者可能對使用者存儲的資料或其他應用的操作産生影響的區域。例如,能夠讀取使用者的聯系人屬于危險權限。

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

配置方法,使用時先檢查權限是否開啟,未開啟則需要使用者手動開啟

如果App需要用到危險權限,需要這一權限的操作時都必須檢查自己是否擁有該權限。檢查權限代碼如下所示:

// Assume thisActivity is the current activity  
   int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
           

如果應用已經具有了該權限,此方法将傳回 PackageManager.PERMISSION_GRANTED,并且應用可以繼續操作。如果應用不具有此權限,方法将傳回 PERMISSION_DENIED,此時應用應當進行權限申請。

Android危險權限

編号 權限組 權限

0 CALENDAR READ_CALENDAR WRITE_CALENDAR
  1 CAMERA CAMERA
  2 CONTACTS READ_CONTACTS WRITE_CONTACTS GET_ACCOUNTS
  3 LOCATION ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION
  4 MICROPHONE RECORD_AUDIO
  5 PHONE READ_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS
  6 SENSORS BODY_SENSORS
  7 SMS SEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS
  8 STORAGE READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE
           

注意:表格中的每個危險權限都屬于一個權限組,我們在進行運作時權限處理時使用的是權限名,但是使用者一旦同意授權了,那麼該權限所對應的權限組中的其他權限也會同時被授權。

配置源碼

單個權限

//第一步:看權限是否已經被申請,沒有則申請權限
 private void CheckPermssion(){
     boolean haveInstallPermission;
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
     {
         //是否有擷取手機EMEI權限
  if(ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)
             {
 //第二步調用requestPermissions申請權限
  ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.READ_PHONE_STATE},2);
             }
     }
 }
 //第三步:若有需要,調用回調函數
   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
 }
           

多個權限

//第一步:看權限是否已經被申請,沒有則申請權限
        private void CheckPermssion(){
                 List<String> permissionList = new ArrayList<>();
                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) !=PackageManager.PERMISSION_GRANTED) 
        {
                            permissionList.add(Manifest.permission.CALL_PHONE);
                        }
                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) 
        {
                            permissionList.add(Manifest.permission.READ_PHONE_STATE);
                        }
                        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
         {        permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                        }
                        if (!permissionList.isEmpty()) 
        {
                            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
                     //第二步調用requestPermissions申請權限
                            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
                        } 
                    }
                }
        }
        //第三步:若有需要,調用回調函數
          @Override
            public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
                switch (requestCode) {
                    case 1:
                        if (grantResults.length > 0) {
                            for (int result : grantResults) {
                                if (result != PackageManager.PERMISSION_GRANTED) {
                                    Toast.makeText(MainActivity.this, "you denied some", Toast.LENGTH_SHORT).show();
                                    finish();
                                    return;
                                }
                            }
                            call();
                        }else{
                            Toast.makeText(MainActivity.this, "發生未知錯誤", Toast.LENGTH_SHORT).show();
                            finish();
                        }
                        break;
                }
            }
        }
           

3 特殊權限

有許多權限其行為方式與正常權限及危險權限都不同。SYSTEM_ALERT_WINDOW 和 WRITE_SETTINGS 特别敏感,是以大多數應用不應該使用它們。如果某應用需要其中一種權限,必須在清單中聲明該權限,并且發送請求使用者授權的 intent。系統将向使用者顯示詳細資訊,以響應該 intent。

繼續閱讀