1. Главная страница » Please check your permission settings

Please check your permission settings

Автор: | 16.12.2019

Сброс данных сделай
В большинстве случаев помогает

Если вас не устраивает ответ или его нет, то попробуйте воспользоваться поиском на сайте и найти другие ответы в категории Компьютеры

Сброс данных сделай
В большинстве случаев помогает

Другие интересные вопросы и ответы

Как можно проверить переписку в whatsapp на другом телефоне без доступа к телефону?

Поставьте приложение Spyzie. Это инструмент с помощью которого можно просто отслеживать сообщения WhatsApp не опасаясь, что вас могут обнаружить.

Срочно помогите. Проблемы с телефоном

Как переехать жить от родителей, если нет денег?

Я бы хотел рассказать свою историю о переезде от родителей. Начнем с того, что я родился в маленьком городке на окраине России, недалеко от Казахстана, откуда всегда хотел уехать. И вот свершилось – мне 19 лет, я только что окончил местный технарь и мне удалось скопить 20 тысяч рублей, поэтому я сразу же купил билет до ближайшего большого города, Екатеринбурга, который мне казался верхом достижения комфорта в плане вообще всего. Компанию в этом мне составил мой лучший друг, которого я всегда называл братом. Хочу сразу же сказать, что в переезде не было ничего легкого, мы оба сразу же попали в водоворот событий, который, как мне кажется, и является взрослой жизнью. Сначала я думал, что всё будет легко, перед переездом мы позвонили по нескольким объявлениям и договорились, чтобы жилплощадь (в дальнейшем я буду называть любое место, где я жил квадратом, так мне удобнее), оставили за нами. Сразу же после того, как мы из электрички зашли в здание вокзала, мы начали звонить по номерам телефонов, но, к сожалению, эти квадраты уже были сданы. Мы хотели посмотреть что-нибудь в интернете, но эти звонки в роуминге быстро съели мой баланс и мы пошли срочно оформлять местные сим-карты. Это был мой первый урок – я думал, что всё всегда идет так, как я планирую. Ребята, никогда не поступайте так, нет ничего проще, чем подключить условия для роуминга у себя дома, чтобы по приезду на новое место у вас не было дополнительных трат на такие мелочи. В интернет мы решили не заходить, а позвонить еще раз по тем номерам, которые сохранили, и спросить, может они знают еще кого-нибудь, кто сдает квадрат, любой причем. Нам обоим по 19 лет, мы в совершенно незнакомом городе, у нас банально нет крыши над головой. Примерно тогда я на самом деле понял, что такое стресс. К счастью, у одной женщины была знакомая, которая сдавала комнату. Мы позвонили и договорились, она сказала, что квартира недалеко от вокзала и мы можем прийти прямо сейчас. Естественно, никаких скаченных заранее на телефоны карт у нас не было и поэтому мы взяли такси. Ребята, пожалуйста, заранее побеспокойтесь о навигации, даже если у вас нет более-менее современного девайса, это не проблема зайти на тот же авито и за полторы штуки купить что-то, что работает и поможет вам ориентироваться на месте. Конечно, таксисты на вокзале заломили космическую цену, но деваться нам было некуда. С собой я, как думал, взял самое необходимое, в итоге с собой у меня был здоровенный баул весом не меньше 30 килограмм, набитый шмотьем. Зачем мне столько нужно было, я не знаю. Берите с собой всего по минимуму, в идеале – небольшую спортивную сумку через плечо, поверьте, летом вам не понадобится ни зимняя куртка, ни прочие теплые вещи, а так же 15 футболок, пять пар штанов и так далее.
Так мы стали жить в таджикском районе, где наш двухэтажный шестиквартирный дом был единственным домом, где жили русские.
У нас обоих начались поиски работы. Я очень долго не мог найти работу, а пытался я искать только работу по своей специальности. Очень скучал по дому и доходило до того, что я несколько раз на дню ходил в ванную наматывать сопли на кулак. Работы так и не находилось, впервые я столкнулся с депрессией, я часто ходил на вокзал смотреть расписание электричек до дома. Брат к тому времени устроился в охрану и предложил мне пойти к нему. В кармане у меня оставалось полторы штуки и, конечно же, я просто побежал на свое рабочее место. Ребята, если у вас проблемы с поиском, устраивайтесь куда берут. Это только нам самим кажется, что мы самые умные и самые красивые, бизнес прежде всего интересует, сколько денег ты сможешь принести и он больше доверяет людям, у которых уже есть опыт. Про охрану можно писать очень много, было как и везде – и хорошее, и плохое, но жаловаться мне было не на что, по меркам того же Екатеринбурга зарплата у нас была выше среднего. Я понимал, что работу мне там не найти и начал задумываться о переезде в столицу. Мне удалось накопить 70к, я попрощался со всеми и купил билет в Москву. Уже к тому моменту домой я приезжал раз в месяц-полтора, то есть нам всем стало хватать созвониться раз в неделю узнать здоровье и состояние дел. Да, конечно, первое время вы будете очень сильно скучать, но потом это всё сойдет на нет. В Екатеринбурге я прожил меньше года, около девяти месяцев. Приземлился в Москве я уже во всеоружии со всем приобретенным ранее багажом знаний, но так же без связей и знакомых, поселился я тогда в общаге в центре города, недалеко от Маяковской, мне в целом нравился этот район, но человек – существо социальное, и мне не удалось найти даже знакомых, поэтому через две недели я улетел в Питер, где на тот момент проживал мой бывший одногруппник. Тут я живу практически год. Именно тут я нашел работу по душе с достойными деньгами, хороших друзей и в целом понял, что наконец-то стал взрослым. Самое главное – не бойтесь, что будет сложно, сложно будет всегда, будьте готовы к этому и всё у вас будет хорошо.

Читайте также:  1С создать бизнес процесс программно

Вадим Новожилов 388

Проблема с телефоном?

Неделю назад купила телефон . На сайте Авито нашла объявление о продаже сотового телефона Motorola k1 давно хотела купить такой телефон , но к сожалению не где не могла его найти, а в магазинах сотовой связи сейчас данный телефон уже не продается . Позвонила по объявлению договорились о встречи мне рассказали куда идти , в итоге получив свой заветный телефон мне предложили проверить его работоспособность , но к сожалению батарейка которая стояла в телефоне села и телефон не включился , мне дали батарейку с другого телефона я вставила вроде все работает . Отдала деньги и все . Только потом задумалась о том , что мне телефон отдали без коробки , безо всяких документов , только телефон и зарядка , телефон может быть и новый т.к на нем есть заводская пленка , но в итоге когда я захотела отправить смс сообщение получателю моего смс приходит просто пустое сообщение без текста , и еще телефон стал последнее время очень часто разряжаться сначала первые 2-3 дня держалась зарядка нормально до самого вечера , можно было см ело не заряжать , но с понедельника я не знаю , что произошло мне приходится заряжать телефон несколько раз в день, а сегодня вообще разредился утром , хотя вчера вечером стоял на зарядке. Что это может быть скажите пожалуйста если знаете . И если я сейчас обращусь к тому человеку у которого купила данный телефон , он сможет предоставить мне замену или нет ?

Раз вы не взяли коробку, то и надеяться больше не на что. При покупке новой вещи нужно удостоверится, что все это проверено и упаковано продавцом, дана гарантия и все документы. Ну если вы покупаете по объявлению, то это ваш собственный страх и риск, никто потом вам не докажет, что вы были правы. Вы добровольно купили, ну а то, что не взяли коробку и гарантию, то это ваши проблемы. Конечно, могут помочь камеры видеонаблюдения, но записи, как правила стираются после таких случаев и уже ничего не доказать. Будьте внимательны. Советую купить сертифицированную батарею, но прежде удостоверится, что это не контрафактный телефон.

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

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

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

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

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

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

Отличие в том, что после нажатия на кнопку “Deny” разрешение не будет полностью запрещено для приложения, как это происходит у Apple. Его можно будет запросить повторно, но в этом случае появится опция “Never ask again”, после выбора которой “Deny” работает как “Don’t allow” в iOS.

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

  • обычные (normal);
  • опасные (dangerous).

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

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

Для того чтобы отозвать разрешение, которое было выдано ранее (или предоставить его, если вы выбрали “Never ask again”) нужно перейти в настройки приложения (Settings->Apps->*AppName*) в раздел Permissions и кликнуть по соответствующим переключателям. В этом меню также можно посмотреть все разрешения этой программы, выбрав пункт “All permissions” из контекстного меню. Еще есть возможность просматривать, каким приложениям выдано конкретное разрешение (и соответственно предоставить или отобрать его). Для этого в настройках в разделе Apps нужно кликнуть по меню с иконкой шестеренки и в открывшемся разделе выбрать App permissions. Далее, выбрав нужное разрешение, можно увидеть все приложения, которым оно нужно.

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

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

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

Читайте также:  Command conquer 3 tiberium wars не запускается

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

Второй момент заключается в том, насколько ясно будет человеку, для чего нужно это разрешение. Зачем приложению для смс доступ к календарю? Наверное, для какой-то классной функции, которая облегчит перенос дат из сообщений в календарь и тому подобное. Но знаете об этом только вы, поэтому сначала нужно объяснить причину запроса и показать какие возможности даст доступ к этому разрешению. Это относится и к первичным и к вторичным разрешениям.

Еще раз кратко:

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

В случае, когда вам все-таки отказали, пояснение причины в следующий раз является обязательным. А если помимо отказа, пользователь попросил вас никогда не запрашивать данное разрешение, используя опцию “Never ask again”, но пытается использовать соответствующую функцию приложения, предложите ему перейти в настройки вашей программы и вручную включить необходимые разрешения. Это особенно важно, если разрешение критично для работы программы.

Логичным вопросом будет: а что же произойдет, если запустить ваше неадаптированное под runtime разрешения приложение на Android Marshmallow? Ответ зависит от того осмелились ли вы изменить targetSdk на 23 версию (compileSdk и buildTools нас в данном случае не интересуют). Если да, то у меня не лучшие новости для вас: очень вероятно, что вы получите SecurityException. Это не обязательно будет так, возможно где-то вы получите null вместо запрошенной информации, но вероятность далеко не нулевая. Если же вы используете targetSdk версии 22 и ниже, то все разрешения будут, как и прежде выданы приложению при установке, включая опасные. Это не отменяет того, что пользователь может отозвать любое из них после установки. При этом он получит предупреждение, что приложение не адаптировано под runtime разрешения и может работать некорректно. Насколько некорректно оно будет работать, полностью зависит от вас, то есть если вы проверяли возвращаемые значения на null или были готовы к нулю вместо вменяемого значения, то ничего страшного не произойдет: приложение просто не будет полноценно функционировать (что выглядит все же лучше чем падение из-за NullPointerException).

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

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

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

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

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

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

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

Каждый раз, когда мы хотим использовать метод, требующий опасного разрешения, необходимо проверить есть ли оно у нас. Для этого используем метод ContextCompat.checkSelfPermission(Context context, String permission), который возвращает нам одно из int значений: PackageManager.PERMISSION_GRANTED в случае если разрешение есть или PackageManager.PERMISSION_DENIED если его нет. Именем разрешения является одна из констант класса Manifest.permission.

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

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

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

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

Читайте также:  Hdmi кабель схема распайки

Для запроса используется метод 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’ы (подробнее).

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

Раздел: Без рубрики

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code