- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我很难理解 android 使用的运行时权限方法。对于那些正在阅读这篇文章的人,我不是在这里问“如何调用运行时权限”。如果它还没有被授予,我能够显示一个权限对话框,甚至在 fragment 中的 onRequestPermissionsResult() 中得到它的结果。
用这段代码
if (ContextCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
FragmentCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, RQ_GET_LOCATION);
Log.e("permission", "asking permission");
return;
}
Log.e("permission", "permission already granted");
accessLocation();
在 onRequestPermissionsResult
中获取结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case RQ_GET_LOCATION:
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.e("permission", "onRequestPermissionsResult : permission granted, access location here");
accessLocation();
}
else {
Log.e("permission", "onRequestPermissionsResult : permission denied");
}
break;
}
}
accessLocation()
中的代码是
private void accessLocation()
{
Log.e("permission", "accessing location permission");
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mLastLocation != null) {
userDetail.setLat(String.valueOf(mLastLocation.getLatitude()));
userDetail.setLat(String.valueOf(mLastLocation.getLongitude()));
}
else {
if (!isLocationEnabled()) {
mShowAlert();
}
}
}
目前一切顺利.. 但令我困扰的是,在我的 accessLocation()
方法中,我在线上收到误报错误
Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
说的是
Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with
checkPermission
) or explicitly handle a potentialSecurityException
我知道当您不检查权限时就会出现这种情况。一旦我使用 @SuppressWarnings("MissingPermission")
我不知道当开发人员不得不在他们的类中多次调用方法时,他们实际上是如何处理此类错误的。要么我必须使用 @SuppressWarnings("MissingPermission")
要么? (我不知道)
假设我请求一个权限,就像我在上面的第一个代码块中所做的那样 > 权限对话框弹出 > 用户授予权限 > 流程转到 onRequestPermissionsResult
然后我再次编写用于访问位置的代码,但这将还向我显示未检查权限的误报错误..
要么我在做一些糟糕的事情,要么我认为我误解了权限模型,或者 lint 存在一些错误(我真的不认为这是问题所在)..
我已经研究过 this stackoverflow question和 this studio bug但我对那里的答案不满意。
所以请告诉我我做错了什么?
最佳答案
首先:你没有做错任何事。您的代码将按预期工作。
我建议只取消警告,因为它显然是错误的。
但是,如果您想满足 Lint 要求,则必须将代码重构为以下架构
void doSomething(){
if(permission granted){
//do stuff (directly in here, do not delegate this to other methods)
}else{
//request permission
}
}
void onRequestPermissionsResult(...){
if(permission granted){
doSomething();
}
}
是的,如果之前没有授予权限,这将导致双重检查。是的,生成的代码难读。但警告会消失。
运行时权限系统很糟糕,我们对此无能为力。
关于java - 即使在运行时请求许可后,也会出现误报 lint 许可错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37642254/
PHPLint、JSLint,我最近在阅读一些IDE. 那么,什么是“linting”? 最佳答案 Linting 是运行程序的过程,该程序将分析代码是否存在潜在错误。 参见lint在维基百科上: l
Elixir是否有 Lint (如Javascript)可以检查每个函数是否具有类型规范? 最佳答案 有一个Erlang编译器开关+warn_missing_spec可以做到这一点,但是目前我无法使其
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
例如,我让它在 .rb 和 .js 文件上匹配。 例如**/*.{js,rb} 并且还想在 Gemfile 和 Rakefile 上进行匹配。 最佳答案 解决方案是递归地使用 {},例如 "lin
我有一个自述文件,其中包含文件夹的文档、包含的库以及如何使用它们。 自述文件不是任何库的一部分,因此 nx-lint 会引发此错误: NX ERROR The following file(s
我的 React Native 构建突然失败并出现错误,尽管一天前工作得很好,没有任何相关的更改。 FAILURE: Build failed with an exception. * What we
我有一个 lint-gradle-api.jar 错误,我在论坛上查看了其他类似的问题,但我仍然有问题。有人有想法吗? Error running Gradle: Exit code 1 from:
我已经将 Android Studio 更新到 3.2.1,现在停止了这样的问题:找不到 lint-gradle-api.jar (com.android.tools.lint:lint-gradle
我目前正在从 tslint 迁移到 eslint。我在我的 .eslintignore 中配置了几个文件夹,我想从 linting 中完全忽略它们。这确实有效,但现在我收到错误: “无效的 lint
Q (tldr;): 我如何使用 android-lint 中的 JavaScanner 检查特定函数调用是否具有特定作为参数的字符串已被 try/catch block 包围。 详细信息:我已经完成
我有一个在 Cocoapods 上发布的库。 当我运行pod lib lint时从包含 MyProject.podspec 的目录中,命令行挂起 $ pod lib lint -> MyProject
我正在尝试使用 Android lint 来检查有关我的项目的一些事情。它似乎忽略了我提供的 lint.xml 文件,使我无法启用检查。 我在 Ubuntu 14.04 上使用 Android Stu
我正在使用工具栏附带的 CodeMirror 设计一个应用程序。由于性能原因,我没有通过异步或异步模式执行 lint。 我在工具栏中提供了一个图标,单击它我正在解析和构建错误。但是我对如何在编辑器中更
使用 ./gradlew lintDebug 生成 Android lint 报告时,报告中不包括 javac lint 错误,例如弃用或未经检查的转换。 我目前只是在编译时启用这些 javac 选项
默认情况下,在 gradle 中为发布构建启用了 lint。没有 abortOnError false 此选项会中止构建。 我的发布构建成功执行(没有 lint 警告),但是当我通过 gradle 调
我有一个使用 Android 构建工具版本 1.3.1 的 gradle Android 构建,并对我的代码运行 lint 检查。运行 Sonar 任务(由 org.sonarqube gradle
只是想知道是否有人可以帮助我进行 Gulp 设置。目前我正在使用 gulp-sass 和 gulp-scss-lint 进行监视任务。我想要发生的是,当为 linting 任务完全运行保存一个 scs
我正在做一个项目,最近更新到 android Gradle 构建工具 3.0.0 (com.android.tools.build:gradle:3.0.0)。我现在在通过 Android studi
我有一个带有 gradle 的 Android 项目。虽然 gradle 插件是 2.x.x,但运行 ./gradlew lint 的时间大约为 4 分钟。我已经将项目升级到 gradle plugi
事情是这样的。我有一个与 API 15 及更高版本兼容的应用程序,但由于它非常大并且我已经达到 65k 方法限制,我不得不将它设为 MultiDexApplication 类的后代。这会稍微减慢构建时
我是一名优秀的程序员,十分优秀!