您好,我对此还很陌生,所以请帮助我了解为什么会出现此错误。我已经尝试了许多解决方案,所以由于我似乎无法理解为什么会发生这种情况,所以我将列出所有已完成的事情。
我创建了一个项目,该项目将最小SDK 21的GoogleMaps集成到目标SDK / 28的编译中。我确实在宣言中调用了所需的权限。
我创建了一个扩展MapFragment类的文件,并且一切似乎都正常进行。我可以检查并请求用户位置的许可(确实会显示该框),但是当我调用onRequestPermissionResult方法时,它显示的方式有所不同,并给我一个错误,指出“ 错误:找不到符号类NonNull “:
@Override
public 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。我首先想到也许我需要在build.gradle中添加 implementation'com.android.support:support-annotations:28.0.0',但这不是事实。然后,我尝试用@NonNull替换@ androidx.annotation.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内正确检查权限,但是当我在其上使用中断时,该方法未起作用。
请留下详细的答复,以便我完全理解我的问题。我已经坚持了一天。
编辑:解决方案
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及更高版本需要权限。
答案 0 :(得分:2)
我发现唯一有用的解决方法是放弃react-native run-android
命令并手动进入正在导入{{1}的react-native库(对我来说:ProjectHome/node_modules/ModuleIWantToChange/android/src/main/java/FileToChange.java
) },将该依赖项更改为androidx.annotation.NonNull
,然后确保使用该node_module的“ android / build.gradle”文件中“依赖项”下的android.support.annotation.NonNull
进行编译。就我而言,我使用的版本是“ com.android.support:support-annotations:25.3.1”。您必须确保具有在此处标注的版本。在com.android.support:support-annotations
下查看您在Android Studio中安装的内容。
然后,我移到项目主目录下的android目录中,而不是react-native运行android,并运行$ANDROID_HOME/extras/android/m2repository/com/android/support/support-annotations
(stacktrace是可选的)在我的模拟器/设备上构建并安装apk。 / p>
这可能不适用于每个人,但就我而言,这是可以容忍的解决方案。
答案 1 :(得分:0)
[...],但是当我在其上使用中断时,该方法没有起作用。
[...]使用ActivityCompat来获取requestPermission [...]
您陷入一片混乱。不要向活动询问权限。如果您询问该片段,您还会在该片段中获得回调。
requestPermissions(new String[]{permissionString}, requestCode);
运行时权限是在API 23中引入的(这就是该方法自API 23起才可用的原因)。解决您的情况。在此之前,在清单中声明许可就足够了。
离题:平台片段已被弃用。请改用支持片段。扩展SupportMapFragment
。
@androidx.annotation.NonNull
找不到,因为您没有在项目中使用AndroidX。您可以使用其他可用的@NonNull
注解(从SDK或从支持库获得)。
答案 2 :(得分:0)
导入该注释类:
import androidx.annotation.NonNull;
这是来自此依赖项:
implementation "androidx.annotation:annotation:1.0.0"
或从此依赖关系(如果尚未使用androidx
:
implementation "com.android.support:support-annotations:28.0.0"
然后您可以照常使用它:
@NonNull