基于Activity Result API的權(quán)限封裝,權(quán)限申請(qǐng)?jiān)瓉?lái)如此簡(jiǎn)單

GitHub地址: https://github.com/kongpf8848/TKPermission

前言

什么是Activity Result API?

參考鏈接
Activity Result API 是 Google官方推薦的Activity、Fragment獲取返回結(jié)果的方式, 提供了用于注冊(cè)結(jié)果、啟動(dòng)結(jié)果以及在系統(tǒng)分派結(jié)果后對(duì)其進(jìn)行處理的組件 。引入方式如下:

implementation 'androidx.activity:activity:1.2.0-alpha06'
implementation 'androidx.activity:activity-ktx:1.2.0-alpha06'
implementation 'androidx.fragment:fragment:1.3.0-alpha06'
implementation 'androidx.fragment:fragment-ktx:1.3.0-alpha06'

主要用到兩個(gè)組件:
ActivityResultContract:契約,定義了輸入數(shù)據(jù)的類型和輸出數(shù)據(jù)的類型, 定義了如何傳遞數(shù)據(jù)和如何處理返回的數(shù)據(jù)

public abstract class ActivityResultContract<I, O> {

 /** Create an intent that can be used for {@link Activity#startActivityForResult} */
    public abstract @NonNull Intent createIntent(@NonNull Context context,
            @SuppressLint("UnknownNullness") I input);

    /** Convert result obtained from {@link Activity#onActivityResult} to O */
    @SuppressLint("UnknownNullness")
    public abstract O parseResult(int resultCode, @Nullable Intent intent);
    ......
 
}

谷歌定義了一系列常用的ActivityResultContract協(xié)議

  • StartActivityForResult,用于啟動(dòng)新的頁(yè)面并獲取返回結(jié)果
  • RequestPermission,用于申請(qǐng)單個(gè)權(quán)限并獲取返回結(jié)果
  • RequestMultiplePermissions,用于申請(qǐng)多個(gè)權(quán)限并獲取返回結(jié)果
  • GetContent(),用于選擇內(nèi)容并獲取返回結(jié)果
  • PickContact,用于選擇聯(lián)系人并獲取返回結(jié)果
  • TakePicture,用于拍照并獲取返回結(jié)果
  • TakeVideo,用于拍攝視頻并獲取返回結(jié)果

ActivityResultLauncher:?jiǎn)?dòng)器,調(diào)用ActivityResultLauncher的launch方法來(lái)啟動(dòng)頁(yè)面跳轉(zhuǎn),作用相當(dāng)于原來(lái)的startActivity()

/**
 * A launcher for a previously-{@link ActivityResultCaller#registerForActivityResult prepared call}
 * to start the process of executing an {@link ActivityResultContract}.
 *
 * @param <I> type of the input required to launch
 */
public abstract class ActivityResultLauncher<I> {

    /**
     * Executes an {@link ActivityResultContract}.
     *
     * @param input the input required to execute an {@link ActivityResultContract}.
     */
    public void launch(@SuppressLint("UnknownNullness") I input) {
        launch(input, null);
    }

    /**
     * Executes an {@link ActivityResultContract}.
     *
     * @param input the input required to execute an {@link ActivityResultContract}.
     * @param options Additional options for how the Activity should be started.
     */
    public abstract void launch(@SuppressLint("UnknownNullness") I input,
            @Nullable ActivityOptionsCompat options);

    /**
     * Unregisters this launcher, releasing the underlying result callback, and any references
     * captured within it.
     *
     * You should call this if the registry may live longer than the callback registered for this
     * launcher.
     */
    @MainThread
    public abstract void unregister();

    /**
     * Get the {@link ActivityResultContract} that was used to create this launcher.
     *
     * @return the contract that was used to create this launcher
     */
    @NonNull
    public abstract ActivityResultContract<I, ?> getContract();
}

如我們現(xiàn)在需要申請(qǐng)位置權(quán)限,舊的權(quán)限申請(qǐng)方式如下:

 val PERMISSION_REQUEST_LOCATION = 0
  ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            PERMISSION_REQUEST_LOCATION
        )

然后在onRequestPermissionsResult處理申請(qǐng)結(jié)果:

 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if (requestCode == PERMISSION_REQUEST_LOCATION) {
            if(grantResults.size == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            }
        }
    }

基于Activity Result API的申請(qǐng)方式如下:

   registerForActivityResult(RequestPermission()){
            /**
             * 此處處理申請(qǐng)結(jié)果
             */
            Toast.makeText(this@ForResultActivity, "result:${it}", Toast.LENGTH_SHORT).show()
        }.launch(Manifest.permission.ACCESS_FINE_LOCATION)

是不是一下子簡(jiǎn)潔了很多,有木有,哈哈

正文

TKPermission是基于AndroidX Activity Result API封裝的權(quán)限類庫(kù),擺脫了舊的繁瑣的權(quán)限申請(qǐng)方式,讓權(quán)限申請(qǐng)變得無(wú)比簡(jiǎn)單輕松

功能特點(diǎn)

  • 使用簡(jiǎn)單,調(diào)用方式友好,兼容Kotlin和Java,使用Kotlin語(yǔ)言調(diào)用更酸爽
  • 基于Google最新的Activity Result API封裝,代碼量極少,極簡(jiǎn)主義
  • 支持一次申請(qǐng)單個(gè)權(quán)限和多個(gè)權(quán)限,基本滿足各類權(quán)限申請(qǐng)使用場(chǎng)景

使用

implementation 'com.github.kongpf8848:tkpermission:1.0.0'

Kotlin

  • 一次申請(qǐng)單個(gè)權(quán)限
permission(Manifest.permission.CAMERA) {
    /**
     * 權(quán)限允許時(shí)回調(diào)
     */
   granted {
   }
   /**
    * 權(quán)限拒絕時(shí)回調(diào)
    */
   denied {
   }
}
  • 一次申請(qǐng)多個(gè)權(quán)限
permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO) {
     /**
      * 多個(gè)權(quán)限全部被允許時(shí)回調(diào)
      */
     allGranted {

     }
     /**
      * 被拒絕的權(quán)限列表
      */
     denied {

     }
}

Java

  • 一次申請(qǐng)單個(gè)權(quán)限
PermissionUtils.INSTANCE.requestPermission(this, Manifest.permission.READ_PHONE_STATE, new PermissionListener() {
    /**
     * 權(quán)限允許時(shí)回調(diào)
     */
    @Override
    public void granted(String permission) {
    }
    /**
     * 權(quán)限拒絕時(shí)回調(diào)
     */
    @Override
    public void denied(String permission) {
    }
});
  • 一次申請(qǐng)多個(gè)權(quán)限

    PermissionUtils.INSTANCE.requestMultiplePermissions(this, Arrays.asList(Manifest.permission.READ_CONTACTS, Manifest.permission.READ_SMS), new MultiplePermissionsListener() {
        /**
         * 多個(gè)權(quán)限全部被允許時(shí)回調(diào)
         */
        @Override
        public void allGranted() {
    
        }
        /**
         * 被拒絕的權(quán)限列表
         */
        @Override
        public void denied(List<String> list) {
    
        }
    });
    

希望TKPermission能幫助到有需要的同學(xué)們,愿大家工作順利,天天開(kāi)心!

GitHub地址: https://github.com/kongpf8848/TKPermission

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容