欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android權(quán)限如何禁止以及友好提示用戶開(kāi)通必要權(quán)限詳解

 更新時(shí)間:2019年04月09日 11:22:45   作者:丁先森  
這篇文章主要給大家介紹了關(guān)于Android權(quán)限如何禁止以及友好提示用戶開(kāi)通必要權(quán)限的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Android權(quán)限

Android安全架構(gòu)規(guī)定:默認(rèn)情況下,任何應(yīng)用都沒(méi)有權(quán)限執(zhí)行對(duì)其他應(yīng)用、操作系統(tǒng)或用戶有不利影響的任何操作。這包括讀寫(xiě)用戶的私有數(shù)據(jù)(聯(lián)系人,短信,相冊(cè),位置)、讀寫(xiě)其他應(yīng)用的文件、執(zhí)行網(wǎng)絡(luò)訪問(wèn)、使設(shè)備保持喚醒狀態(tài)等等。

如果是一些正常的權(quán)限(非高危權(quán)限),比如網(wǎng)絡(luò)訪問(wèn)等在應(yīng)用清單文件(AndroidManifest.xml)中配置,系統(tǒng)會(huì)自動(dòng)授予,
但是如果有一些高危權(quán)限,位置,文件存儲(chǔ),短信等這個(gè)時(shí)候系統(tǒng)會(huì)要求用戶授予權(quán)限,Android 發(fā)出權(quán)限請(qǐng)求的方式取決于系統(tǒng)版本:

1、如果設(shè)備運(yùn)行的是Android 6.0(Marshmallow,API 23)或更高版本,并且應(yīng)用的targetSdkVersion是23或更高版本,則應(yīng)用將在運(yùn)行時(shí)向用戶請(qǐng)求權(quán)限(Runtime Permissions)。用戶可隨時(shí)撤銷權(quán)限,因此應(yīng)用每次運(yùn)行時(shí)都應(yīng)該檢查自身是否具備所需的權(quán)限。

2、如果設(shè)備運(yùn)行的是Android 5.1(LOLLIPOP_MR1,API 22)或更低版本,并且應(yīng)用的targetSdkVersion是22或更低版本,則系統(tǒng)在用戶安裝應(yīng)用時(shí)就要求用戶授予權(quán)限。如果更新應(yīng)用時(shí)又新增了權(quán)限,系統(tǒng)會(huì)在用戶更新應(yīng)用時(shí)要求授予該權(quán)限。用戶一旦安裝應(yīng)用,他們撤銷權(quán)限的唯一方式是卸載應(yīng)用。

如果我們程序中某些功能,發(fā)布一些圖片等操作,這個(gè)時(shí)候避免不了要訪問(wèn)用戶設(shè)備的圖片,但是用戶開(kāi)始的時(shí)候禁止了,用戶并不知道,這個(gè)時(shí)候訪問(wèn)就會(huì)有問(wèn)題了,那么怎樣去提示用戶并且引導(dǎo)用戶去授予這些權(quán)限呢,看下面的效果(說(shuō)的再多都不如圖來(lái)的實(shí)際)

下面就開(kāi)始擼碼了

private void getpermission() {
  //兩個(gè)日歷權(quán)限和一個(gè)數(shù)據(jù)讀寫(xiě)權(quán)限
  String[] permissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; //
  PermissionsUtils.showSystemSetting = true;//是否支持顯示系統(tǒng)設(shè)置權(quán)限設(shè)置窗口跳轉(zhuǎn)
  //這里的this不是上下文,是Activity對(duì)象!
  PermissionsUtils.getInstance().chekPermissions(this, permissions, permissionsResult);
 }

首先在頁(yè)面Activity啟動(dòng)之后調(diào)用這個(gè)方法(注意:數(shù)組中的權(quán)限可以自己配置,這里我寫(xiě)了四個(gè))

權(quán)限監(jiān)聽(tīng)接口對(duì)象

//創(chuàng)建監(jiān)聽(tīng)權(quán)限的接口對(duì)象
 PermissionsUtils.IPermissionsResult permissionsResult = new PermissionsUtils.IPermissionsResult() {
  @Override
  public void passPermissons() {
//權(quán)限通過(guò)執(zhí)行的方法
   //權(quán)限通過(guò)驗(yàn)證
  }

  @Override
  public void forbitPermissons() {
//這是沒(méi)有通過(guò)權(quán)限的時(shí)候提示的內(nèi)容,自定義即可
   Toast.makeText(mContext, "您沒(méi)有允許部分權(quán)限,可能會(huì)導(dǎo)致部分功能不能正常使用,如需正常使用 請(qǐng)?jiān)试S權(quán)限", Toast.LENGTH_SHORT).show();
   finish();
//   Tool.exitApp();
  }
 };

還需要在activity中重寫(xiě)一個(gè)方法

@Override
 public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  //就多一個(gè)參數(shù)this
  PermissionsUtils.getInstance().onRequestPermissionsResult(this, requestCode, permissions, grantResults);
 }

權(quán)限以及彈窗設(shè)置權(quán)限工具類PermissionsUtils.java

/**
 * 權(quán)限工具類
 */
public class PermissionsUtils {

 private final int mRequestCode = 100;//權(quán)限請(qǐng)求碼
 public static boolean showSystemSetting = true;

 private PermissionsUtils() {
 }

 private static PermissionsUtils permissionsUtils;
 private IPermissionsResult mPermissionsResult;

 public static PermissionsUtils getInstance() {
  if (permissionsUtils == null) {
   permissionsUtils = new PermissionsUtils();
  }
  return permissionsUtils;
 }

 public void chekPermissions(Activity context, String[] permissions, @NonNull IPermissionsResult permissionsResult) {
  mPermissionsResult = permissionsResult;
  if (Build.VERSION.SDK_INT < 23) {
   //6.0才用動(dòng)態(tài)權(quán)限
   permissionsResult.passPermissons();
   return;
  }

  //創(chuàng)建一個(gè)mPermissionList,逐個(gè)判斷哪些權(quán)限未授予,未授予的權(quán)限存儲(chǔ)到mPerrrmissionList中
  List<String> mPermissionList = new ArrayList<>();
  //逐個(gè)判斷你要的權(quán)限是否已經(jīng)通過(guò)
  for (int i = 0; i < permissions.length; i++) {
   if (ContextCompat.checkSelfPermission(context, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
    mPermissionList.add(permissions[i]);//添加還未授予的權(quán)限
   }
  }
  //申請(qǐng)權(quán)限
  if (mPermissionList.size() > 0) {//有權(quán)限沒(méi)有通過(guò),需要申請(qǐng)
   ActivityCompat.requestPermissions(context, permissions, mRequestCode);
  } else {
   //說(shuō)明權(quán)限都已經(jīng)通過(guò),可以做你想做的事情去
   permissionsResult.passPermissons();
   return;
  }
 }

 //請(qǐng)求權(quán)限后回調(diào)的方法 //參數(shù): requestCode 是我們自己定義的權(quán)限請(qǐng)求碼
 // 參數(shù): permissions 是我們請(qǐng)求的權(quán)限名稱數(shù)組
 // 參數(shù): grantResults 是我們?cè)趶棾鲰?yè)面后是否允許權(quán)限的標(biāo)識(shí)數(shù)組,數(shù)組的長(zhǎng)度對(duì)應(yīng)的是權(quán)限名稱數(shù)組的長(zhǎng)度,數(shù)組的數(shù)據(jù)0表示允許權(quán)限,-1表示我們點(diǎn)擊了禁止權(quán)限
 public void onRequestPermissionsResult(Activity context, int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  boolean hasPermissionDismiss = false;
  //有權(quán)限沒(méi)有通過(guò)
  if (mRequestCode == requestCode) {
   for (int i = 0; i < grantResults.length; i++) {
    if (grantResults[i] == -1) {
     hasPermissionDismiss = true;
    }
   }
   //如果有權(quán)限沒(méi)有被允許
   if (hasPermissionDismiss) {
    if (showSystemSetting) {
     showSystemPermissionsSettingDialog(context);//跳轉(zhuǎn)到系統(tǒng)設(shè)置權(quán)限頁(yè)面,或者直接關(guān)閉頁(yè)面,不讓他繼續(xù)訪問(wèn)
    } else {
     mPermissionsResult.forbitPermissons();
    }
   } else {
    //全部權(quán)限通過(guò),可以進(jìn)行下一步操作。。。
    mPermissionsResult.passPermissons();
   }
  }
 }

 /**
  * 不再提示權(quán)限時(shí)的展示對(duì)話框
  */
 AlertDialog mPermissionDialog;

 private void showSystemPermissionsSettingDialog(final Activity context) {
  final String mPackName = context.getPackageName();
  if (mPermissionDialog == null) {
   mPermissionDialog = new AlertDialog.Builder(context).setMessage("已禁用權(quán)限,請(qǐng)手動(dòng)授予").setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
     cancelPermissionDialog();
     Uri packageURI = Uri.parse("package:" + mPackName);
     Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
     context.startActivity(intent);
     context.finish();
    }
   }).setNegativeButton("取消", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
     //關(guān)閉頁(yè)面或者做其他操作
     cancelPermissionDialog();
     //mContext.finish();
     mPermissionsResult.forbitPermissons();
    }
   }).create();
  }
  mPermissionDialog.show();
  //放在show()之后,不然有些屬性是沒(méi)有效果的,比如height和width
  //以下代碼設(shè)置解決彈窗不居中問(wèn)題,一側(cè)有邊距,一側(cè)沒(méi)有
  Window dialogWindow = mPermissionDialog.getWindow();
  WindowManager m = context.getWindowManager();
  Display d = m.getDefaultDisplay(); // 獲取屏幕寬、高
  WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 獲取對(duì)話框當(dāng)前的參數(shù)值
  // 設(shè)置寬度
  p.width = (int) (d.getWidth() * 0.95); // 寬度設(shè)置為屏幕的0.95
  p.gravity = Gravity.CENTER;//設(shè)置位置
  //p.alpha = 0.8f;//設(shè)置透明度
  dialogWindow.setAttributes(p);

 }

 //關(guān)閉對(duì)話框
 private void cancelPermissionDialog() {
  if (mPermissionDialog != null) {
   mPermissionDialog.cancel();
   mPermissionDialog = null;
  }
 }

 public interface IPermissionsResult {
  void passPermissons();

  void forbitPermissons();
 }
}

以上這些代碼就可以實(shí)現(xiàn)gif圖的效果,當(dāng)然可以自定義任意效果

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android垃圾回收機(jī)制解決內(nèi)存泄露問(wèn)題

    Android垃圾回收機(jī)制解決內(nèi)存泄露問(wèn)題

    這篇文章主要介紹了Android垃圾回收機(jī)制解決內(nèi)存泄露問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android實(shí)現(xiàn)滑動(dòng)標(biāo)簽頁(yè)

    Android實(shí)現(xiàn)滑動(dòng)標(biāo)簽頁(yè)

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)滑動(dòng)標(biāo)簽頁(yè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Android實(shí)現(xiàn)倒計(jì)時(shí)30分鐘功能

    Android實(shí)現(xiàn)倒計(jì)時(shí)30分鐘功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)倒計(jì)時(shí)30分鐘功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android9.0 靜默安裝源碼的實(shí)現(xiàn)

    Android9.0 靜默安裝源碼的實(shí)現(xiàn)

    這篇文章主要介紹了Android9.0 靜默安裝源碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊效果

    Android實(shí)現(xiàn)動(dòng)態(tài)高斯模糊效果

    在Android開(kāi)發(fā)中常常會(huì)用到高斯模糊,但有的時(shí)候我們可能會(huì)需要一個(gè)圖片以不同的模糊程度展現(xiàn)出來(lái),那如何實(shí)現(xiàn)呢,一起通過(guò)本文來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2016-08-08
  • 完美實(shí)現(xiàn)ExpandableListView二級(jí)分欄效果

    完美實(shí)現(xiàn)ExpandableListView二級(jí)分欄效果

    這篇文章主要為大家詳細(xì)介紹了ExpandableListView實(shí)現(xiàn)二級(jí)分欄效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android系統(tǒng)圖片分享工具類

    Android系統(tǒng)圖片分享工具類

    這篇文章主要為大家詳細(xì)介紹了Android系統(tǒng)自帶分享圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 詳解在Flutter中如何使用dio

    詳解在Flutter中如何使用dio

    應(yīng)用程序開(kāi)發(fā)的一個(gè)關(guān)鍵部分是優(yōu)雅地處理網(wǎng)絡(luò)請(qǐng)求。網(wǎng)絡(luò)返回的響應(yīng)可能包含意想不到的結(jié)果,為了獲得良好的用戶體驗(yàn),您需要提前處理邊緣情況。本文將詳細(xì)為大家介紹Flutter如何使用dio,需要的可以參考一下
    2022-04-04
  • Android 實(shí)現(xiàn)獲取手機(jī)里面的所有圖片詳解及實(shí)例

    Android 實(shí)現(xiàn)獲取手機(jī)里面的所有圖片詳解及實(shí)例

    這篇文章主要介紹了Android 實(shí)現(xiàn)獲取手機(jī)里面的所有圖片詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • React Native中Android物理back鍵按兩次返回鍵即退出應(yīng)用

    React Native中Android物理back鍵按兩次返回鍵即退出應(yīng)用

    這篇文章主要給大家介紹了關(guān)于React Native中Android物理back鍵按兩次返回鍵即退出應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10

最新評(píng)論