请求权限对话框将应用程序发送到后台
Request permission dialog send app to the background
我有“发送短信”按钮,应用程序会在其中请求用户 SEND_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()
}
我尝试了什么?
- 我尝试在新项目上使用相同的代码,但效果很好。但在
我的项目我正在使用导航架构组件。
对我来说,问题似乎出在导航组件和权限对话框的组合上。那么我该如何使用导航组件的运行时权限呢?
原因是您遇到 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
)
}
}
我有“发送短信”按钮,应用程序会在其中请求用户 SEND_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()
}
我尝试了什么?
- 我尝试在新项目上使用相同的代码,但效果很好。但在 我的项目我正在使用导航架构组件。
对我来说,问题似乎出在导航组件和权限对话框的组合上。那么我该如何使用导航组件的运行时权限呢?
原因是您遇到 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
)
}
}