Android Studio @ androidx.annotation.NonNull ошибка при вызове onRequestPermissionResult внутри MapFragment - PullRequest
0 голосов
/ 08 февраля 2019

Здравствуйте, я все еще довольно новичок в этом, поэтому, пожалуйста, помогите мне понять, почему у меня появляется эта ошибка.Я перепробовал много решений, поэтому я просто перечислю все, что я сделал, так как не могу понять, почему это происходит.

Я создал проект, который интегрирует GoogleMaps при минимальной SDK 21 доtarget / compile at SDK 28. Я назвал разрешения, необходимые внутри Manifesto.

Я создал файл, который расширяет класс MapFragment, и все, кажется, работает нормально.Я могу проверить и запросить разрешение для местоположения пользователя (окно действительно отображается), но когда я вызвал метод onRequestPermissionResult, он отображается по-другому и выдает сообщение об ошибке « error: не удается найти класс символов NonNull * 1006»* ":

@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 и выше требуют разрешения.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

импортировать этот класс аннотаций:

import androidx.annotation.NonNull;

, который либо исходит из этой зависимости:

implementation "androidx.annotation:annotation:1.0.0"

, либо из этой зависимости, если еще не используется androidx:

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

тогда вы можете использовать его как обычно:

 @NonNull
0 голосов
/ 08 февраля 2019

[...], но метод не срабатывает, когда я использую разрыв на нем.

[...] использовал ActivityCompat для получения requestPermission [...]

Вы во фрагменте.Не спрашивайте действия для разрешений.Если вы спросите фрагмент, вы также получите обратный вызов во фрагменте.

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

Разрешения времени выполнения были введены в API 23 (поэтому метод доступен только после API 23).Исправьте свое состояние.До этого достаточно иметь разрешение, объявленное в манифесте.

Не по теме: Фрагменты платформы устарели.Вместо этого используйте вспомогательные фрагменты.Расширение SupportMapFragment.

@androidx.annotation.NonNull не может быть найдено, поскольку вы не используете AndroidX в своем проекте.Вы можете использовать любую другую доступную аннотацию @NonNull (либо из SDK, либо из библиотеки поддержки).

...