您好,登錄后才能下訂單哦!
本篇內容介紹了“Android動態權限申請如何實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Google 在 Android 6.0 開始引入了權限申請機制,將所有權限分成了正常權限和危險權限。App 每次在使用危險權限時需要動態的申請并得到用戶的授權才能使用。
系統權限分為兩類:正常權限和危險權限。
正常權限:不會直接給用戶隱私帶來危險。如果你在其清單中列出了正常權限,系統將自動授予該權限。
危險權限:授予應用訪問用戶機密數據的權限。如果你在清單文件中列出了危險權限,則用戶必須明確批準你的應用使用這些權限。那么危險權限有那些?日歷(CALENDAR)、相機(CAMERA)、通訊錄(CONTACTS)、位置(LOCATION)、撥號(PHONE)、短信(SMS)和存儲(STORAGE)等。
<!-- 權限組:CALENDAR == 日歷讀取的權限申請 --> <uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.WRITE_CALENDAR" /> <!-- 權限組:CAMERA == 相機打開的權限申請 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 權限組:CONTACTS == 聯系人通訊錄信息獲取/寫入的權限申請 --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!-- 權限組:LOCATION == 位置相關的權限申請 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 權限組:PHONE == 撥號相關的權限申請 --> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 權限組:SMS == 短信相關的權限申請 --> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!-- 權限組:STORAGE == 讀取存儲相關的權限申請 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
申請以上權限時,除了要在清單文件中添加權限,還需要通過代碼動態申請。
1. 檢測權限
checkSelfPermission(@NonNull String permission)
2. 申請權限
requestPermissions(@NonNull String[] permissions, int requestCode)
3. 處理結果回調
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
4. 是否需要顯示 UI 界面提示用戶為什么需要這個權限
shouldShowRequestPermissionRationale(@NonNull String permission)
步驟1:在 AndroidManifest.xml 添加要申請的權限。這里以存儲權限為例
<!-- STORAGE == 讀取存儲相關權限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
步驟2:封裝一個 requestPermission 方法來動態檢測和申請權限
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermission(); }
requestPermission() 函數里會先檢測存儲權限,如果沒開啟則動態申請存儲權限。
private void requestPermission() { // checkSelfPermission() 檢測權限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //TODO 申請存儲權限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } }
注意:這個 demo 里只申請了一個權限,當我們需要申請多個權限時,可以往requestPermissions 里的第二個參數添加其它需要的權限,因為它本就是一個 String 數組,且也要在 AndroidManifest里添加。
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE ,Manifest.permission.CAMERA}
步驟3:處理用戶選擇的結果(“允許” / “拒絕”),重寫 onRequestPermissionsResult()方法。
//TODO 處理權限結果回調 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { //用戶點擊了“確定” == grantResults[0] == PackageManager.PERMISSION_GRANTED) if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i("TAG", "onRequestPermissionsResult granted"); } else { Log.i("TAG", "onRequestPermissionsResult denied"); // TODO 用戶拒絕權限申請,則彈出警示框 showWaringDialog(); } } }
步驟4:當用戶拒絕權限,則彈出警示框,并在用戶點擊“確定”后直接退出頁面。因為沒有存儲權限肯定不能使用該應用的。
/** * 用戶拒絕權限的警示 */ private void showWaringDialog() { new AlertDialog.Builder(this) .setTitle("警告!") .setMessage("請前往設置->應用->權限管理->打開存儲權限,否則無法正常使用!") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO 一般情況下如果用戶不授權的話,功能時無法運行的,則直接退出 finish(); } }).show(); }
MainActivity.java
package com.example.dynamicauthority; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import android.Manifest; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final int PERMISSION_REQUEST_CODE = 999; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); requestPermission(); } private void requestPermission() { // checkSelfPermission() 檢測權限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { //TODO 申請存儲權限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE); } } //TODO 處理權限結果回調 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { //用戶點擊了“確定” == grantResults[0] == PackageManager.PERMISSION_GRANTED) if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i("TAG", "onRequestPermissionsResult granted"); } else { Log.i("TAG", "onRequestPermissionsResult denied"); // TODO 用戶拒絕權限申請,則彈出警示框 showWaringDialog(); } } } /** * 用戶拒絕權限的警示 */ private void showWaringDialog() { new AlertDialog.Builder(this) .setTitle("警告!") .setMessage("請前往設置->應用->權限管理->打開存儲權限,否則無法正常使用!") .setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO 一般情況下如果用戶不授權的話,功能時無法運行的,則直接退出 finish(); } }).show(); } }
“Android動態權限申請如何實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。