Nano Hash - криптовалюты, майнинг, программирование

Как проверить, есть ли у приложения определенное разрешение?

Я пытаюсь проверить, есть ли у моего приложения доступ к хранилищу:

 if (ContextCompat.checkSelfPermission(SplashActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        Toast.makeText(getBaseContext(), "merry christmas", Toast.LENGTH_LONG).show();
    }

это работает только тогда, когда разрешение на хранение не указано в манифесте. Он перестает показывать тост, когда я добавляю разрешение. Похоже, этот код проверяет, есть ли у манифеста разрешение, а не предоставлено ли разрешение. Как это исправить???

24.11.2018

  • тестирование на андроиде 9.0 24.11.2018
  • вы должны иметь READ_EXTERNAL_STORAGE pwemission в Manifest.xml 24.11.2018

Ответы:


1

Вы должны вручную запросить у пользователя разрешение с помощью следующего кода. А затем проверьте, предоставлено ли разрешение или нет.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(permitted()){
        // prompting permission dialog
        // permform your task
     }

 }


@Override
public void onResume() {
    super.onResume();
    if (permitted(PERMISSIONS))
        load();
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case 1:
            if (permitted(permissions)) {
                load();
            } else {
                Toast.makeText(context, R.string.not_permitted, Toast.LENGTH_SHORT).show();
            }
    }
}
public static final String[] PERMISSIONS = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

boolean permitted(String[] ss) {
    for (String s : ss) {
        if (ContextCompat.checkSelfPermission(context, s) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

boolean permitted() {
    for (String s : PERMISSIONS) {
        if (ContextCompat.checkSelfPermission(context, s) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), PERMISSIONS, 1);
            return false;
        }
    }
    return true;
}
24.11.2018
  • Это хороший способ, но он только проверяет, нажал ли пользователь кнопку разрешения или запрета, в противном случае он не вызывается. 24.11.2018
  • @KevinKurien, вам нужно вызвать разрешенный () метод внутри метода oncreate, например, если (разрешено) {} 24.11.2018
  • Жаль, что я этого не видел :) 24.11.2018
  • Спасибо. Надеюсь поможет решить проблему :) 24.11.2018

  • 2

    Ваш код работает, только если разрешение не предоставлено. Если он не запустился, то это разрешение было предоставлено либо во время установки, либо из данных предыдущего apk. Просто зайдите в настройки, выберите свое приложение и отзовите разрешение или выберите опцию очистки данных и повторите попытку.

    24.11.2018
  • Я никогда не давал разрешения и не имел механизма/кода для запроса разрешений. также дважды проверил в настройках, разрешение на хранение не было предоставлено. 24.11.2018
  • @ user9555243 Я думаю, что в настройках не отображается разрешение только на чтение, добавьте разрешение на запись во внешнее хранилище в манифесте, а также добавьте его в код и посмотрите, что произойдет. 24.11.2018

  • 3

    Вот как я это делаю

       if (!checkPermission()) {  // this line checks permission everytime you access this activity
                Toast.makeText(context, R.string.not_permitted, Toast.LENGTH_SHORT).show();
           requestPermission();
       } else {
           enableGPS();
       }  
    
    
    
    
    public boolean checkPermission() {
            int result = ContextCompat.checkSelfPermission(this, ACCESS_FINE_LOCATION);
            return result == PackageManager.PERMISSION_GRANTED;
        }
    
        public void requestPermission() {
            ActivityCompat.requestPermissions(this, new String[]{ACCESS_FINE_LOCATION}, REQUEST_CODE_ASK_PERMISSIONS);
        }  
    
    @Override
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
            if (requestCode == REQUEST_CODE_ASK_PERMISSIONS) {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    enableGPS();
                } else {
                    Toast.makeText(getApplicationContext(), "Please allow access to continue!", Toast.LENGTH_SHORT).show();
                }
            }
        }
    
    24.11.2018

    4

    Добавьте следующую зависимость в gradle уровня приложения и синхронизируйте свой проект.

    implementaion 'com.nabinbhandari.android:permissions:3.8'
    

    После этого внутри вашей активности напишите код, чтобы проверить, предоставлено ли разрешение.

     public void requestCameraAndStorage() {
        String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA}; // dont forget to add these permissions in manifest file.
        Permissions.check(this, permissions, null, null, new PermissionHandler() {
            @Override
            public void onGranted() {
                // do whatever you want to do.
            }
    
            @Override
            public void onDenied(Context context, ArrayList<String> deniedPermissions) {
                super.onDenied(context, deniedPermissions);
            }
        });
    }
    

    И вызывайте этот метод внутри onCreate или в любом onButtonClick по желанию. Эта библиотека обрабатывает onDenied очень эффективно.

    27.03.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..