【发布时间】:2021-05-27 09:13:00
【问题描述】:
我正在使用 dexter 为导航组件提供运行时权限。
我有一个包含多个片段的活动。
在活动中,我想请求用户授予权限(存储)。
然后我有一个类(不是 Activity 或 Fragment),需要在访问一些需要运行时权限的代码之前检查用户是否已授予权限..
我还有一个 viewModel 运行需要运行时权限的代码
问题
我无法在任何这些类/viewModel 中访问上下文。我现在如何检查用户是否已授予权限。
实用类
fun requestExternalStoragePermission(context: Context, callback: PermissionsCallback) {
Dexter.withContext(context) //
.withPermissions(listOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE))
.withListener(object : MultiplePermissionsListener {
override fun onPermissionsChecked(p0: MultiplePermissionsReport?) {
p0?.let {
if (p0.areAllPermissionsGranted()) {
callback.onPermissionRequest(granted = true)
} else {
callback.onPermissionRequest(granted = false)
}
}
}
override fun onPermissionRationaleShouldBeShown(
p0: MutableList<PermissionRequest>?,
p1: PermissionToken?
) {
p1?.continuePermissionRequest()
}
})
.check()
}
界面
interface PermissionsCallback {
fun onPermissionRequest(granted: Boolean)
}
MainActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
checkForPermission()
setContentView(binding.root)
}
private fun checkForPermission(){
Utility.requestExternalStoragePermission(
this,
object : PermissionsCallback {
override fun onPermissionRequest(granted: Boolean) {
if (granted) {
//good
} else {
//show settings
}
}
更新
音乐服务
class MusicService : MediaBrowserServiceCompat() {
private val serviceJob = Job()
private val serviceScope = CoroutineScope(Dispatchers.Main +
serviceJob)
var context: Context? = null
override fun onCreate() {
super.onCreate()
context = this
checkForPermission()
}
private fun checkForPermission(){
Utility.requestExternalStoragePermission(
this,
object : PermissionsCallback {
override fun onPermissionRequest(granted: Boolean) {
if (granted) {
//good, load songs
serviceScope.launch {
musicSource.fetchMediaData()
}
} else {
//do something else
Toast.makeText(context, "We need permission nowwww", Toast.LENGTH_LONG)
.show()
}
}
})
}
override fun onDestroy() {
super.onDestroy()
serviceScope.cancel()
exoPlayer.removeListener(musicPlayerEventListener)
exoPlayer.release()
}
}
视图模型
init {
viewModelScope.launch {
val allArtistes = artisteDatabase.getAllArtiste().....//I need to check here tooo
_artisteList.value = Resource.success(allArtistes)
}
}
fun doGetArtisteSongs(long: Long){
viewModelScope.launch {
val artisteSongs = artisteDatabase.getArtisteSongs(long).....//I need to check here too
_artisteSongList.value = Resource.success(artisteSongs)
}
}
我无法使用我的实用程序函数来检查该非活动/片段类和视图模型的权限,因为它需要一个“上下文”。
正确的出路是什么?
【问题讨论】:
-
我可以看到你的实用程序类中有一个函数,并且有一个上下文参数,并且从活动传递,错误是什么?
-
没有错误...我想检查是否在非活动/片段类和视图模型(没有上下文)中授予了相同的权限
标签: android android-studio kotlin android-fragments