【问题标题】:Android runtime permission passes even if it doesn't have permissionAndroid运行时权限即使没有权限也会通过
【发布时间】: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();代码

标签: android android-permissions


【解决方案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();
    }

}

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

【讨论】:

  • 你发布相同的答案@Sagar 只是添加一些帖子为什么?
  • @AD10 让你检查一下代码再检查一下我的朋友你会发现不同的
  • @AD10 我们都同时给出了 ans 只有一分钟的差异,所以你不能说同样的答案
  • @AD10 您还可以查看两个答案的编辑历史记录
  • @AD10 这两个答案之间的时间差是如此之小,所以我不认为可以假设犯规,离开编辑历史,你们俩都在第一次修订中发布的代码看起来一样,我认为你们发布相同的代码只是巧合
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2019-06-15
  • 1970-01-01
  • 2016-10-09
  • 2021-10-05
  • 2016-03-25
相关资源
最近更新 更多