【问题标题】:Request permission dialog send app to the background请求权限对话框将应用程序发送到后台
【发布时间】:2021-03-26 05:09:07
【问题描述】:

我有发送短信按钮,应用程序要求用户提供SEND_SMS 权限,然后发送短信。但是当我点击发送短信按钮应用程序被发送到后台和权限请求对话框显示在主屏幕上。当我单击允许并返回应用程序时,我已自动导航到应用程序的主页片段。无论如何,如果我返回带有发送 SMS 按钮的片段,我就不能发送 SMS。 (所以权限授予是持久的。)我的代码如下所示

AndroidManifest.xml我有

<uses-permission android:name="android.permission.SEND_SMS" />

在 MainActivity.kt 中

 fun requestSendSmsPermission() {

        if (ActivityCompat.shouldShowRequestPermissionRationale(
                this,
                Manifest.permission.SEND_SMS
            )
        ) {
            android.app.AlertDialog.Builder(this)
            .setTitle("Permission Request")
            .setMessage("Reason for permission request")
            .setPositiveButton("ok"
            ) { _, _ ->
                ActivityCompat.requestPermissions(
                    this@MainActivity,
                    arrayOf(Manifest.permission.SEND_SMS),
                    SEND_SMS_PERMISSION_CODE
                )
                sendSMS()
            }
            .setNegativeButton("cancel"
            ) { dialog, _ -> dialog.dismiss() }
            .create().show()
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.SEND_SMS),
                SEND_SMS_PERMISSION_CODE
            )
            sendSMS()
        }

    }

    private fun sendSMS(){
        val emergencyContactNo = "1234567890"
        val messageBody =
            "hello there"
        val smsManager: SmsManager = SmsManager.getDefault()
        smsManager.sendTextMessage(emergencyContactNo, null, messageBody, null, null)
        Toast.makeText(this, "Message Sent", Toast.LENGTH_LONG).show()
    }


  override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String?>,
        grantResults: IntArray
    ) {
        if (requestCode == SEND_SMS_PERMISSION_CODE) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Permission GRANTED", Toast.LENGTH_SHORT).show()
                sendSMS()

            } else {
                Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show()
            }
        }
    }

在我的短信发送片段中

mainActivity = activity as MainActivity

binding.btnSms.setOnClickListener {
     mainActivity.requestSendSmsPermission()
}

我尝试了什么?

  • 我尝试在那里的新项目中使用相同的代码它工作正常。但在 我的项目我正在使用导航架构组件。

在我看来,问题在于导航组件和权限对话框组合。那么导航组件如何使用运行时权限呢?

【问题讨论】:

  • onPause()onStop() 中是否有任何可能导致此行为的代码?
  • @ADM 感谢您与我们联系。没有这样的代码。
  • 这可能是因为应用程序崩溃了。我看到您在请求您不应该获得的许可后致电sendSMS()。只有在您获得许可后,您才应该致电 sendSMS()。删除所有这些对sendSMS() 的调用,它应该可以正常工作
  • @ADM 感谢它的工作。你介意写一个答案,所以我可以接受。

标签: android android-permissions


【解决方案1】:

原因是您遇到了 java.lang.SecurityException: Sending SMS message: does not have android.permission.SEND_SMS 崩溃。

因为您在请求权限后同步调用sendSms。您必须等待被授予权限,或者如果它已经立即授予呼叫sendSms

在授予权限之前删除所有sendSms 调用。查看Basic Sample

fun requestSendSmsPermission() {
    if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS)) {
        android.app.AlertDialog.Builder(this)
            .setTitle("Permission Request")
            .setMessage("Reason for permission request")
            .setPositiveButton("ok"
            ) { _, _ ->
                ActivityCompat.requestPermissions(
                    this@MainActivity,
                    arrayOf(Manifest.permission.SEND_SMS),
                    SEND_SMS_PERMISSION_CODE
                )
            }
            .setNegativeButton("cancel"
            ) { dialog, _ -> dialog.dismiss() }
            .create().show()
    } else {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.SEND_SMS),
            SEND_SMS_PERMISSION_CODE
        )
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多