我目前正在开发一个涉及相机对象检测的Android应用程序。然而,我遇到了一些需要解决的问题:
- 应用程序在授予相机权限后显示黑屏,需要一两次应用程序重启才能成功打开相机。我还做了一个提醒对话框,提示用户是否未授予相机权限。然而,提醒对话框存在一些bug:
- 如果用户在警报对话框中单击“确定”并拒绝摄像头权限,则应用程序将进入循环并重复显示警报对话框。
- 如果用户最初拒绝摄像头权限,然后通过在警报对话框中单击“确定”赠款权限,则应用会意外关闭。
onCreate函数:
if (ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
)
requestPermissions(arrayOf(android.Manifest.permission.CAMERA), 101)
else
detectObject()
权限功能:
fun getPermission() {
if (ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.CAMERA
) != PackageManager.PERMISSION_GRANTED
)
{
requestPermissions(arrayOf(android.Manifest.permission.CAMERA), 101)
}
else
{
detectObject()
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == 101 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)
{
detectObject()
}
else
{
val alert = PermissionDialog()
alert.show(supportFragmentManager, null)
}
}
警报对话框类:
import android.app.AlertDialog
import android.app.Dialog
import android.media.MediaPlayer
import android.os.Bundle
import android.widget.Toast
import androidx.fragment.app.DialogFragment
import com.example.sightfulkotlin.MainActivity
import com.example.sightfulkotlin.R
class PermissionDialog : DialogFragment() {
private lateinit var mediaPlayer: MediaPlayer
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val builder = AlertDialog.Builder(activity)
builder
.setTitle("Camera Permission")
.setIcon(android.R.drawable.ic_menu_camera)
.setMessage("Camera permission denied")
.setPositiveButton("Ok") { _, _ -> (activity as MainActivity).getPermission()}
.setNegativeButton("Cancel") { _, _ ->
Toast.makeText(context, "Sorry, we can't make the app work without the camera permission.", Toast.LENGTH_LONG).show()
}
.setCancelable(false)
return builder.create()
}
1条答案
按热度按时间h79rfbju1#
下面我写了一个代码授予相机的运行时权限,有一个字符串数组中,你可以给予多个请求授予,因为这是在运行时需要.