Android运行时权限即使没有权限也会通过

Posted

技术标签:

【中文标题】Android运行时权限即使没有权限也会通过【英文标题】:Android runtime permission passes even if it doesn't have permission 【发布时间】:2018-11-29 07:24:43 【问题描述】:

我正在两台不同的计算机上开发应用程序,并使用 github 使用 android Studios git 工具同步项目。 从辅助工作站运行我的应用程序后,我无法立即获得权限。

似乎 ActivityCompat.checkSelfPermission() 会返回 true,即使应用程序没有所需的权限,这也会导致应用程序跳过 ActivityCompat。 requestPermissions() 方法。

每次我切换工作站时,Android Studio 都会要求我重新安装应用程序,因为签名不匹配或其他原因。我假设应用程序可能会记住旧权限,即使它没有获得新权限?

compileSdkVersion 27
minSdkVersion 19
targetSdkVersion 27

当我没有权限时,为什么 ActivityCompat.checkSelfPermission() 返回 true?

我在 oncreate() 方法中请求 MainActivity 中的所有权限:

protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.INTERNET)
                    != PackageManager.PERMISSION_GRANTED) 

        ActivityCompat.requestPermissions(this, new String[]Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.INTERNET, 123);
        Toast.makeText(this, "This app needs camera and storage permissions", Toast.LENGTH_LONG).show();

    else
        onCreateAfterPermission();
    


然后我处理响应:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 

    if (requestCode == 123) 
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) 
            onCreateAfterPermission();

        else
            // close the app
            Toast.makeText(this, "Sorry!!!, you can't use this app without granting permissions", Toast.LENGTH_LONG).show();
            this.finish();
        
    

【问题讨论】:

你有什么问题。或检查将所有权限定义到android清单文件中。 无需为INTERNET询问运行时权限 分享 onCreateAfterPermission();代码 【参考方案1】:

从您的 if 条件中删除以下检查:

ActivityCompat.checkSelfPermission(this, Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED

上述条件将始终评估为false,因为 Internet 权限被归类为正常权限并在安装时授予。

protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) 

        ActivityCompat.requestPermissions(this, new String[]Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, 123);
        Toast.makeText(this, "This app needs camera and storage permissions", Toast.LENGTH_LONG).show();

    else
        onCreateAfterPermission();
    


还有一件事,您应该隔离检查 CAMERAWRITE_EXTERNAL_STORAGE 权限。这是因为,可能存在授予CAMERA 权限但未授予WRITE_EXTERNAL_STORAGE 权限的情况。

通过您的检查,条件将不满足,因此不会询问WRITE_EXTERNAL_STORAGE

查看此SO 了解实施细节以获得更好的方法。

【讨论】:

一次检查多个权限似乎存在根本性错误。我在你的链接中实现了代码,现在它就像一个魅力,谢谢:)【参考方案2】:

AS per my above comment

INTERNET 无需询问运行时权限,因为它是在应用安装时授予的

仅供参考

危险的权限需要从 os marshmallow 及以上请求运行时

INTERNET 正常

欲了解更多信息,请查看此帖子 Normal permissions and dangerous permissions

试试这个

protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED ) 

        ActivityCompat.requestPermissions(this, new String[]Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, 123);
        Toast.makeText(this, "This app needs camera and storage permissions", Toast.LENGTH_LONG).show();

    else
        onCreateAfterPermission();
    


要询问多个运行时权限,请查看下面的帖子

Android 6.0 multiple permissions Ask Multiple Permissions Android How to ask multiple permissions at the same time in android 6.0+ How to ask multiple permissions at same time in Android Marshmelllow

【讨论】:

你发布相同的答案@Sagar 只是添加一些帖子为什么? @AD10 让你检查一下代码再检查一下我的朋友你会发现不同的 @AD10 我们都同时给出了 ans 只有一分钟的差异,所以你不能说同样的答案 @AD10 您还可以查看两个答案的编辑历史记录 @AD10 这两个答案之间的时间差是如此之小,所以我不认为可以假设犯规,离开编辑历史,你们俩都在第一次修订中发布的代码看起来一样,我认为你们发布相同的代码只是巧合

以上是关于Android运行时权限即使没有权限也会通过的主要内容,如果未能解决你的问题,请参考以下文章

访问图库的 Android 6 运行时权限

Android SDK6.0 运行时权限问题

Android6.0运行时权限管理

如何在Android中询问Camera的运行时权限,运行时存储权限

Android 6.0以上 需要运行时申请的权限

何时在运行时请求 Android Marshmallow 6.0 的权限?