Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在MapFragment内调用onRequestPermissionResult时,Android Studio@androidx.annotation.NonNull错误_Java_Android_Android Studio_Android Permissions_Mapfragment - Fatal编程技术网

Java 在MapFragment内调用onRequestPermissionResult时,Android Studio@androidx.annotation.NonNull错误

Java 在MapFragment内调用onRequestPermissionResult时,Android Studio@androidx.annotation.NonNull错误,java,android,android-studio,android-permissions,mapfragment,Java,Android,Android Studio,Android Permissions,Mapfragment,您好,我对这个还相当陌生,所以请帮助我理解为什么我会有这个错误。我已经尝试了很多解决方案,所以我将列出我所做的一切,因为我似乎不明白为什么会发生这种情况 我创建了一个项目,将min SDK 21上的GoogleMaps集成到SDK 28上的target/compile。我确实调用了宣言中需要的权限 我创建了一个扩展MapFragment类的文件,看起来一切正常。我可以检查并请求用户位置的权限(该框确实会显示),但当我调用onRequestPermissionResult方法时,它的显示方式不同,

您好,我对这个还相当陌生,所以请帮助我理解为什么我会有这个错误。我已经尝试了很多解决方案,所以我将列出我所做的一切,因为我似乎不明白为什么会发生这种情况

我创建了一个项目,将min SDK 21上的GoogleMaps集成到SDK 28上的target/compile。我确实调用了宣言中需要的权限

我创建了一个扩展MapFragment类的文件,看起来一切正常。我可以检查并请求用户位置的权限(该框确实会显示),但当我调用onRequestPermissionResult方法时,它的显示方式不同,并给出一个错误,称为“错误:找不到符号类NonNull”:

在我的另一个片段(android.support.v4.app)类中,@androidx.annotation.NonNull改为@NonNull。我首先想到可能需要在build.gradle中添加实现'com.android.support:support annotations:28.0.0',但事实并非如此。然后,我尝试将@androidx.annotation.NonNull替换为@NonNull,这使错误消失,但每当我单击“允许”或“拒绝”时,它都不会命中onRequestPermissionResult方法

我创建了一个检查权限的方法,但是如果不检查构建是否大于或等于SDK 23,它将不允许我单独使用requestPermission,但我的min 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及更高版本需要权限

[…]但是当我在它上使用中断时,该方法不起作用

[…]使用ActivityCompat获取requestPermission[…]

你在一个碎片里。不要向活动请求权限。如果您询问片段,您也会在片段中得到回调

requestPermissions(new String[]{permissionString}, requestCode);
API 23中引入了运行时权限(这就是为什么该方法仅在API 23之后才可用)。修复你的状况。在此之前,在清单中声明权限就足够了

离题:平台片段已被弃用。改用支持片段。扩展
SupportMapFragment


无法找到
@androidx.annotation.NonNull
,因为您在项目中未使用androidx。您可以使用任何其他可用的
@NonNull
注释(从SDK或支持库)。

导入该注释类:

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
命令,然后手动进入react native库(对于我来说:
ProjectHome/node\u modules/ModuleIWantToChange/android/src/main/java/FileToChange.java
),该库正在导入
androidx.annotation.NonNull
,将该依赖项更改为
android.support.annotation.NonNull
,然后确保使用该节点模块“android/build.gradle”文件中“依赖项”下的
com.android.support:support annotations
进行编译。在我的例子中,我使用的是版本“com.android.support:supportannotations:25.3.1”。你必须确保你有你在这里调用的版本。查看您使用Android Studio在
$Android\u HOME/extras/Android/m2repository/com/Android/support/support annotations
下安装的内容

然后,我移动到项目主目录下的android目录,运行
sudo./gradlew--stacktrace installDebug
(stacktrace是可选的),在我的模拟器/设备上构建并安装apk,而不是运行react原生安卓


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

因此,如果用户的SDK低于23,则无需请求用户对外部存储进行读写权限?我只需要检查一下23号和21号是的,你为什么认为是21号?我只是需要改变一下状况,现在一切都正常了。我想我只是把它和“在引入23个权限之后”混淆了,因为不管发生什么,总是要请求,但现在我明白了它意味着任何事情。谢谢我还将MapFragment更改为SupportMapFragment
 @NonNull