为了账号安全,请及时绑定邮箱和手机立即绑定

在 MapFragment 中调用 onRequestPermissionResult 时

在 MapFragment 中调用 onRequestPermissionResult 时

繁花不似锦 2022-06-08 17:43:23
您好,我对此仍然很陌生,所以请帮助我了解为什么会出现此错误。我尝试了很多解决方案,所以我将列出我所做的一切,因为我似乎无法理解为什么会发生这种情况。我创建了一个项目,它在 min SDK 21 上集成了 GoogleMaps,以在 SDK 28 上进行目标/编译。我确实调用了 Manifesto 中所需的权限。我创建了一个扩展 MapFragment 类的文件,一切似乎都运行良好。我能够检查并请求用户位置的权限(该框确实显示),但是当我调用 onRequestPermissionResult 方法时,它的显示方式有所不同,并给我一个错误提示“错误:找不到符号类 NonNull ”:@Overridepublic void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) {    super.onRequestPermissionsResult(requestCode, permissions, grantResults);} 在我的其他 Fragment (android.support.v4.app) 类中,@androidx.annotation.NonNull 是 @NonNull。我首先想到也许我需要将实现 'com.android.support:support-annotations:28.0.0'添加到 build.gradle,但事实并非如此。然后,我尝试将 @androidx.annotation.NonNull 替换为 @NonNull ,这使错误消失了,但是每当我单击允许或拒绝时,它都没有达到 onRequestPermissionResult 方法。我创建了一个检查权限的方法,但它不会让我在不检查构建是否大于或等于 SDK 23 的情况下自行使用 requestPermission,但我的最小 SDK 是 21。所以我只是检查构建是否大于或等于 21 并使用 ActivityCompat 获取 requestPermission 方法并且它可以工作。它会检查并请求许可,所以我想也许 onRequestPermissionResult 只能在 MainActivity 中工作,这是我不想要的。我希望能够在检查请求是否在 MapFragment 中被授予后调用一个方法。是因为 android.support.v4.app 不支持 MapFragment 吗?它看起来像这样: private boolean checkAskPermission(int requestCode, String permissionString){    if(Build.VERSION.SDK_INT >= 21){        int permission = ContextCompat.checkSelfPermission(mContext, permissionString);        if(permission!=PackageManager.PERMISSION_GRANTED){            ActivityCompat.requestPermissions(getActivity(), new String[]{permissionString}, requestCode);            return false;        }    }    return true;}在这一点上,我不知道还能尝试什么。我想当我将 @androidx.annotation.NonNull 更改为 @NonNull 以便能够使用它时,我可能没有正确检查 onRequestPermissionResult 中的权限,但是当我使用中断时该方法没有命中。请留下详细的答复,以便我完全理解我的问题。我已经坚持了一天。只是将@androidx.annotation.NonNull 更改为@NonNull,现在它命中了该方法。感谢 Eugene 清理 SDK 权限。只有 SDK 23 及更高版本需要权限。
查看完整描述

3 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

导入该注释类:

import androidx.annotation.NonNull;

这要么来自这种依赖关系:

implementation "androidx.annotation:annotation:1.0.0"

或来自此依赖项,以防尚未使用androidx

implementation "com.android.support:support-annotations:28.0.0"

然后你可以像往常一样使用它:

 @NonNull


查看完整回答
反对 回复 2022-06-08
?
炎炎设计

TA贡献1808条经验 获得超4个赞

我发现唯一有用的解决方法是放弃react-native run-android命令并手动进入ProjectHome/node_modules/ModuleIWantToChange/android/src/main/java/FileToChange.java正在导入的 react-native 库(对我来说:)androidx.annotation.NonNull,将依赖项更改为android.support.annotation.NonNull,然后确保使用com.android.support:support-annotations“依赖项”下进行编译在那个 node_module 的“android/build.gradle”文件中。就我而言,我使用的是“com.android.support:support-annotations:25.3.1”版本。你必须确保你有你在这里调用的版本。看看你在$ANDROID_HOME/extras/android/m2repository/com/android/support/support-annotations.

然后,我没有使用 react-native run-android,而是移至项目主目录下的 android 目录并运行sudo ./gradlew --stacktrace installDebug(stacktrace 是可选的)以在我的模拟器/设备上构建和安装 apk。

这可能不适用于所有人,但在我的情况下这是一个可以容忍的解决方法。


查看完整回答
反对 回复 2022-06-08
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

[...] 但是当我在它上面使用 break 时,该方法没有成功。

[...] 使用 ActivityCompat 来获取 requestPermission [...]

你在一个片段中。不要向 Activity 请求权限。如果您询问片段,您还会在片段中获得回调。

requestPermissions(new String[]{permissionString}, requestCode);

API 23 中引入了运行时权限(这就是该方法仅在 API 23 之后可用的原因)。修复你的状况。在此之前拥有清单中声明的权限就足够了。

题外话:平台片段已被弃用。请改用支持片段。扩展SupportMapFragment.

@androidx.annotation.NonNull找不到,因为您的项目中没有使用 AndroidX。您可以使用任何其他@NonNull可用的注释(来自 SDK 或来自支持库)。


查看完整回答
反对 回复 2022-06-08
  • 3 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信