Здравствуйте, я все еще новичок в этом, поэтому, пожалуйста, помогите мне понять, почему у меня возникает эта ошибка. Я пробовал много решений, поэтому я просто перечислю все, что я сделал, так как я не могу понять, почему это происходит.
Я создал проект, который интегрирует GoogleMaps с минимальной SDK 21 для таргетинга/компиляции с 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. Сначала я подумал, может быть, мне нужно добавить реализация 'com.android.support:support-annotations:28.0.0' в build.gradle, но это было не так. Затем я попытался просто заменить @androidx.annotation.NonNull на @NonNull, из-за чего ошибка исчезла, но всякий раз, когда я нажимал «разрешить» или «отклонить», он не попадал в метод onRequestPermissionResult.
Я создал метод, который проверяет наличие разрешения, но он не позволяет мне использовать requestPermission самостоятельно, не проверяя, является ли сборка больше или равной SDK 23, но мой минимальный SDK равен 21. Поэтому вместо этого я просто проверил, является ли сборка больше или равно 21 и использовал ActivityCompat для получения метода requestPermission, и он работает. Он проверит и запросит разрешение, поэтому я думаю, что, возможно, onRequestPermissionResult работает только в MainActivity, чего я не хочу. Я хочу иметь возможность вызывать метод после проверки того, был ли запрос предоставлен внутри MapFragment. Это потому, что MapFragment не поддерживается android.support.v4.app? Это выглядит так:
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;
}
На данный момент я не знаю, что еще попробовать. Я подумал, может быть, я неправильно проверял разрешение внутри onRequestPermissionResult, когда я меняю @androidx.annotation.NonNull на @NonNull, чтобы иметь возможность его использовать, но метод не срабатывает, когда я использую перерыв на нем.
Пожалуйста, оставляйте подробные ответы, чтобы я мог полностью понять свою проблему. Я застрял на этом в течение дня.
Обновлено: Решение
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, и теперь он попадает в метод.
Спасибо Евгению за прояснение разрешений SDK. Только SDK 23 и выше требуют разрешения.




[...] but the method doesn't hit when I use a break on it.
[...] used ActivityCompat to get the requestPermission [...]
Вы находитесь во фрагменте. Не спрашивайте разрешения у активности. Если вы спросите фрагмент, вы также получите обратный вызов во фрагменте.
requestPermissions(new String[]{permissionString}, requestCode);
Разрешения во время выполнения были введены в API 23 (поэтому метод доступен только с API 23). Исправьте свое состояние. До этого достаточно иметь разрешение, объявленное в манифесте.
Не по теме: Фрагменты платформы устарели. Вместо этого используйте фрагменты поддержки. Расширение SupportMapFragment.
@androidx.annotation.NonNull не может быть найден, потому что вы не используете AndroidX в своем проекте. Вы можете использовать любую другую доступную аннотацию @NonNull (либо из SDK, либо из библиотеки поддержки).
Да, а почему вы решили, что это 21?
Мне просто нужно было изменить условие, и теперь все работает. Я думаю, что я просто перепутал это с «после того, как были введены 23 разрешения», поскольку всегда нужно запрашивать, несмотря ни на что, но теперь я понимаю, что это означает что угодно SDK 23 и выше. Спасибо!! Я также изменил MapFragment на SupportMapFragment.
импортировать этот класс аннотаций:
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 и вручную перейти в родную библиотеку (для меня: ProjectHome/node_modules/ModuleIWantToChange/android/src/main/java/FileToChange.java), которая импортировала androidx.annotation.NonNull, изменив эту зависимость на android.support.annotation.NonNull, а затем убедившись, что компилируется с com.android.support:support-annotations в разделе «зависимости» в файле «android/build.gradle» этого node_module. В моем случае я использую версию «com.android.support:support-annotations:25.3.1». Вы должны убедиться, что у вас есть версия, которую вы вызываете здесь. Посмотрите, что вы установили с помощью Android Studio под $ANDROID_HOME/extras/android/m2repository/com/android/support/support-annotations.
Затем вместо реактивного run-android я перешел в каталог android в домашнем каталоге проекта и запустил sudo ./gradlew --stacktrace installDebug (stacktrace не является обязательным), чтобы собрать и установить apk на моем эмуляторе/устройстве.
Это может не сработать для всех, но в моем случае это было терпимое решение.
Таким образом, у пользователя не нужно запрашивать разрешение на чтение и запись во внешнее хранилище, если его SDK ниже 23? Мне просто нужно проверить на 23 и выше