Android應用權限獲取


Android權限說明

在Android系統里,想要獲取設備信息或更改設備狀態首先需要獲取系統權限。

Android 6.0(API 23)之后的系統將權限大致分成三類,分別是正常權限、危險權限和特殊權限。Android 6.0之前的系統申請權限只需要在AndroidMainfest.xml文件中申請就可以獲取得到權限。而在6.0之后的系統里,正常權限也只需要在AndroidMainfest里申請,而危險權限則不僅需要在AndroidManifest里申請,而且還需要在使用時動態申請。而特殊權限則不能通過代碼申請,只能由用戶在權限頁手動打開。

危險權限包括:

  1. READ_CALENDAR , WRITE_CALENDAR 讀寫日歷權限
  2. CAMERA 調用相機權限
  3. READ_CONTACTS , WRITE_CONTACTS , GET_ACCOUNTS 通訊錄權限
  4. ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 定位權限
  5. RECORD_AUDIO 錄音權限
  6. READ_PHONE_STATE ,CALL_PHONE READ_CALL_LOG, WRITE_CALL_LOG ADD_VOICEMAIL 手機狀態相關權限
  7. BODY_SENSORS 傳感器權限
  8. SMS SEND_SMS ,RECEIVE_SMS ,READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS SMS消息權限
  9. READ_EXTERNAL_STORAGE ,WRITE_EXTERNAL_STORAGE 外部存儲權限

Android權限申請

在AndroidMainfest中申請注冊

 1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" >
 2     ...
 3     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 4     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 5     ...
 6     <application
 7         ...
 8     </application>
 9 
10 </manifest>

以上代碼申請了sd卡的讀寫權限。

Android 10(API 29)改變了應用程序訪問設備外部存儲上文件的方式,在后續版本的系統里,僅僅申請以上兩個權限不能訪問在外部儲存里的文件。可以通過在AndroidMainfest里application部分添加

android:requestLegacyExternalStorage="true"

規避這一限制。

參考資料:https://developer.android.google.cn/training/data-storage/files/external-scoped?hl=zh_cn

在代碼里動態申請權限

在Android 6.0之后的系統里需要動態申請相應權限。

public class MainActivity extends Activity {
    String[] permissions = new String[]{
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_EXTERNAL_STORAGE
    };//權限數組
    List<String> mPermissionList = new ArrayList<>();
    private static final int PERMISSION_REQUEST = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        checkPermission();
        setContentView(R.layout.activity_main);
    }

    private void checkPermission() {
        mPermissionList.clear();
        //判斷哪些權限未授予
        for (String permission : permissions) {
            if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                mPermissionList.add(permission);
            }
        }
        if (!mPermissionList.isEmpty()) {//如果未授予權限不為空
            String[] permissions = mPermissionList.toArray(new String[0]);//將List轉為數組
            ActivityCompat.requestPermissions(MainActivity.this, permissions, PERMISSION_REQUEST);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode != PERMISSION_REQUEST) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

以上代碼申請了sdcard的讀寫權限。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM