1首先我们在PermissionX目录右击->New->Module
右键com.example.brills创建一个InvisibleFragment类
class InvisibleFragment : Fragment(){
private var callback :((Boolean,List<String>) -> Unit)? = null
fun requestNow(cb : (Boolean,List<String>) -> Unit,vararg permission:String){
callback = cb
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 1){
val deniedList = ArrayList<String>()
for((index,result) in grantResults.withIndex()){
if (result != PackageManager.PERMISSION_GRANTED){
deniedList.add(permissions[index])
}
}
val allGranted = deniedList.isEmpty()
callback?.let { it(allGranted,deniedList) }
}
}
}
(Boolean,List< String>) ->Unit这种函数写起来复杂,还可以简化
typealias PermissionCallback = (Boolean,List<String>) ->Unit
class InvisibleFragment : Fragment(){
private var callback :PermissionCallback? = null
fun requestNow(cb :PermissionCallback, vararg permission:String){
callback = cb
}
...
}
typealias关键字可以用于给任意类型指定一个别名,我们将(Boolean,List< String>)指定成PermissionCallback。
接着新建一个PermissionX单例类
object PermissionX {
private const val TAG ="InvisibleFragment"
fun request(activity : FragmentActivity, vararg permissions: String,callback:PermissionCallback){
val fragmentManager = activity.supportFragmentManager
val existedFragment = fragmentManager.findFragmentByTag(TAG)
val fragment = if(existedFragment !=null){
existedFragment as InvisibleFragment
}else{
val invisibleFragment = InvisibleFragment()
fragmentManager.beginTransaction().add(invisibleFragment, TAG).commitNow()
invisibleFragment
}
fragment.requestNow(callback,*permissions)
}
}
在permissions参数前面加一个*,这个符号表示将一个数组转换成可变长度传输过去
2对开源库进行测试
想在app中引入library模块,需要编辑app/build.gradle文件
dependencies {
...
implementation project(':blibrary')
}
编写MainActivity中的代码
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
makeCall.setOnClickListener {
PermissionX.request(this, Manifest.permission.CALL_PHONE){allGranted , deniedList ->
if (allGranted){
call()
}else{
Toast.makeText(this,"you denied $deniedList",Toast.LENGTH_SHORT).show()
}
}
}
}
private fun call(){
try {
val intent = Intent(Intent.ACTION_CALL)
intent.data = Uri.parse("tel:10086")
startActivity(intent)
}catch (e : SecurityException){
e.printStackTrace()
}
}
}