Android - 单击按钮时未显示权限对话框
Posted
技术标签:
【中文标题】Android - 单击按钮时未显示权限对话框【英文标题】:Android - Permission Dialog not showing on button click 【发布时间】:2021-03-16 11:35:09 【问题描述】:在我的应用程序中,我需要从存储请求写入和读取权限。由于我想向用户显示应用程序需要这些权限,因此我创建了一个包含一个按钮的 Activity,单击该按钮时应调用存储权限对话框。
但是,由于最近的 android 发生了变化,这不再起作用了。
有没有一种新的(干净的)方式来请求许可?我做错了什么吗?
我在 AndroidManifest.xml 中添加了uses-permission
行:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这是Activity里面的代码:
class ActivityPermission : AppCompatActivity()
companion object
var PERMISSION_REQUEST_CODE = 12
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
binding = ActivityPermissionBinding.inflate(layoutInflater)
setContentView(R.layout.activity_permission)
binding.btnPermission.setOnClickListener
ActivityCompat.requestPermissions(this, arrayOf(
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
PERMISSION_REQUEST_CODE)
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
)
if (requestCode == PERMISSION_REQUEST_CODE)
if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)
Toast.makeText(this, getString(R.string.permissiongranted), Toast.LENGTH_SHORT).show();
finish()
else
Toast.makeText(this, getString(R.string.permissiondenied), Toast.LENGTH_SHORT).show();
【问题讨论】:
您在清单中有WRITE_EXTERNAL_STORAGE
权限吗?如果没有,则添加它。另外,如果您要问WRITE_EXTERNAL_STORAGE
,则不必问READ_EXTERNAL_STORAGE
,它会与 Write 一起出现。
@ADM 我刚刚更换了,但遗憾的是对话框仍然没有出现。我还收到一条警告说“在针对 Android 10+ 时不再提供写访问”。出于兼容性原因,我还是会保留它。
您在哪个 Android 版本上进行测试?请注意,“从 Android 11 开始,如果用户在您的应用在设备上安装的整个生命周期内多次点击“拒绝”以获得特定权限,并且您的应用再次请求该权限,则用户不会看到系统权限对话框. 用户的动作暗示“不要再问了。”“
@ADM 我确实在 Android 11 中测试该应用程序。我真的不知道这一点。然后我可能不得不改变我请求权限的方式......
当您在onRequestPermissionsResult
中获得拒绝时,您应该能够通过调用ActivityCompat.shouldShowRequestPermissionRationale
来确定权限对话框是否被抑制(即“不再询问”是否有效)。如果发生这种情况,您可以例如尝试将用户引导至 Android 设置应用程序,他们可以在其中切换应用程序的权限。当然,只有在绝对必要的情况下才应该这样做,因为用户可能会认为这是您的应用程序烦人的唠叨。
【参考方案1】:
感谢大家帮助我了解有关 Android 权限的更多信息。
我决定改变我请求许可的方式。我决定不使用 Activity,而是使用 Fragment(“向用户显示一个教育 UI。在此 UI 中,描述为什么用户想要启用的功能需要特定权限。” - source | 感谢 cmets 中的 @Michael 指出)。
由于我现在使用的是 Fragment,所以我必须使用 requestPermissions
(感谢 this reply)。这现在可以完美运行,没有任何问题。
事实证明,在尝试请求权限时,您需要进行一系列检查。您必须首先检查权限是否真的通过checkSelfPermission
启用,以便您可以轻松选择用户应该从哪里开始使用该应用程序。
【讨论】:
以上是关于Android - 单击按钮时未显示权限对话框的主要内容,如果未能解决你的问题,请参考以下文章
在Facebook对话框中单击关闭(交叉)按钮时未调用onCancel()方法
无法使用 Appium 在 Android 的权限对话框中单击允许按钮
在 Android 中单击 Facebook 登录按钮后未显示 Facebook 身份验证对话框