Android權限說明
在Android系統里,想要獲取設備信息或更改設備狀態首先需要獲取系統權限。
Android 6.0(API 23)之后的系統將權限大致分成三類,分別是正常權限、危險權限和特殊權限。Android 6.0之前的系統申請權限只需要在AndroidMainfest.xml文件中申請就可以獲取得到權限。而在6.0之后的系統里,正常權限也只需要在AndroidMainfest里申請,而危險權限則不僅需要在AndroidManifest里申請,而且還需要在使用時動態申請。而特殊權限則不能通過代碼申請,只能由用戶在權限頁手動打開。
危險權限包括:
- READ_CALENDAR , WRITE_CALENDAR 讀寫日歷權限
- CAMERA 調用相機權限
- READ_CONTACTS , WRITE_CONTACTS , GET_ACCOUNTS 通訊錄權限
- ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 定位權限
- RECORD_AUDIO 錄音權限
- READ_PHONE_STATE ,CALL_PHONE READ_CALL_LOG, WRITE_CALL_LOG ADD_VOICEMAIL 手機狀態相關權限
- BODY_SENSORS 傳感器權限
- SMS SEND_SMS ,RECEIVE_SMS ,READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS SMS消息權限
- 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的讀寫權限。