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)心!