【问题标题】:The android application crash安卓应用程序崩溃
【发布时间】:2021-08-19 15:15:09
【问题描述】:

WhoDoctor 在the Previous code 上帮助了我

现在,Android 应用程序在我的手机上运行时崩溃了 和This is the error log

第一个问题是在我用相机扫描二维码后,它无法在二维码的结果中显示到tvResult

第二个问题是在我从存储中选择了一个二维码图像,然后点击确认后,它崩溃了

我认为是下面的问题

类型不匹配:推断类型是 Uri?但 Uri 在意料之中

galleryLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult(), object :ActivityResultCallback<ActivityResult>{
            override fun onActivityResult(result: ActivityResult?) {
                val data=result?.data
                inputImage = InputImage.fromFilePath(requireContext(), data?.data)
                processQr()
            }
        })

冗余 SAM 构造函数

binding.btnScanBarcode.setOnClickListener{
            val options=arrayOf("camera","gallery")

            val builder=AlertDialog.Builder(requireContext())
            builder.setTitle("Pick a option")

            builder.setItems(options, DialogInterface.OnClickListener { dialog, which ->
                if(which==0){
                    val cameraIntent=Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                    cameraLauncher.launch(cameraIntent)
                }else{
                    val storageIntent=Intent()
                    storageIntent.setType("image/*")
                    storageIntent.setAction(Intent.ACTION_GET_CONTENT)
                    galleryLauncher.launch(storageIntent)
                }
            })
            builder.show()
        }

'onRequestPermissionsResult(Int, Array, IntArray): Unit' 已弃用。在 Java 中已弃用

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        if(requestCode==CAMERA_PERMISSION_CODE){
            if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                checkPermission(
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    READ_STORAGE_PERMISSION_CODE)
            }else{
                Toast.makeText(requireContext(), "Camera Permission Denied", Toast.LENGTH_SHORT).show()
            }
        }else if(requestCode==READ_STORAGE_PERMISSION_CODE){
            if((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)){
                checkPermission(
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    WRITE_STORAGE_PERMISSION_CODE)
            }else{
                Toast.makeText(requireContext(), "Storage Permission Denied", Toast.LENGTH_SHORT).show()
            }
        }else if(requestCode==WRITE_STORAGE_PERMISSION_CODE) {
            if (!(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
                Toast.makeText(requireContext(), "Storage Permission Denied", Toast.LENGTH_SHORT).show()
            }
        }
    }

【问题讨论】:

    标签: android kotlin android-fragments


    【解决方案1】:

    onRequestPermissionsResult() 方法在 androidx.fragment.app.Fragment 中已弃用。

    所以你使用registerForActivityResult() 方法而不是onRequestPermissionsResult()

    以下是 kotlin 代码。 .

    val permReqLuncher = registerForActivityResult(ActivityResultContracts.RequestPermission()){
      if (it) {
         // Good pass
      } else {
         // Failed pass
      }
    }
    

    How to get a permission request in new ActivityResult API (1.3.0-alpha05)?

    private ActivityResultLauncher<String> mPermissionResult = registerForActivityResult(
            new ActivityResultContracts.RequestPermission(),
            new ActivityResultCallback<Boolean>() {
                @Override
                public void onActivityResult(Boolean result) {
                    if(result) {
                        Log.e(TAG, "onActivityResult: PERMISSION GRANTED");
                    } else {
                        Log.e(TAG, "onActivityResult: PERMISSION DENIED");
                    }
                }
            });
    
    
    
            // Launch the permission window -- this is in onCreateView()
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             mPermissionResult.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
    
            }
        });
    

    您可以请求多个权限。

    val requestMultiplePermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
        permissions.entries.forEach {
            Log.e("DEBUG", "${it.key} = ${it.value}")
        }
    }
    
    requestMultiplePermissions.launch(
        arrayOf(
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.ACCESS_FINE_LOCATION
       )
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多