1. 运行时申请权限
class CameraFragment : Fragment() {
private val REQUEST_CODE_PERMISSIONS = 10
private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
//检查清单中指定的所有权限是否已被授予
private fun allPermissionsGranted() =
REQUIRED_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
activity!!.baseContext, it
) == PackageManager.PERMISSION_GRANTED
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view,
savedInstanceState)
//检查是否授予权限
if (allPermissionsGranted()) {
//权限已授予,执行相应的操作
preview_view.post {
startCamera()
}
} else {
//未授予权限,则动态申请
ActivityCompat.requestPermissions(
activity as Activity, //此处activity为FragmentActivity,转化为Activity
REQUIRED_PERMISSIONS,
REQUEST_CODE_PERMISSIONS
)
}
}
}
效果如下:

2. 处理onRequestPermissionsResult回调

在Activity中处理onRequestPermissionsResult
class ContentActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
···
}
private val REQUEST_CODE_PERMISSIONS_CAMERA = 10
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE_PERMISSIONS_CAMERA) {
if (
//确认已授权
ContextCompat.checkSelfPermission(baseContext, android.Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED
) {
//从supportFragmentManager获取当前fragment
val fragment = supportFragmentManager.fragments.let {
it.get(it.size - 1)
}
//若当前fragment刚好是CameraFragment,将fragment转化为CameraFragment,并做相应的处理
if (fragment.javaClass==CameraFragment::class.java){
fragment as CameraFragment
fragment.preview_view.post {
fragment.startCamera()
}
}
}else Toast.makeText(this, "请授予权限!", Toast.LENGTH_SHORT).show()
}
}
}