Sorry usb permission not granted как исправить

Обновлено: 04.07.2024

Mi Flash и SP Flash являются составляющими единой программы MiFlashPro. При желании их удастся скачать отдельно, но в большинстве случаев пользователи отдают предпочтение функциональной утилите, соединившей в себе несколько элементов. Mi Flash и SP Flash предназначаются для установки кастомных прошивок на смартфоны Xiaomi, а также для устранения неполадок, к примеру, бесконечной загрузки и т.д. Однако, несмотря на массу явных преимуществ софта, пользователи нередко жалуются на ошибки и проблемы MiFlashPro, с которыми приходится сталкиваться во время работы. Именно им мы и посвятим статью, рассмотрев возможные причины возникновения неполадок и решение конкретных ошибок.

Причины возникновения ошибок

Неполадки в работе любого софта возникают не с пустого места. Их появлению обязательно предшествует какое-либо действие или бездействие пользователя. Так, к наиболее распространенным причинам возникновения ошибок в Mi Flash и SP Flash относятся следующие моменты:

  1. Недостаток драйверов. Для каждого приложения требуются специальные драйвера – без них софт никак не сможет функционировать. Как правило, они устанавливаются автоматически после скачивания программы и подключения смартфона к ПК. Однако, если этого не произошло, пользователю придется поставить драйвера самостоятельно.
  2. Неработоспособность Mi-аккаунта. Учетная запись пользователя на смартфоне Xiaomi нужна не только для хранения данных и блокировки входа. Она необходима также для работы с приложениями, вносящими изменения в ПО устройства. Поэтому перед началом работы обязательно нужно авторизоваться в аккаунте.
  3. Отсутствие обновления программы. На MiFlashPro, как и на любую другую утилиту, регулярно приходят обновления, которые требуется устанавливать хотя бы для корректной работы софта. Из-за этого специалисты настоятельно рекомендуют скачивать из интернета самую свежую версию приложения и работать только с ним.
  4. Неверно подобранная прошивка. Пользователи часто путаются, скачивая на ПК прошивку, не соответствующую модели смартфона. В процессе поиска даже кастомной прошивки обязательно нужно обращать внимание на список гаджетов, для которых она предназначена. Кроме того, важно обращать внимание на расширение архива – оно должно быть формата .tgz. Вместе с этим стоит следить за русскими буквами в наименовании файла или папки – их быть не должно вовсе.
  5. Подключение к ПК через USB 3.0. Для корректной работы самого приложения и всех задействованных устройств лучше всего использовать разъем версии 2.0, а также оригинальный кабель, идущий в комплекте со смартфоном.

Решение ошибок Mi Flash

В первую очередь рассмотрим возможные проблемы при обновлении прошивки через Mi Flash. Их тут достаточно много, но именно это дает возможность каждому читателю отыскать конкретную ошибку, с которой ему лично пришлось столкнуться.

Решение ошибок SP Flash

Количество ошибок, возникающих в SP Flash также велико. Но решение есть у каждой проблемы, к тому же, представленные нами варианты устранения неполадок были неоднократно проверены как профессионалами, так и рядовыми пользователями.

Заключение

У меня Raspberry Pi работает RaspBMC с WD MyBook, подключенным через USB. Привод автоматически устанавливается на /media/My Book . Я создал папку /media/My Book/downloads и установил каталог загрузки Trasmission /media/My Book/downloads .

Когда я пытаюсь скачать файл, Transmission сообщает,

Таким образом, я предполагаю, что проблема в том, что передача выполняется от имени другого пользователя pi и не может записывать в папку. Однако, когда я выполняю

операции выполняются без ошибок, но разрешения не меняются, они остаются 700 только для владельца.

Что я делаю не так и как я могу включить Transmission для записи в этот каталог?

После много чтения и разочарования. Прежде всего, убедитесь, что обычный пользователь имеет права на чтение и запись на USB-накопитель. Правильное исправление «без полномочий root» для доступа к записи на USB-накопитель:

Шаг 1: Остановить передачу демона

Шаг 2: Добавить pi в группу передачи Debian

Шаг 3: изменение пользователя-демона

Изменить USER на pi .

Шаг 4 Измените права папки с файлами конфигурации

Шаг 5. Установите правильные разрешения для загружаемых / неполных папок.

Шаг 5: Запустите демон передачи

Это единственный правильный ответ. Бег как root не так. Делать это chmod 777 неправильно. Установка правильной группы и пользователя - единственный правильный путь. Может быть, это правильный ответ, но он не работает для меня. Я переименовал свое имя пользователя pi в другое. Однако, когда я делаю ls -al это, кажется, мои файлы все еще находятся в pi группе. С учетом приведенных выше инструкций, я должен изменить каждый экземпляр pi на свое новое имя пользователя или обратиться к группе, которая по-прежнему pi ? Эти инструкции не работают, когда я меняю каждое pi на свое имя пользователя. @Keavon "я должен изменить каждый экземпляр pi на свое новое имя пользователя" Да, также есть ли новый пользователь в группе debian-tranmission?

Проблема заключалась в том, как был автоматически подключен USB-диск. Я установил его вручную с помощью mount -t ntfs-3g, и он начал работать.

То же самое случилось со мной. С автоматически смонтированным жестким диском все разрешения были установлены на 0700, но при его установке sudo mount -t ntfs-3g -o uid=pi,gid=pi /dev/sda1 /media/HDD/ они равны 0777, и передача работает отлично, действительно странно. Мой ExFAT был с автоматическим монтированием exfat defaults,auto,umask=000,users,rw 0 0 , я изменил это, чтобы монтировать с pi идентификаторами пользователей, exfat defaults,uid=1000,gid=1000 0 0 и это работало Проверьте этот ответ AskUbuntu: проблема с правами доступа / правами при автоматическом

Я знаю, что запуск от имени root - это большой linux нет, нет (не уверен, что это считается выполнением от имени root), но это сработало для меня, так что я в порядке. Вы можете попробовать USER=pi вместо этого, но у меня нет любви там, поэтому я застрял с рутом

Конечно, запуск от имени root работает, это просто угроза безопасности. Просто кое-что добавлю: Linux использует файл / etc / fstab для установки точек монтирования и прав доступа / владельца диска. Итак, у вас есть три варианта: запустить передачу от имени пользователя root, запустить передачу от имени владельца папки, в которой находится диск ( ls -l скажет вам, кому он принадлежит), или изменить файл / etc / fstab, чтобы показать другого владельца (например, debian- коробка передач). Я столкнулся с аналогичной проблемой сохранения торрентов на диске NAS, смонтированном в качестве гостя. Я перепробовал все упомянутые решения, но у меня ничего не получалось, поэтому я сдался и запустил трансмиссионный демон от имени root. Мне это не нравится, но это единственное, что работает. Это неправильно, и такие демоны никогда не должны работать с привилегиями root. Вы должны удалить этот ответ, потому что это повредит настройке других людей.

Я считаю, что ваша проблема в том, что ваша флешка USB отформатирована как NFTS или FAT, файловые системы, которые не поддерживают разрешения для каждого пользователя / группы. Решение состоит в том, чтобы переформатировать как ext4. Если вы сделаете это, у вас будет гораздо меньше лагов, если вы используете свой Pi в качестве медиацентра. Драйверы для Pi намного быстрее, когда вы используете ext4.

Значительно быстрее, чем NTFS-3G? Не могли бы вы показать некоторые данные в поддержку этого заявления?

и найдите USER в верхней части файла и измените на:

Затем нам нужно chown несколько файлов в нашей области разрешений:

А затем запустите (это действительно важно, иначе демон из сервиса будет работать как debian-transmission )

и найти user там и изменить на:

и перезагрузите сервисный блок

И, наконец, нам нужно символически связать наш файл настроек с домашним каталогом pi и дать ему разрешения:

А затем снова начните передачу:

и вы сделали. Теперь должно работать.

Я думаю, что одна из главных вещей, которую пропускают люди, это то, что вы должны монтировать ваш usb / внешний диск в папку / mnt / myUsbDrive, а НЕ в / media / pi / myUsbDrive.

Я попробовал каждый ответ, данный в этом обсуждении (включая root), сотней разных способов с разными вариантами и не смог получить передачу для сохранения на моем usb SSD-накопителе. Затем при чтении чего-то другого было упомянуто, что не нужно монтировать в / media / pi, поскольку у демонов или других групп может не быть доступа. Поэтому я подключаю USB-диск к / mnt / usb_disk, устанавливаю пути в /etc/transmission-daemon/settings.json в / mnt / usb_disk / downloads, и передача начинает сохраняться на диск.

К вашему сведению, у меня есть user = pi в /etc/init.d/transmission-daemon.

К вашему сведению, я сменил владельца / mnt / usb_disk / downloads на pi и сгруппировал для передачи debian с разрешениями 777.

где / downloads - это каталог, в котором вы хотите, чтобы ваши загрузки были (или место монтирования).

это безопаснее, чем использовать root.

это дает «пользователю» права, известные как «передача Debian» на папку

Я нашел то же решение, что и Игорь и puigcerber. Мой диск был настроен на автоматическое монтирование, поэтому я отредактировал свой fstab для удаления автомонтирования, а затем использовал sudo mount -t vfat -o uid=pi,gid=pi /dev/sda1 /media/*mymountpoint/

В то время как ответ biketire верен, Debian недавно переключился на systemd, и вам необходимо сменить пользователя здесь

sudo nano /etc/systemd/system/multi-user.target.wants/transmission-daemon.service

и убедитесь, что в разделе

у вас есть линия

Решение:

После большого чтения и разочарования.

Прежде всего, убедитесь, что обычный пользователь имеет доступ на чтение и запись к USB-накопителю. Правильное исправление «без полномочий root» для доступа к записи на USB-накопитель:

Шаг 1: Остановить передачу демона

sudo service transmission-daemon stop

Шаг 2: Добавьте pi в группу передачи debian

sudo usermod -a -G debian-transmission pi

Шаг 3: изменение пользователя-демона

sudo nano /etc/init.d/transmission-daemon

Измените ПОЛЬЗОВАТЕЛЬ на пи.

sudo nano /etc/systemd/system/multi-user.target.wants/transmission-daemon.service

Измените ПОЛЬЗОВАТЕЛЬ на пи.

Шаг 4: Измените права папки с файлами конфигурации sudo chown -R pi /var/lib/transmission-daemon/info/ sudo chmod 755 /var/lib/transmission-daemon/info/settings.json

Шаг 5. Установите правильные разрешения для загружаемых / неполных папок. sudo chown -R pi /somewhere/downloads sudo chown -R pi /somewhere/incomplete

В последнее время все больше людей отказывается от получения root прав. У всех на это свои причины. Кто-то не хочет заморачиваться и читать сложные мануалы, кто-то боится потерять гарантию. Google тоже способствует этому, разрешая в новых версиях Android, хоть и не просто, но все же выполнять некоторые действия, которые без root были раньше невозможны. Речь сегодня пойдет о тонкой настройке через adb. Преимущественно статья написана для людей не имеющих root права на телефоне, для тех у кого все же root права есть - статья предоставляется как есть. Автор статьи не несет ответственности за ваши действия.

Для начала запомним что ни одно действие описанное в этой статье не может окирпичить ваш телефон. Вы не имеете root прав, а значит невозможно испортить какой-либо компонент системы. Это не касается ваших личных файлов и приложение, речь только о компонентах системы, о прошивке короче говоря. Так же данные действия никоим образом не могут повлиять на гарантию вашего телефона, собственно по тем же причинам. Без root мы просто не затрагиваем системные компоненты. Используем только то что разрешает нам сама система, как пользователю.

Разберем немного само устройство системы. В Android нет дисков как в Windows. Есть папки. Папки могут быть например картой памяти. Представьте что на вашем компьютере при вставке флешки, на рабочем столе появляется папка "флешка". Вытаскиваете, исчезает. Вот примерно так же и устроена система в вашем телефоне. И так попадая в shell вашего телефона вы оказываетесь в корневой, главной папке. В ней находится куча папок куда у вас нет доступа. Например System (папка прошивки) или Data (папка данных приложений). То есть доступ в эти папки у вас как бы есть, но только на чтение. Вы не можете изменять, удалять или добавлять туда свои файлы. Нет root доступа для этого. Нас интересует внутренняя память телефона + карта памяти, куда запись нам вполне доступна. И так, внутренняя память телефона всегда называется /sdcard. Карта памяти может находится в другом месте, но обычно она /storage/0123-4567

Для того чтобы попасть в shell вашего телефона (командную строку), нужно произвести на телефоне не сложные действия. Заходите в настройки телефона, ищете пункт "О Телефоне". В нем ищите информацию о прошивке, версию и .т.д. Нас интересует пункт "Номер сборки". Нужно нажать на него быстро 10 раз. Должна появиться надпись "Включен режим разработчика". Не бойтесь, ничего страшного не произойдет, просто в настройках телефона появится новое меню "Параметры разработчика". Нужно зайти в это меню и включить "Отладка по USB".

Далее на компьютер нужно установить adb. Для этого вам необходимо скачать "15 seconds adb installer". К сожалению прямых ссылок дать не могу, но уверен поиском в гугле вы найдете нужный файл.

Запустить от администратора, несколько раз согласится нажав на клавиатуре "Y", установить драйверы от Google Inc.

После того как вы установили adb + необходимые драйверы, вы можете работать с командной строкой телефона.

Для этого в пуске нажмите выполнить и вбейте руками CMD. Ну или на любом месте рабочего стола нажмите на клавиатуре "Win + R", вбейте "cmd" (без кавычек) нажмите Enter.

Вы в командной строке компьютера. Чтобы подключиться к командной строке телефона вбейте adb shell. На телефоне может появится диалог - "доверять ли этому компьютеру?" Жмите доверять. Если все прошло гладко, вы увидите что-то вроде 1|greatlte:/ $

pwd - показывает место (полный путь) к папке где вы находитесь

cd .. - перейти в папку уровнем выше

cd - change directory (сменить папку)

mkdir - make directory (создать папку)

rmdir - remove directory (удалить папку)

rm - remove file (удалить файл)

rm -rf - remove recursive force (удалить папку/файл вместе со всем содержимым) (Это опасная команда! Если запустить ее находясь скажем в корне памяти телефоне, вы сотрете все файлы (фотки например) находящиеся на карте памяти. Лучше не пользоваться этой командой без полного понимания того что она делает).

cp - copy (копировать)

mv - move (перемещать или переименовывать)

cd /sdcard/Downdload - сменить папку на /sdcard/Downdload

mkdir Papka - создает папку Papka в папке где вы находитесь

mkdir /sdcard/Downdload/Papka - создает папку Papka в /sdcard/Downdload

copy bxActions.apk bxActions1.apk - создает копию bxActions.apk с именем bxActions1.apk в папке где вы находитесь

mv bxActions.apk bxActions1.apk - переименовывает файл bxActions.apk в bxActions1.apk в папке где вы находитесь

mv /sdcard/Downdload/bxActions.apk /sdcard/bxActions.apk - переносит файл bxActions.apk из папки /sdcard/Downdload/ в корень внутренней памяти (/sdcard)

Почувствуйте себя хакером, начните использовать кнопку Tab на клавиатуре. Например пишите cd /sd[жмете кнопку TAB] получается - cd /sdcard

Продолжайте - cd /sdcard/Dow[жмете кнопку TAB] - получаете cd /sdcard/Downdload/ и вот уже можно жать Enter. Получается быстрее, если привыкните, жизнь станет сильно проще)

Кнопка Tab в командной строке пытается продолжить то что вы пишите подставляя имена файлов и папок которые есть в системе.

Что может adb? Начнем с азов. Перезагрузка в основные режимы.

reboot - (перезагрузка телефона)

reboot bootloader - перезагрузка в режим download или режим bootloader

reboot recovery - перезагрузка в режим восстановления

Работа с показом всяких системных характеристик:

getprop ro.bootloader - показ версии bootloader (только Samsung)

getprop ro.boot.carrierid - показ региона телефона (только Samsung)

getprop - выводит полный список команд сразу с результатами, можно посмотреть кучу инфы о телефоне

Страшный ужасный push и pull:

Эти две команды, push и pull скачивают и закачивают на телефон файлы с ПК и обратно.

Например. Открываете свой cmd на компьютере. Там вы тоже оказываетесь сразу в какой-то папке. Обычно это какой-нибудь C:\Windows\System32. Допустим вам нужно скачать файл с рабочего стола на телефон. В командной строке ПК пишите - cd C:\Users\Vasya\Desktop

Vasya - название пользователя, у вас оно само собой другое) Используйте кнопку TAB как писал выше, будет быстрее и проще. Задача чтобы вместо C:\Windows\System32 у вас было написано C:\Users\Vasya\Desktop

adb push контакты.csv /sdcard/Download/

И файл контактов скопируется с вашего рабочего стола в телефон, в папку /sdcard/Download/

С помощью команды pull можно наоборот, скачать с телефона на ПК:

adb pull /sdcard/Download/контакты.csv контакты.csv

Файл должен оказаться в той папке где вы находитесь командной строкой на ПК (но мы же на вашем рабочем столе, верно?)

Даем какой-либо программе специальные разрешения на примере bxAction:

Для работы bxActions нужно два специальных разрешения, WRITE_SECURE_SETTINGS и READ_LOGS. Эти разрешения могут быть даны только через компьютер, через adb. Сам разработчик рекомендует ввести в командной строке следующее:

adb shell pm grant com.jamworks.bxactions android.permission.WRITE_SECURE_SETTINGS

adb shell pm grant com.jamworks.bxactions android.permission.READ_LOGS

Это правильные команды, однако они не дают вам понимания сработали ли они при вводе. Я рекомендую вводить так:

adb shell - тут мы заходим в shell телефона

pm grant com.jamworks.bxactions android.permission.WRITE_SECURE_SETTINGS

pm grant com.jamworks.bxactions android.permission.READ_LOGS

Если при вводе возникнут какие-либо ошибки, вы это увидите. Если все хорошо, вывод будет пустой.

Таким вот не очень хитрым образом вы можете выдавать приложениям права которые раньше могли быть доступны только с получением root! К сожалению Google разрешает таким образом выдавать не все права, тот же Titanuim Backup не заработает, однако многие другие приложения сейчас умееют работать довольствуюсь только доступными в adb правами.

Я перечислю несколько приложений который попросили специальные права, я выдал их через adb и приложения прекрасно работают. Это - Wakelock Detector, Tasker, Adhell, Andromeda, AutoNotification, bxAction, Substratum, SystemUI Tuner.

Страшный ужасный менеджер пакетов.

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

У каждого приложения есть уникальное имя пакета. Это скажем так внутреннее название приложения, такое как его видит система. Вы же видите только название из так называемых строк перевода. Даже если приложение не переведено ни на какие другие языки кроме родного языка разработчика или просто английского, в любом случае у приложения будет так называемый default перевод в котором будет прописано название приложения. Таким образом вы видите у себя в меню приложений bxActions вместо com.jamworks.bxactions

Бывают конечно пакеты которые являются скажем какими то системными дополнениями, которые не переводят даже в файле default перевода и оставляют прям называнием пакета. Кстати по этой же логике создаются приложения клоны. Достаточно пересобрать (именно пересобрать через специальный софт) пакет com.jamworks.bxactions с именем com.jamworks.bxactions1 и при установке вы получите второе приложения bxActions) Такой клон не всегда будет работать, но это один из способов создать клон. Система видит приложения с разными названиями пакетов как отдельные приложения.

И так что может pm?

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

cmd package list packages

Удалить пакет (например bxactions)

pm uninstall com.jamworks.bxactions

Пакетным менеджером так же можно устанавливать приложения. Например вы скинули bxActions.apk в папку Download

pm install bxActions.apk

Поздравляю вы установили приложение не дотрагиваясь до телефона)

Пакетный менеджер так же умеет отключать приложения. Например встроенный браузер вам не нравится, вы используете Chrome самостоятельно установленный с маркета. По привычке вы заходите на телефоне в настройки, выбираете пункт приложения, находите встроенный браузер, но пункта отключить нету, есть только остановить. Тут то и пригодится пакетный менеджер. Конечно, вы скажете, что можно поставить какой-нибудь Disabler с маркета, но это не всегда бывает удобно, поэтому просто знайте что есть способ сделать это через adb.

pm disable com.jamworks.bxactions - чтобы отключить

pm enable com.jamworks.bxactions - чтобы включить обратно если вы передумали

Есть одна загвоздка, вы можете не знать какое название пакета приложения Браузер. Обычно в если зайти в свойства приложения через настройки (Настройки - Приложения - bxActions), то в какой нибудь строке указывается название пакета, однако на Samsung'ах например невсегда. В случае если посмотреть название пакета негде, а искать в выводе cmd package list packages не хочется, можно воспользоваться сторонним софтом. Например проводник которым я постоянно пользуюсь это умеет. В Solid Explorer открываем боковое меню, приложения, выбираем системное или пользовательское приложение, видим список приложений и под каждым написано название пакета.

Часто при установке приложения на Android нам приходилось видеть, что оно запрашивает какое-то немыслимое количество разрешений. Например:


Хорошо, если вы устанавливаете приложение от какого-то известного разработчика, которому можете доверять. Но весьма подозрительно, если вы устанавливаете новый музыкальный плеер, а ему для работы требуется, например, получать ваше местоположение. Или, тем более, фонарик, требующий доступ к смс и звонкам.

Некоторые разработчики, чтобы уменьшить недоверие, добавляют в описание приложения на Google Play информацию о том, зачем нужно то или иное разрешение.

К шестой версии Android ситуация поменялась. Теперь разрешения нужно запрашивать в процессе работы. О том, как этой новой возможностью пользоваться и ее некоторых подводных камнях будет рассказано далее.

Общая информация



Разрешения делятся на два типа (есть и другие, но они нас не интересуют):

Можно увидеть, что доступ к интернету не считается опасным. Все, кто использует рекламу в своих программах, могут вздохнуть с облегчением: отключить её, просто отобрав разрешение, не получится (все еще можно просто отключить интернет, но факт остается фактом).



Взаимодействие с пользователем

Посмотрим, как нужно производить взаимодействие с пользователем. Начнем непосредственно с запроса разрешения. С обычными разрешениями все понятно, это дело установщика приложений, нас это не интересует, а то, как мы будем запрашивать опасные разрешения, зависит от двух вещей.

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





  • важные разрешения запрашиваем при запуске, вторичные — при первом использовании соответствующей функции;
  • если понять, зачем нужно разрешение тяжело, предоставляем объяснение.



Но даже если у вас все хорошо с проверками и нет возможности заниматься внедрением новых возможностей, стоит перепроверить, все ли правильно работает, потому что иногда можно получить null не там, где его ожидаешь. Так, например, при использовании Environment.getExternalStorageDirectory() без наличия разрешения из группы Storage, мы получим File, но list() вернет нам заветный null. В документации такой исход описан, но для ситуации, когда File не является директорией. Так что проверка в любом случае лишней не будет.

Есть возможность добавить разрешение только для Android M и выше. Для это в манифесте нужно использовать новый тег <uses-permission-sdk-23 /> (ранее называвшийся <uses-permission-sdk-m />). Его синтаксис аналогичен обычному <uses-permission />. Это может быть полезно, если вы хотите добавить в существующее приложение возможность, которая требует дополнительного разрешения. Как вы помните, если новая версия программы требует дополнительных прав, пользователь должен вручную подтвердить ее обновление. Этого можно избежать, если новая функция не очень важна, отключив ее для более ранних версий системы, используя описанный ранее тег. В таком случае это разрешение будет вовсе отсутствовать.

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


И еще несколько полезных команд, смысл которых ясен из названия:


Перейдем к непосредственной реализации (предварительно не забудем обновить compileSdkVersion и targetSdkVersion до версии 23).

До момента, когда Marshmallow станет минимальной версией андроида для ваших приложений, еще далеко, поэтому нужно позаботиться об обратной совместимости. Конечно, можно делать проверки версии sdk, но зачем, если все реализовано за нас в support library v4 (ActivityCompat) и v13 (FragmentCompat). Если все же вам понадобятся оригинальные методы, то найти их не составит труда.

Во всех примерах используется ActivityCompat, так как они были сделаны для activity. Для fragment нужно использовать FragmentCompat. Если вы по какой-то причине не используете activity и fragment из support библиотек, то вам нужно реализовать интерфейс ActivityCompat.OnRequestPermissionsResultCallback или FragmentCompat.OnRequestPermissionsResultCallback соответственно.


Далее, если разрешение есть, выполняем нужное нам действие, а если нет, то его нужно запросить. Одновременно можно запросить несколько разрешений (пользователю по очереди будет показан запрос на каждое из них), если это необходимо.

Стоит упомянуть, что если разрешения находятся в одной permission group, то запросить достаточно одно из них, так как все остальные элементы этой группы станут также доступны. Но так делать не нужно. Потому что в будущем состав групп может поменяться, поэтому при запросе разрешений не нужно делать предположений относительно того находятся ли они в одной группе или нет.

UPD будто в подтверждение предыдущего параграфа, начиная с Android 8.0 разрешения из одной permission group не выдаются сразу — каждое разрешение нужно запрашивать отдельно, но все разрешения из одной группы будут выданы автоматически, без участия пользователя при первом же их запросе.

UPD2 это же поведение было замечено на Android 7.0 — если часть разрешений из группы выдана (не могу сказать с уверенностью, имеет ли значение какие именно), то остальные будут выдаваться по запросу сразу же без показа диалога. Это может вызвать проблемы, если ваше приложение объясняет пользователю зачем ей нужно то или иное разрешение еще до его запроса. В реальной жизни такое редко когда может возникнуть (только при использовании adb комманд), но стоит учитывать это при отладке приложения.

Для запроса используется метод ActivityCompat.requestPermissions(Activity activity, String[] permissions, int requestCode). Массив permissions соответственно содержит названия разрешений, которые вы хотите запросить. Отсюда видно, что одновременно можно запрашивать несколько разрешений. requestCode — значение, по которому в дальнейшем можно будет определить, на какой запрос разрешения вам пришел ответ подобно тому как мы получаем результат от activity, используя startActivityForResult. Кстати, если посмотреть на код requestPermission, то обнаружится, что это всего лишь особая версия startActivityForResult.


Как видите, напрямую запрашивать разрешения можно только из Activity или Fragment. Если разрешение требуется сервису, то придется запускать Activity, из которой уже можно будет сделать запрос. Лучше всего перед этим будет показать уведомление, содержащее информацию о недостающем разрешении с кнопкой для запуска этой самой Activity.

Результат запроса разрешения следует обрабатывать в onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults). Параметры requestCode и permissions содержат данные, которые вы передавали при запросе разрешений. Основные данные здесь несет массив grantResults, в котором находится информация о том, получены разрешения или нет. Каждому i-му элементу permissions соответствует i-ый элемент из grantResults. Их возможные значения аналогичны результату checkSelfPermission.


Размер массива grantResults проверяется для того, чтобы удостовериться, что запрос разрешения не был прерван (в этом случае permissions и grantResults не будут содержать элементов). Такую ситуацию следует рассматривать не как запрет разрешения, а как отмену запроса на него.

Если вы ранее уже запрашивали разрешение, но пользователь отказался предоставить его, необходимо объяснить ему причину запроса. Этого не нужно делать, если причина, по которой вы запрашиваете разрешение, абсолютно ясна. Если же есть вероятность, что вопрос “А зачем приложению это нужно?” возникнет, то объяснить это крайне желательно. Для того чтобы узнать, нужно ли показывать объяснение есть метод shouldShowRequestPermissionRationale(@NonNull Activity activity, @NonNull String permission), который возвращает boolean. Само же объяснение можно реализовать, например, с помощью Snackbar с кнопкой действия, по клику на которой происходит запрос разрешения, или диалогового окна, если разрешение критично необходимо.

Never ask again

Одной из проблем может стать опция “Never ask again”, которая появляется при повторном запросе разрешения, после того как пользователь уже отказал ранее. Как видно из названия, при её выборе диалог запроса не будет больше появляться. shouldShowRequestPermissionRationale будет выдавать false, а в onRequestPermissionsResult будет получен результат PackageManager.PERMISSION_DENIED. И получим разрешение мы, только если включить его непосредственно через настройки приложения в разделе Permissions.

Что с этим можно сделать? В первую очередь, конечно, сообщить пользователю, что для выполнения действия нет нужных прав. Далее возможным действием может быть предложение перейти в настройки и предоставить это разрешение вручную. Не лучший вариант, но лучше чем ничего. Реализовать это можно вновь с использованием Snackbar с кнопкой действия.

Перейти непосредственно на страницу с разрешениями не получится, поэтому лучшее, что вы можете сделать, это открыть настройки своего приложения. После этого можно, например, показать Toast с информацией, что нужно сделать.


В примере используются startActivityForResult и onActivityResult чтобы определить, что пользователь вернулся из activity настроек обратно в приложение и попробовать выполнить действие, которое нельзя было сделать без нужного разрешения. В методе showExtDirFilesCount нужно снова проверить есть ли разрешение для уверенности, что пользователь его все-таки выдал.

Здесь может возникнуть ситуация, которая не особенно мешает, если вы используете Snackbar для показа rationale, но портит UX, если вы решили использовать диалоги (причины этого решения мы не затрагиваем). А именно двойное появление rationale, до запроса разрешения и после него. Как это может произойти? У нас всего два метода, по которым мы можем судить о состоянии разрешения. Проблема в том, что до запроса разрешения ситуация, когда мы еще никогда не запрашивали это разрешение, и ситуация, когда пользователь ранее выбрал “Never ask again”, абсолютно одинаковы по значениям. А именно checkSeflPermission возвращает нам PERMISSION_DENIED, a shouldShowRequestPermissionRationale — false. Значит, показывать диалог для открытия настроек мы будем в onRequestPermissionsResult, где значение shouldShowRequestPermissionRationale точно будет разным для этих двух ситуаций. Все отлично? Не совсем. В этом callback’e никак нельзя определить была ли показана rationale или нет. Поэтому если вы показываете причину запроса, а далее пользователь просит больше его не спрашивать об этом разрешении, после нажатия на кнопку DENY он получит очередной rationale диалог, приглашающий его в настройки программы. Хорошие программы так себя не ведут.

Что делать в такой ситуации? В сети есть пара не очень красивых решений: одно из них — сохранять в SharedPreferences информацию о том имеется ли разрешение или нет, другое — хранить флаг о том была показана rationale или нет внутри класса. Первое решение не хорошо тем, что пока приложение не работает, пользователь может изменить настройки разрешений и информация в preferences будет неактуальной. Второй же способ не особо красивый.

Хорошим вариантом (на мой взгляд) будет завести два requestCode для каждого запроса, один для использования в rationale другой в остальных случаях. Этот способ так же не идеален и не особенно красив, но помогает придерживаться существующих методов, не внося ничего нового.

Intent

Есть еще одна важная рекомендация при использовании runtime разрешений. Не используйте их. Точнее, используйте, но только тогда, когда функционал, который вы собираетесь реализовать с их помощью, не сделал уже кто-то до вас.

В качестве самого показательного примера чаще всего вспоминают камеру. Используйте стандартное приложение камеры (или другие приложения, умеющие это делать), если вам нужно всего лишь сделать фотографию без какой-то особой логики. В этом вам помогут Intent’ы (подробнее).

Таким образом, вы сможете избавиться от некоторых опасных разрешений и упростите работу с приложением.

Мы все слышали истории о вредоносных приложениях, которые крадут ценные данные и отправляют их злоумышленникам. Специалисты утверждают, что перед установкой каждого приложения необходимо тщательно ознакомиться с его разрешениями. Но что они означают и как их правильно настроить?

Что такое App Permissions на Android и как его удалить

Зачем необходим App Permissions на Android и как его удалить.

Что это такое

App Permissions – это и есть разрешения. Когда вы устанавливаете софт из Google Play на устройстве под управлением Android 6.0 или выше, вы контролируете, к каким возможностям или информации может обращаться программа – так называемые разрешения. Например, утилите может потребоваться разрешение на просмотр контактов или местоположения вашего устройства. Вы можете контролировать, к каким разрешениям ПО сможет получить доступ после установки на устройстве. И если «Автоматический запуск программы при загрузке» говорит само за себя, то разобраться в остальных может быть не так просто. Проблема в том, что программы могут иметь веские основания для их использования, потому что одним разрешением может быть охвачено несколько разных вещей. Рассмотрим самые распространённые примеры менеджмента разрешений более подробно.

Совершать и принимать вызовы

Это означает, что ПО может автоматически сделать звонок. Каждая утилита может самостоятельно запускать номеронабиратель и даже вводить номер, но, если это разрешение не предоставлено, пользователю нужно нажать кнопку вызова. Такие вещи, как сторонний номеронабиратель, Google Voice или всё, что связано с вашей телефонной «звонилкой», должно иметь это разрешение. Если ПО его запрашивает, но не должно иметь ничего общего с совершением звонков, отклоните запрос и выясните причину запроса у разработчиков через отзывы на Google Play. Даже если причины использования того или иного разрешения вам не понятны, они могут требоваться для стабильной работы программ.

Ассистент Google Voice

Получение и отправка SMS или MMS

Подписные SMS-сервисы – лёгкий способ для мошенника заработать деньги, так что за ними нужно следить. Доступ понадобится SMS-приложениям (что очевидно), а также утилитам, которые позволяют редактировать или делать снимки, а также делиться ими. Программы, которые могут совместно использовать любые медиа, скорее всего будут иметь эту настройку. Если софт не может никому ничего отправлять, следует проверить, зачем это нужно разработчикам.

Чтение/запись контактов

Чтение/запись событий календаря

Здесь всё довольно просто. Настройка позволяет делать только одно – автоматически читать календарь. Некоторые утилиты должны иметь доступ к календарю. Это программы, которые могут напоминать о приёме лекарств или автоматически сообщать о предстоящей поездке, считывая данные из календаря. Если программа каким-либо образом связана с планированием, то использование такого доступа вполне оправдано. Если это не так, перед установкой выясните, зачем приложению нужен доступ к календарю. Запись событий календаря является обычным делом. Если неясно, зачем программе нужны эти настройки, описание в магазине Play должно рассказать вам больше. Если вы все ещё не уверены, спросите разработчика.

Чтение/запись событий календаря

Phone Status And Identity

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

Важно знать, какой идентификатор запрашивает программа. Каждый телефон имеет идентификатор устройства, который отличается от любого другого, и его можно раскрыть, не передавая никакой личной информации. Когда вы видите, сколько людей используют определённую версию Android на графике от Google, они используют этот идентификатор устройства, чтобы помочь получить эти цифры. Когда вы заходите в Google Play и скачиваете программу, вас подсчитывают, и при этом только один раз. Идентификатор смартфона также является лучшим способом для синхронизации облачных данных и настроек ПО со смартфоном. Разрешение указывает только на то, какой у вас телефон и какое на нём программное обеспечение, поэтому ваши данные не будут доступны.

Разрешение также позволяет прочитать другой уникальный идентификатор – IMEI. Номер IMEI – это то, как телефонная компания подключает телефон – ваш адрес, ваше имя и всё остальное, что вам нужно будет предоставить, чтобы купить телефон, который сможет доказать, кто вы. Эти данные трудно получить – между ними и любыми данными вашей учётной записи есть минимум три разных защищённых и зашифрованных сервера базы данных, но получить доступ к ним не невозможно. Поскольку у вас нет возможности узнать, какой идентификатор требует приложение, выберите «Нет», если не знаете, почему разработчики этого хотят и что они с ним делают.

Phone Status And Identity

GPS и сетевое местоположение

Если приложение должно знать, где вы находитесь, оно должно запросить ваше местоположение. Есть два вида местоположения – неточное и точное. Первый вариант подходит для большинства рядовых ситуаций, но иногда требует точное местоположение. Потребность в вашем точном местоположении может быть определена простым запросом. Например, когда приложение должно знать, что находится в радиусе 50 м. Здесь необходимо точное местоположение. Точное местоположение необходимо и программам, которые, например, показывают, где находятся супермаркеты с оборудованным для инвалидов входом или лифтами. А вот простые программы для совершения покупок не требуют точного местоположения, в отличие от навигационных карт.

Изменять/Удалять содержимое SD-карты

Это разрешение, которое позволяет приложению читать или записывать данные на внешнюю память смартфона. Необходимо, чтобы дать приложению возможность свободно просматривать данные, изменять их, удалять и добавлять дополнительную информацию данные в любое место на SD-карте. Сбивает с толку тот факт, что под SD-картой подразумевается не только флешка. В файловой системе Android память телефона также называется SD-картой. Google многое сделал, чтобы сделать это разрешение безвредным. В каждой версии они уточняют, как приложение может получить доступ только к той информации, которая ему нужна. Но все ещё есть пользователи, использующие старые версии программ и ОС. Если вы один из них, убедитесь, что вы доверяете приложению, прежде чем устанавливать его. Любое приложение, написанное для API уровня 4 (Android 1.6 Donut) или ниже, получает это разрешение по умолчанию. Таких приложений не так много. Какой вред это может принести, зависит от того, какие данные хранятся в памяти вашего телефона. Телефоны под управлением Android 7 Nougat и приложения, созданные для телефонов под управлением Android 7, используют доступ к каталогу в заданной области, что гораздо удобнее и безопаснее.

Android 7 Nougat

Полный доступ к сети

Это разрешение означает именно то, что оно говорит. Приложение хочет иметь возможность отправлять запросы и получать ответ через сеть (Wi-Fi или подключение для передачи данных по мобильной сети). Помимо приложений, которые используют Интернет для чего-то очевидного, в них нуждаются в этом приложения с рекламой. Разрешение довольно безвредное, но, когда речь заходит о вашей личной информации, оно может использовать данные без вашего ведома. Мы ненавидим платить за дополнительные данные так же, как и вы. Если вы найдёте приложение, которое должно работать в автономном режиме, но не работает, удалите его.

Как удалить App Permissions

Чтобы найти свои приложения и их разрешения на Android, откройте «Настройки», а затем нажмите «Приложения и уведомления», «Информация о приложении» и выберите интересующее вас приложение. Выберите пункт «Разрешения», чтобы просмотреть, какими из них обладает приложение. Вы можете отключить любое из них в любое время, передвинув переключатель рядом с этой записью. Другой вариант – просматривать по разрешению, а не по приложению. Откройте «Настройки» и перейдите в раздел «Приложения и уведомления», как и в предыдущем случае. Но на этот раз выберите «Разрешения приложения». Откроется список разрешений, который включает датчики, календарь, камеру, контакты, местоположение, микрофон, SMS, память, телефон и многое другое. Нажмите любую запись, чтобы увидеть, какие приложения могут получить доступ к этой функции. Здесь также с помощью переключателей можно убрать любые настройки. Прежде чем начинать отключать разрешения, помните, что для выполнения своей работы некоторые приложения полагаются на этот доступ. Например, если приложение может просматривать ваши контакты, оно использует их, чтобы помочь вам обмениваться контентом, файлами или приглашать друзей на мероприятия, а не собирать ваши данные для получения прибыли.

Список разрешений для приложения

Разрешения при загрузке софта

Когда вы загружаете программы из Play Store, некоторые из них перед установкой запрашивают разрешение на использование информации. При загрузке приложений, созданных для Android 6.0 и более поздних версий, вы можете предоставить или запретить разрешения непосредственно во время установки. Чтобы просмотреть разрешения той или иной утилиты перед установкой, сделайте следующее:

  1. Откройте приложение Play Store.
  2. Перейти на страницу сведений о приложении. Чтобы просмотреть разрешения перед установкой, пролистайте до раздела «Разработчик» и нажмите «Сведения о разрешениях».
  3. Нажмите «Установить».

Некоторые приложения будут установлены сразу. Вы можете разрешить или запретить отдельные запросы на разрешение до того, как приложение будет использовать данные такого типа. Для других программ в Google Play отображаются все группы разрешений, к которым она сможет получить доступ перед установкой. Эта информация может помочь вам решить, хотите ли вы установить её.

Сведения о разрешениях

Если приложение уже установлено

Для приложений, созданных для Android 6.0 и выше, просматривать или принимать изменения разрешений при каждом обновлении не нужно. Достаточно указать необходимые права при первом запуске программы. Если при обновлении приложению требуется доступ к новым группам разрешений или разрешениям в группе «Другие», вам будет предложено заново подтвердить решение, даже если вы настроили автоматические обновления. Если вы предпочитаете просматривать каждое обновление вручную, вы можете отключить автоматическое обновление, следуя приведённым ниже инструкциям:

Чтобы отключить автообновление для всех приложений:

Никогда не обновлять автоматически

Есть также много других, менее подозрительных разрешений. Приложение, которое делает снимки, должно контролировать ваше оборудование. Netflix должен держать ваш экран активным в течение всего времени, пока вы его не касаетесь. Виджет профиля звонков нуждается в доступе к вашим настройкам. Разобраться с разрешением, которое кажется неуместным, обычно помогает немного логики. Если нет, то читайте комментарии в Google Play и задавайте вопросы на форумах. Большинство приложений в Google Play не могут украсть ваши данные или ваши деньги. Помните, что большинство людей, пишущих приложения, просто хотят заработать немного денег или делают это ради удовольствия. Приложений, которые существуют для обработки ваших данных, не так много. Но иногда разработчики допускают ошибку – нетрудно заставить Android запрашивать разрешение, которое не используется приложением, и легко игнорировать эти ошибки при их создании.

Читайте также: