自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在鴻蒙系統(tǒng)上實現(xiàn)權(quán)限請求框架—桃夭權(quán)限請求框架

開發(fā) 前端
桃夭是鴻蒙系統(tǒng)上的一款權(quán)限請求框架,對請求權(quán)限的代碼進(jìn)行高度封裝,極大的簡化了申請權(quán)限的代碼邏輯,同時支持在Ability、FractionAbility、AbilitySlice、Fractiion里面申請權(quán)限。

[[433362]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

本文正在參與優(yōu)質(zhì)創(chuàng)作者激勵

一、簡介

桃夭是鴻蒙系統(tǒng)上的一款權(quán)限請求框架,對請求權(quán)限的代碼進(jìn)行高度封裝,極大的簡化了申請權(quán)限的代碼邏輯,同時支持在Ability、FractionAbility、AbilitySlice、Fractiion里面申請權(quán)限。

二、源碼

源碼

建議大家把源碼下載下來看看。

三、申請權(quán)限的一般步驟

  • 判斷是否有權(quán)限,如果有權(quán)限,直接進(jìn)行下一步。
  • 如果沒有權(quán)限,可以彈窗告知用戶申請權(quán)限的原因。
  • 彈窗告知用戶后,如果用戶同意申請權(quán)限,則判斷用戶是否點擊了不再提醒。
  • 如果用戶沒有點擊不再提醒,則開始申請權(quán)限。
  • 如果用戶點擊了不再提醒,則彈窗告知用戶去設(shè)置頁面開啟權(quán)限,用戶點擊彈窗后,跳轉(zhuǎn)到設(shè)置頁面。
  • 重寫onRequestPermissionsFromUserResult方法,判斷用戶是否授予權(quán)限。

每次申請權(quán)限的時候,都需要經(jīng)過以上幾個步驟,當(dāng)申請的權(quán)限越來越多,大量的重復(fù)代碼就出現(xiàn)了。為了減少重復(fù)代碼,我封裝了一個權(quán)限請求框架,權(quán)限請求框架取名為桃夭。

四、桃夭的使用方式

如下代碼,先添加依賴,然后你只需要告知權(quán)限請求框架你需要什么權(quán)限,權(quán)限請求框架就會告知你權(quán)限申請成功還是失敗。你不需要手動判斷是否有權(quán)限,不需要彈窗告知用戶申請權(quán)限的原因,不需要判斷用戶是否點擊了不再提醒,不需要跳轉(zhuǎn)設(shè)置頁面讓用戶開啟權(quán)限,不需要重寫onRequestPermissionsFromUserResult方法??蚣馨堰@些代碼邏輯都給做了,你只需要關(guān)注權(quán)限申請成功還是失敗。

申請權(quán)限變得如此之簡單。

添加依賴

  1. api 'io.gitee.zhongte:taoyao:1.0.1' 

 申請權(quán)限

  1. // 申請多設(shè)備協(xié)同權(quán)限 
  2. EasyPermission.requestPermission(this, EasyPermission.DISTRIBUTED_DATASYNC, new PermissionAction() { 
  3.             @Override 
  4.             public void onGranted(List<String> permissions) { 
  5.                 // 權(quán)限申請成功 
  6.                  
  7.             } 
  8.  
  9.             @Override 
  10.             public void onDenied(List<String> permissions) { 
  11.                 // 權(quán)限申請失敗 
  12.             } 
  13.         }, SystemPermission.DISTRIBUTED_DATASYNC); 

 申請權(quán)限的時候可能會涉及到兩個彈窗,一個彈窗是用來告知用戶申請權(quán)限的原因,另一個彈窗是用來告知用戶去設(shè)置頁面開啟權(quán)限,這兩個彈窗在不同的應(yīng)用里面可能長得不一樣,所以這兩個彈窗并沒有被封裝到桃夭框架里面,而是需要使用者根據(jù)你的彈窗樣式對桃夭進(jìn)行二次封裝,我在源碼里面對桃夭框架進(jìn)行了二次封裝,大家可以把源碼下載下來,參考下我是如何對桃夭框架進(jìn)行二次封裝的。二次封裝完成后,就可以愉快的使用上面的代碼申請權(quán)限了。

五、實現(xiàn)原理

5、1 檢測申請的權(quán)限是否在配置文件中聲明

申請的權(quán)限必須在配置文件中聲明,否則桃夭會直接拋異常。如何檢測申請的權(quán)限是否在配置文件中聲明。

如下代碼,獲取bundleManager對象,通過bundleManager對象獲取應(yīng)用信息,之后就可以獲取應(yīng)用在配置文件中聲明的權(quán)限了。

  1. /** 
  2.  * 獲取在配置文件中聲明的權(quán)限 
  3.  * 
  4.  * @param context 上下文 
  5.  * @return 在配置文件中聲明的權(quán)限 
  6.  */ 
  7. private List<String> getConfigPermissions(Context context) { 
  8.     // 獲取bundleManager對象 
  9.     IBundleManager bundleManager = context.getBundleManager(); 
  10.     String bundleName = context.getBundleName(); 
  11.     try { 
  12.         // 獲取應(yīng)用信息 
  13.         BundleInfo bundleInfo = bundleManager.getBundleInfo(bundleName, IBundleManager.GET_BUNDLE_WITH_REQUESTED_PERMISSION); 
  14.         // 獲取應(yīng)用在配置文件中聲明的權(quán)限 
  15.         List<String> reqPermissionDetails = bundleInfo.reqPermissions; 
  16.         if (reqPermissionDetails == null || reqPermissionDetails.isEmpty()) { 
  17.             throw new IllegalStateException("請在配置文件中聲明要申請的權(quán)限"); 
  18.         } 
  19.         return reqPermissionDetails; 
  20.     } catch (RemoteException e) { 
  21.         e.printStackTrace(); 
  22.     } 
  23.     return new ArrayList<>(); 

獲取到在配置文件中聲明的權(quán)限后,就可以判斷申請的權(quán)限是否在配置文件中了

  1. /** 
  2.      * 檢查申請的權(quán)限是否在配置文件中聲明 
  3.      * 
  4.      * @param permissions 要申請的權(quán)限 
  5.      */ 
  6.     private void checkPermissions(String... permissions) { 
  7.         if (permissions == null || permissions.length == 0) { 
  8.             throw new IllegalArgumentException("請至少申請一個權(quán)限"); 
  9.         } 
  10.         // 獲取在配置文件中聲明的權(quán)限 
  11.         mReqPermissions = getConfigPermissions(mOrigin.getContext()); 
  12.         if (mReqPermissions.isEmpty()) { 
  13.             throw new IllegalStateException("請在配置文件中聲明要申請的權(quán)限"); 
  14.         } 
  15.         for (String target : permissions) { 
  16.             if (!mReqPermissions.contains(target)) { 
  17.                 // 沒有在配置中聲明要申請的權(quán)限,直接拋異常 
  18.                 throw new IllegalStateException(String.format("%1$s權(quán)限沒有配置文件中聲明", target)); 
  19.             } 
  20.         } 
  21.     } 

5、2 判斷是否有權(quán)限

檢測完權(quán)限是否在配置中聲明后,就可以判斷是否有權(quán)限了。這里就是通過上下文對象的verifySelfPermission方法來判斷是否有權(quán)限,如果沒有權(quán)限,可以彈窗告知用戶申請的原因。

  1. /** 
  2.     * 是否有權(quán)限 
  3.     *  
  4.     * @param context 
  5.     * @param permissions 
  6.     * @return 
  7.     */ 
  8.    @Override 
  9.    public boolean hasPermission(Context context, List<String> permissions) { 
  10.        for (String permission : permissions) { 
  11.            int result = context.verifySelfPermission(permission); 
  12.            if (result == IBundleManager.PERMISSION_DENIED) { 
  13.                // 沒有權(quán)限 
  14.                return false
  15.            } 
  16.        } 
  17.        return true
  18.    } 

5、3 判斷用戶是否點擊了不再提醒

通過上下文對象的canRequestPermission方法來判斷用戶是否點擊了不再提醒。

  1. /** 
  2.    * 用戶是否點擊了不在提醒 
  3.    * 
  4.    * @param permission 權(quán)限 
  5.    * @return 
  6.    */ 
  7.   @Override 
  8.   public boolean canRequestPermission(String permission) { 
  9.       return mContext.canRequestPermission(permission); 
  10.   } 

5、4 跳轉(zhuǎn)到設(shè)置頁面

如果用戶點擊了不再提醒,則可以跳轉(zhuǎn)到設(shè)置頁面讓用戶開啟權(quán)限

  1. /** 
  2.      * 跳轉(zhuǎn)到設(shè)置頁面 
  3.      */ 
  4.     @Override 
  5.     public void gotoSetting() { 
  6.         try { 
  7.             Intent intent = new Intent(); 
  8.             intent.setAction(IntentConstants.ACTION_APPLICATION_DETAILS_SETTINGS); 
  9.             intent.setUri(Uri.parse("package:" + mOrigin.getContext().getBundleName())); 
  10.             mOrigin.startAbility(intent); 
  11.         } catch (Exception e) { 
  12.             e.printStackTrace(); 
  13.         } 
  14.     } 

5、5 啟動透明的Ability申請權(quán)限

如果沒有權(quán)限,用戶頁面沒有點擊不再提醒,那就可以申請權(quán)限了。為了不讓調(diào)用者重寫onRequestPermissionsFromUserResult方法,桃夭內(nèi)部啟動了一個Ability。如下代碼。

  1. /** 
  2.  * 開啟一個透明的Ability來申請權(quán)限,這樣外界就不需要重寫onRequestPermissionsFromUserResult方法 
  3.  */ 
  4. public class PermissionAbility extends Ability { 
  5.  
  6.     private static final int REQUEST_CODE = 0X10; 
  7.     public static final String KEY_PERMISSION = "key_permission"
  8.     public static final String KEY_TYPE = "key_type"
  9.     public static final String SENSITIVE_PERMISSION = "sensitive_permission"
  10.  
  11.     @Override 
  12.     public void onStart(Intent intent) { 
  13.         super.onStart(intent); 
  14.         getWindow().setTransparent(true); 
  15.         super.setUIContent(ResourceTable.Layout_ability_permission); 
  16.         List<String> permissions = intent.getSerializableParam(KEY_PERMISSION); 
  17.         String permissionType = intent.getStringParam(KEY_TYPE); 
  18.         // 請求權(quán)限 
  19.         requestPermissionsFromUser(permissions.toArray(new String[0]), REQUEST_CODE); 
  20.     } 
  21.  
  22.     @Override 
  23.     public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) { 
  24.         super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults); 
  25.         // 權(quán)限的回調(diào)方法 
  26.         Postman.send(permissions, grantResults); 
  27.         terminateAbility(); 
  28.     } 
  29.  
  30.     @Override 
  31.     protected void onAbilityResult(int requestCode, int resultCode, Intent resultData) { 
  32.         super.onAbilityResult(requestCode, resultCode, resultData); 
  33.     } 

直接啟動一個Ability會發(fā)生頁面跳轉(zhuǎn),為了不讓頁面發(fā)生跳轉(zhuǎn),這里啟動了一個透明的Ability。如何將Ability設(shè)置透明,如下代碼。在abilities節(jié)點添加metaData,這里最關(guān)鍵的是Translucent,也就是透明。

  1. "abilities": [ 
  2.       { 
  3.         "orientation""unspecified"
  4.         "name""com.poetry.taoyao.ability.PermissionAbility"
  5.         "icon""$media:icon"
  6.         "description""$string:permissionability_description"
  7.         "label""$string:taoyao_PermissionAbility"
  8.         "type""page"
  9.         "launchType""standard"
  10.         "metaData": { 
  11.           "customizeData": [ 
  12.             { 
  13.               "name""hwc-theme"
  14.               "value""androidhwext:style/Theme.Emui.Translucent.NoTitleBar" 
  15.             } 
  16.           ] 
  17.         } 
  18.       } 

僅僅有上面的步驟好不夠,需要在Ability或者AbilitySlice里面將窗口設(shè)置成透明。如下代碼。

  1. getWindow().setTransparent(true); 

 經(jīng)過上面兩步,也就是將Ability的主題和窗口都設(shè)置成透明,這樣就能將Ability變成透明的了,同時也不會發(fā)生頁面跳轉(zhuǎn)。

5、6 判斷用戶是否授予權(quán)限

判斷用戶是否授予權(quán)限,可以使用標(biāo)準(zhǔn)的方式來判斷。也就是通過grantResult來判斷用戶是否授予權(quán)限。

  1. @Override 
  2.  public boolean hasPermission(int[] grantResults, String... permissions) { 
  3.      if (grantResults == null || grantResults.length <= 0) { 
  4.          return false
  5.      } 
  6.      for (int grantResult : grantResults) { 
  7.          if (grantResult == IBundleManager.PERMISSION_DENIED) { 
  8.              return false
  9.          } 
  10.      } 
  11.      return true
  12.  } 

其實還有另外的方式來判斷用戶是否授予權(quán)限。也就是不管用戶是否授權(quán),直接訪問相關(guān)業(yè)務(wù)。比如,申請錄音權(quán)限,當(dāng)系統(tǒng)回調(diào)onRequestPermissionsFromUserResult方法時,直接去錄音,如果發(fā)生異常,捕獲異常說明沒有權(quán)限。如下代碼:

  1. /** 
  2.     * 通過直接錄音的方式來判斷是否有錄音權(quán)限 
  3.     *  
  4.     * @param context 
  5.     * @return 
  6.     * @throws Throwable 
  7.     */ 
  8.    @Override 
  9.    public boolean test(Context context) throws Throwable { 
  10.        AudioStreamInfo audioStreamInfo = new AudioStreamInfo.Builder().encodingFormat( 
  11.                AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT) 
  12.                .channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_STEREO) 
  13.                .sampleRate(AUDIO_SAMPLE_RATE) 
  14.                .build(); 
  15.        AudioCapturerInfo audioCapturerInfo = new AudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo).build(); 
  16.        try { 
  17.            AudioCapturer capturer = new AudioCapturer(audioCapturerInfo); 
  18.            // 錄音 
  19.            capturer.start(); 
  20.            new Timer().schedule(new TimerTask() { 
  21.                @Override 
  22.                public void run() { 
  23.                    capturer.stop(); 
  24.                } 
  25.            }, AUDIO_RECORDING_TIME); 
  26.            // 沒有發(fā)生異常,有權(quán)限 
  27.            return true
  28.        } catch (Exception e) { 
  29.            // 發(fā)生異常,無權(quán)限 
  30.            return false
  31.        } 
  32.    } 

桃夭在判斷用戶是否授權(quán)時,上面的兩種方式都使用了。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2024-07-26 16:17:22

2021-05-06 16:21:55

鴻蒙HarmonyOS應(yīng)用開發(fā)

2012-07-30 09:32:00

Web

2017-04-21 16:00:09

2022-12-26 00:00:01

Go框架前端

2018-05-03 19:14:23

iOS開發(fā)框架API

2021-10-12 10:50:31

鴻蒙HarmonyOS應(yīng)用

2025-01-07 08:20:00

2024-02-18 12:44:22

2024-07-31 08:01:48

2021-07-30 14:54:54

鴻蒙HarmonyOS應(yīng)用

2015-06-18 10:20:12

Swift初學(xué)者權(quán)限

2010-03-02 10:59:04

2010-08-20 12:01:02

SNMP管理框架

2010-10-28 11:17:29

Oracle系統(tǒng)權(quán)限

2024-11-04 08:16:08

Go語言Web 框架

2024-12-16 00:48:39

Gin框架函數(shù)

2020-11-26 10:08:17

Golang GinW

2017-07-11 09:21:40

quartzshiro權(quán)限框架

2022-02-18 08:34:33

JavaSa-Token項目
點贊
收藏

51CTO技術(shù)棧公眾號