Распаковка ‘perms.get (Manifest.permission.ACCESS_FINE_LOCATION)’ может привести к ‘NullPointerException’

#android #runtime-permissions #unboxing

#Android #время выполнения-разрешения #распаковка

Вопрос:

Я вижу это предупреждение после обновления моего проекта до последней версии 30 (buildToolsVersion «30.0.2»). Как устранить это предупреждение?

onrequestpermissionsрезультат кода следующим образом ::

 switch (requestCode) {
            case LOCATION_PERMISSION_REQUEST_CODE: {

                Map<String, Integer> perms = new HashMap<>();

                perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);

                // Fill with actual results from user
                if (grantResults.length > 0) {
                    for (int i = 0; i < permissions.length; i  )
                        perms.put(permissions[i], grantResults[i]);

                    if ((perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)
                    ) {
                        // do some task
                    } else {

                        if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
                            showDialogOK(getResources().getString(R.string.some_req_permissions));
                        } else {
                            explain(getResources().getString(R.string.open_settings));
                        }
                    }
                }
            }
            break;

            default:
                break;
        }
  

Комментарии:

1. не могли бы вы предоставить разрешение на проверку, закрытое из вашего кода!

2. Добавлен код @El.MENSI

Ответ №1:

Преобразование объекта типа оболочки (Integer) в соответствующее примитивное (int) значение называется распаковкой, согласно официальным документам по автоматической упаковке и распаковке. При попытке распаковать значение, которое может быть нулевым, появляется это предупреждение о возможном исключении NullPointerException.

Чтобы избавиться от этого предупреждения, использование getInt() вместо get() должно помочь. Вы также можете добавить нулевую проверку значения.

Основываясь на предоставленном коде в правках, используйте ActivityCompat.checkSelfPermission() вместо того, чтобы пытаться извлечь возможное нулевое значение Manifest.permission.ACCESS_FINE_LOCATION из params HashMap . При необходимости используйте следующий фрагмент кода:

 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
  // do some task
} else {
  ...
}
  

Комментарии:

1. getInt() не найден, также я добавил некоторый код из onRequestPermissionsResult

2. Я добавил рекомендуемый способ избежать этого предупреждения и выполнить ту же задачу во фрагменте кода после просмотра ваших правок @AndroidGuy