Android Studio @androidx.annotation.NonNull 在 MapFragment 中调用 onRequestPermissionResult 时出错
Android Studio @androidx.annotation.NonNull error when onRequestPermissionResult is called inside MapFragment
您好,我对此还很陌生,所以请帮助我理解为什么会出现此错误。我已经尝试了很多解决方案,所以我只想列出我所做的一切,因为我似乎无法理解为什么会这样。
我创建了一个项目,将最低 SDK 21 的 GoogleMaps 集成到 target/compile SDK 28。我确实在 Manifesto 中调用了所需的权限。
我创建了一个扩展 MapFragment 的文件 class,一切似乎都运行良好。我能够检查并请求用户位置的权限(该框确实显示),但是当我调用 onRequestPermissionResult 方法时,它显示不同,并给我一个错误提示“错误:找不到符号 class 非空 ":
@Override
public void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
在我的其他片段 (android.support.v4.app) class 中,@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 中正确检查权限,但是当我对其使用 break 时该方法没有命中。
请留下详细的回复,这样我才能完全理解我的问题。卡了一天了
编辑:解决方案
private boolean checkAskPermission(int requestCode, String permissionString){
if(Build.VERSION.SDK_INT >= 23){
int permission = ContextCompat.checkSelfPermission(mContext, permissionString);
if(permission!=PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{permissionString}, requestCode);
return false;
}
}
return true;
}
并且刚刚将 @androidx.annotation.NonNull 更改为 @NonNull,现在它命中了方法。
感谢Eugene清理SDK权限。只有 SDK 23 及更高版本需要许可。
[...] but the method doesn't hit when I use a break on it.
[...] used ActivityCompat to get the requestPermission [...]
你在片段中。不要向 activity 请求权限。如果您询问片段,您也会在片段中获得回调。
requestPermissions(new String[]{permissionString}, requestCode);
运行时权限是在 API 23 中引入的(这就是为什么该方法仅在 API 23 之后才可用)。修复你的状况。在此之前在清单中声明的权限就足够了。
题外话:平台片段已被弃用。请改用支持片段。扩展 SupportMapFragment
.
@androidx.annotation.NonNull
找不到,因为你的项目中没有使用AndroidX。您可以使用任何其他可用的 @NonNull
注释(来自 SDK 或支持库)。
导入注释 class:
import androidx.annotation.NonNull;
这要么来自此依赖项:
implementation "androidx.annotation:annotation:1.0.0"
或来自此依赖项,以防尚未使用 androidx
:
implementation "com.android.support:support-annotations:28.0.0"
那你就可以照常使用了:
@NonNull
我发现唯一有用的解决方法是放弃 react-native run-android
命令并手动进入正在导入 androidx.annotation.NonNull
,将该依赖项更改为 android.support.annotation.NonNull
,然后确保使用 node_module 的 "android/build.gradle" 文件中 "dependencies" 下的 com.android.support:support-annotations
进行编译。就我而言,我使用的是 "com.android.support:support-annotations:25.3.1" 版本。您必须确保您拥有此处调用的版本。查看您在 $ANDROID_HOME/extras/android/m2repository/com/android/support/support-annotations
.
下使用 Android Studio 安装的内容
然后,我不是react-native运行-android,而是移动到项目主目录下的android目录和运行sudo ./gradlew --stacktrace installDebug
(stacktrace 是可选的)在我的 emulator/device.
上构建和安装 apk
这可能不适合所有人,但对我来说是可以接受的解决方法。
您好,我对此还很陌生,所以请帮助我理解为什么会出现此错误。我已经尝试了很多解决方案,所以我只想列出我所做的一切,因为我似乎无法理解为什么会这样。
我创建了一个项目,将最低 SDK 21 的 GoogleMaps 集成到 target/compile SDK 28。我确实在 Manifesto 中调用了所需的权限。
我创建了一个扩展 MapFragment 的文件 class,一切似乎都运行良好。我能够检查并请求用户位置的权限(该框确实显示),但是当我调用 onRequestPermissionResult 方法时,它显示不同,并给我一个错误提示“错误:找不到符号 class 非空 ":
@Override
public void onRequestPermissionsResult(int requestCode, @androidx.annotation.NonNull String[] permissions, @androidx.annotation.NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
在我的其他片段 (android.support.v4.app) class 中,@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 中正确检查权限,但是当我对其使用 break 时该方法没有命中。
请留下详细的回复,这样我才能完全理解我的问题。卡了一天了
编辑:解决方案
private boolean checkAskPermission(int requestCode, String permissionString){
if(Build.VERSION.SDK_INT >= 23){
int permission = ContextCompat.checkSelfPermission(mContext, permissionString);
if(permission!=PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{permissionString}, requestCode);
return false;
}
}
return true;
}
并且刚刚将 @androidx.annotation.NonNull 更改为 @NonNull,现在它命中了方法。
感谢Eugene清理SDK权限。只有 SDK 23 及更高版本需要许可。
[...] but the method doesn't hit when I use a break on it.
[...] used ActivityCompat to get the requestPermission [...]
你在片段中。不要向 activity 请求权限。如果您询问片段,您也会在片段中获得回调。
requestPermissions(new String[]{permissionString}, requestCode);
运行时权限是在 API 23 中引入的(这就是为什么该方法仅在 API 23 之后才可用)。修复你的状况。在此之前在清单中声明的权限就足够了。
题外话:平台片段已被弃用。请改用支持片段。扩展 SupportMapFragment
.
@androidx.annotation.NonNull
找不到,因为你的项目中没有使用AndroidX。您可以使用任何其他可用的 @NonNull
注释(来自 SDK 或支持库)。
导入注释 class:
import androidx.annotation.NonNull;
这要么来自此依赖项:
implementation "androidx.annotation:annotation:1.0.0"
或来自此依赖项,以防尚未使用 androidx
:
implementation "com.android.support:support-annotations:28.0.0"
那你就可以照常使用了:
@NonNull
我发现唯一有用的解决方法是放弃 react-native run-android
命令并手动进入正在导入 androidx.annotation.NonNull
,将该依赖项更改为 android.support.annotation.NonNull
,然后确保使用 node_module 的 "android/build.gradle" 文件中 "dependencies" 下的 com.android.support:support-annotations
进行编译。就我而言,我使用的是 "com.android.support:support-annotations:25.3.1" 版本。您必须确保您拥有此处调用的版本。查看您在 $ANDROID_HOME/extras/android/m2repository/com/android/support/support-annotations
.
然后,我不是react-native运行-android,而是移动到项目主目录下的android目录和运行sudo ./gradlew --stacktrace installDebug
(stacktrace 是可选的)在我的 emulator/device.
这可能不适合所有人,但对我来说是可以接受的解决方法。