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();
还有一件事,您应该隔离检查 CAMERA
和 WRITE_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运行时权限即使没有权限也会通过的主要内容,如果未能解决你的问题,请参考以下文章