您好,登錄后才能下訂單哦!
這篇文章主要講解了“Android開發(fā)之permission動態(tài)權(quán)限如何獲取”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Android開發(fā)之permission動態(tài)權(quán)限如何獲取”吧!
說明
Android 6.0 (API 23) 之前應(yīng)用的權(quán)限在安裝時全部授予,運(yùn)行時應(yīng)用不再需要詢問用戶。在 Android 6.0 或更高版本對權(quán)限進(jìn)行了分類,對某些涉及到用戶隱私的權(quán)限可在運(yùn)行時根據(jù)用戶的需要動態(tài)授予。這樣就不需要在安裝時被強(qiáng)迫同意某些權(quán)限。
設(shè)備系統(tǒng)是 Android 6.0 (API 23) 或更高版本,并且應(yīng)用的 targetSdkVersion 是 23 或更高版本,則針對在 AndroidManifest.xml 中聲明的危險權(quán)限,在運(yùn)行時還需要動態(tài)請求用戶授權(quán)
動態(tài)權(quán)限請求相關(guān)操作的API封裝在在android.support.v4包中,發(fā)起請求權(quán)限的Activity需要直接或間接繼承android.support.v4.app.FragmentActivity。
也可以在直接或間接繼承 android.support.v4.app.Fragment 的 Fragment 中發(fā)起權(quán)限請求。
package com.xiets.demoapp; import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; /** * 一鍵備份通訊錄 * * @author xietansheng */ public class MainActivity extends AppCompatActivity { private static final int MY_PERMISSION_REQUEST_CODE = 10000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 點(diǎn)擊按鈕,將通訊錄備份保存到外部存儲器備。 * * 需要3個權(quán)限(都是危險權(quán)限): * 1. 讀取通訊錄權(quán)限; * 2. 讀取外部存儲器權(quán)限; * 3. 寫入外部存儲器權(quán)限. */ public void click(View view) { /** * 第 1 步: 檢查是否有相應(yīng)的權(quán)限,根據(jù)自己需求,進(jìn)行添加相應(yīng)的權(quán)限 */ boolean isAllGranted = checkPermissionAllGranted( new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE } ); // 如果這3個權(quán)限全都擁有, 則直接執(zhí)行備份代碼 if (isAllGranted) { doBackup(); return; } /** * 第 2 步: 請求權(quán)限 */ // 一次請求多個權(quán)限, 如果其他有權(quán)限是已經(jīng)授予的將會自動忽略掉 ActivityCompat.requestPermissions( this, new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, MY_PERMISSION_REQUEST_CODE ); } /** * 檢查是否擁有指定的所有權(quán)限 */ private boolean checkPermissionAllGranted(String[] permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // 只要有一個權(quán)限沒有被授予, 則直接返回 false return false; } } return true; } /** * 第 3 步: 申請權(quán)限結(jié)果返回處理 */ @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == MY_PERMISSION_REQUEST_CODE) { boolean isAllGranted = true; // 判斷是否所有的權(quán)限都已經(jīng)授予了 for (int grant : grantResults) { if (grant != PackageManager.PERMISSION_GRANTED) { isAllGranted = false; break; } } if (isAllGranted) { // 如果所有的權(quán)限都授予了, 則執(zhí)行備份代碼 doBackup(); } else { // 彈出對話框告訴用戶需要權(quán)限的原因, 并引導(dǎo)用戶去應(yīng)用權(quán)限管理中手動打開權(quán)限按鈕 openAppDetails(); } } } /** * 第 4 步: 備份通訊錄操作 */ private void doBackup() { // 本文主旨是講解如果動態(tài)申請權(quán)限, 具體備份代碼不再展示, 就假裝備份一下 Toast.makeText(this, "正在備份通訊錄...", Toast.LENGTH_SHORT).show(); } /** * 打開 APP 的詳情設(shè)置 */ private void openAppDetails() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("備份通訊錄需要訪問 “通訊錄” 和 “外部存儲器”,請到 “應(yīng)用信息 -> 權(quán)限” 中授予!"); builder.setPositiveButton("去手動授權(quán)", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); startActivity(intent); } }); builder.setNegativeButton("取消", null); builder.show(); } }
感謝各位的閱讀,以上就是“Android開發(fā)之permission動態(tài)權(quán)限如何獲取”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Android開發(fā)之permission動態(tài)權(quán)限如何獲取這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。