android kotlin 中的相机权限

问题描述 投票:0回答:1

我目前正在开发一个涉及相机对象检测的Android应用程序。但是,我遇到了一些需要解决的问题:

  • 应用程序在授予相机权限后黑屏,需要重启一两次应用程序才能成功打开相机。 如果未授予相机权限,我还制作了一个警告对话框来提示用户。但是,警报对话框有一些错误:
  • 如果用户在警告对话框中单击“确定”并拒绝相机权限,应用程序将进入循环并重复显示警告对话框。
  • 如果用户最初拒绝相机权限,然后通过单击警告对话框中的“确定”授予它,应用程序会意外关闭。

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()
       }
android kotlin android-camera2 user-permissions
1个回答
0
投票

下面我写了一段代码,用于授予相机运行时权限,有一个字符串数组,您可以在其中根据需要在运行时授予多个请求。

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 200;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (checkPermission()) {
        //main logic or main code

       // . write your main code to execute, It will execute if the permission is already given.

        } else {
            requestPermission();
        }
    }

    private boolean checkPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED) {
            // Permission is not granted
            return false;
        }
        return true;
    }

    private void requestPermission() {

        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.CAMERA},
                PERMISSION_REQUEST_CODE);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "Permission Granted", Toast.LENGTH_SHORT).show();

                    // main logic
                } else {
                    Toast.makeText(getApplicationContext(), "Permission Denied", Toast.LENGTH_SHORT).show();
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                                != PackageManager.PERMISSION_GRANTED) {
                            showMessageOKCancel("You need to allow access permissions",
                                    new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                                                requestPermission();
                                            }
                                        }
                                    });
                        }
                    }
                }
                break;
        }
    }

    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(MainActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.