Последнее обновление: 21.03.2017
В прошлой теме мы рассмотрели сохранение и чтение файлов из каталога приложения. По умолчанию такие файлы доступны только самому приложения. Однако мы можем помещать и работать с файлами из внешнего хранилища. Это также позволит другим программам открывать данные файлы и при необходимости изменять.
Весь механизм работы с файлами будет таким же, как и при работе с хранилищем приложения. Ключевым отличием здесь будет получение и использование пути к внешнему хранилищу через метод Environment.getExternalStorageDirectory()
Итак, пусть в файле activity_main.xml будет такая же разметка интерфейса:
А код класса MainActivity будет выглядеть следующим образом:
Package com.example.eugene.filesapp; import android.Manifest; import android.content.pm.PackageManager; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { private final static String FILE_NAME = "content.txt"; private static final int REQUEST_PERMISSION_WRITE = 1001; private boolean permissionGranted; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } private File getExternalPath() { return(new File(Environment.getExternalStorageDirectory(), FILE_NAME)); } // сохранение файла public void saveText(View view){ if(!permissionGranted){ checkPermissions(); return; } FileOutputStream fos = null; try { EditText textBox = (EditText) findViewById(R.id.save_text); String text = textBox.getText().toString(); fos = new FileOutputStream(getExternalPath()); fos.write(text.getBytes()); Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show(); } catch(IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } finally{ try{ if(fos!=null) fos.close(); } catch(IOException ex){ Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } } } // открытие файла public void openText(View view){ if(!permissionGranted){ checkPermissions(); return; } FileInputStream fin = null; TextView textView = (TextView) findViewById(R.id.open_text); File file = getExternalPath(); // если файл не существует, выход из метода if(!file.exists()) return; try { fin = new FileInputStream(file); byte bytes = new byte; fin.read(bytes); String text = new String (bytes); textView.setText(text); } catch(IOException ex) { Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } finally{ try{ if(fin!=null) fin.close(); } catch(IOException ex){ Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show(); } } } // проверяем, доступно ли внешнее хранилище для чтения и записи public boolean isExternalStorageWriteable(){ String state = Environment.getExternalStorageState(); return Environment.MEDIA_MOUNTED.equals(state); } // проверяем, доступно ли внешнее хранилище хотя бы только для чтения public boolean isExternalStorageReadable(){ String state = Environment.getExternalStorageState(); return (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)); } private boolean checkPermissions(){ if(!isExternalStorageReadable() || !isExternalStorageWriteable()){ Toast.makeText(this, "Внешнее хранилище не доступно", Toast.LENGTH_LONG).show(); return false; } int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if(permissionCheck!= PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, new String{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSION_WRITE); return false; } return true; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String permissions, @NonNull int grantResults){ switch (requestCode){ case REQUEST_PERMISSION_WRITE: if(grantResults.length > 0 && grantResults == PackageManager.PERMISSION_GRANTED){ permissionGranted = true; Toast.makeText(this, "Разрешения получены", Toast.LENGTH_LONG).show(); } else{ Toast.makeText(this, "Необходимо дать разрешения", Toast.LENGTH_LONG).show(); } break; } } }
С помощью выражения Environment.getExternalStorageDirectory() получаем доступ к папке приложения во внешнем хранилище и устанавливаем объект файла:
Private File getExternalPath() { return(new File(Environment.getExternalStorageDirectory(), FILE_NAME)); }
Поскольку для чтения/записи во внешнее хранилище необходимы разрешения, то перед операциями сохранения и записи файла необходимо проверить наличие разрешений. Для этого определен метод checkPermissions() . При установке разрешений срабатывает метод onRequestPermissionsResult() , в котором в случае удачной установки разрешений для переменной permissionGranted задается значение true .
Чтобы использовать внешнее хранилище, также надо установить разрешения в файле манифеста AndroidManifest.xml:
У вас возник вопрос, почему загрузки на Xiaomi требуют доступа к памяти устройства, и что делать в этом случае? Для самостоятельного решения проблемы представляем пошаговое руководство с картинками.
Ограничение к доступу памяти телефона для большинства приложений заметило много пользователей смартфонов Xiaomi, а также владельцы устройств под управлением Android. Ведь перед первым запуском любого скачанного приложения из Play Market, система производит запрос доступа к памяти устройства, местоположению, вызовам и прочему. Раньше разрешение на распоряжение данными получало каждое приложение автоматически, а пользователь мог знать о требованиях программ только из их описания в Play Market. Теперь владелец устройства может внести ограничения самостоятельно.
Важно: многие программы запрашивают разрешение на отслеживание местоположения. Это не только ставит под сомнения условия конфиденциальности, но также негативно влияет на энергопотребление. Ведь смартфон будет вынужден постоянно обращаться к GPS или повышать нагрузку на сеть, чтобы вычислить координаты.
Сама ошибка возникает из-за того, что приложению не было выдано разрешение на доступ к памяти. Соответственно, без этого программа «Загрузки» работать не может, о чем и уведомляет владельцев смартфонов Xiaomi. Ошибка также может быть вызвана сторонними браузерами, в которых стоят запреты по некоторым пунктам.
Как исправить
Решение является очень простым и не требует специальных знаний. Виновниками являются используемые браузеры, а также приложение «Загрузки», в некоторых смартфонах данной марки оно называется «Downloads» . Необходимо проверить настройки обоих приложений и выставить их правильно.
Проверка браузера
Проверьте работоспособность браузера. Если он открывается безо всяких предупреждений, значит нужно идти другими шагами:
- Войти в настройки устройства. Чтобы не искать соответствующего значка в меню, нужно сдвинуть верхнюю шторку вниз и нажать на иконку шестеренки.
- Зайти в пункт «Все приложения».
- В списке найти тот браузер, с которого планируется осуществить загрузку. Для удобства можно воспользоваться поиском по названию, и кликнуть на него.
- После открытия понадобится войти в раздел «Разрешения приложений».
- В них, чтобы началась загрузка, нужно разрешить доступ к памяти. Для этого сдвиньте ползунок на графе «Память».
- Далее потребуется нажатием кнопки «Назад» на корпусе устройства, вернуться в предыдущий пункт и открыть строку «Память».
- В ней кликнуть на «Стереть данные» и «Очистить кэш».
- Опять вернуться на шаг назад и перейти в пункт «Трафик».
- В нем сдвинуть ползунок вправо во всех пунктах.
Для заметки: «Фоновый трафик» можно запретить (не сдвигать ползунок вправо). При этом приложение не сможет подключиться к интернету тогда, когда не будет использоваться. Из-за этого оно перестанет присылать уведомления.
Однако существуют такие программы, которые могут тратить до 300 Мб трафика за 2 недели в период простоя (этим особенно грешат игры). И тем самым существенно снижать объемы, предоставляемые операторами сотовой связи. Поэтому нужно проверить расход и запретить фоновый доступ в интернет подобным программам (расход в фоне отображается напротив пункта «Фоновый трафик»).
Проверка загрузок
Алгоритм действий идентичен. Нужно повторить все вышеописанное, но уже для приложения «Загрузки» (или «Downloads» для более ранних версий смартфонов). Однако здесь использование фонового трафика нужно разрешить. Так как во время простоя мегабайты практически не используются. Запрет может способствовать вызову ошибки, поэтому не рекомендуется отключать фоновый расход трафика в данной ситуации.
Описанные действия помогут полностью исключить появление ошибок. Выполнив все в точности, вы предотвратите появление ошибки «Загрузки требуют доступа к памяти устройства» на Xiaomi всех моделей и сможете начать загружать любые файлы.
При попытке скачать файл на телефон «Xiaomi» пользователь устройства может получить сообщение «Загрузки требуют доступа к памяти устройства». Подобная дисфункция обычно вызвана особенностями настроек приложений «Загрузки» и «Браузер», из-за которых доступ данных приложений к памяти телефона оказывается заблокирован. Разберёмся со спецификой данной проблемы и вариантами её решения.
Суть возникновения проблемы требования доступа
Как известно, операционная система «Андроид» позволяет пользователю регулировать специфику доступа того или иного мобильного приложения к системным компонентам вашего телефона. Это вызвано как политикой безопасности (злокачественные приложения не могут автоматически получать доступ к системным компонентам), так и особенностями работы с аккумулятором, позволяя более бережно расходовать его потенциал.
Получение сообщения «Загрузки требуют доступа к памяти устройства» обычно означает, что настройки вашего мобильного браузера заблокировали необходимый ему доступ к памяти гаджета.
В некоторых случаях схожее уведомление также может касаться приложения «Загрузки» (Downloads), которому также запрещён указанный доступ.
Давайте разберёмся, как решить проблему «Загрузки требуют доступа» на Xiaomi.
Что делать, если в Xiaomi — Загрузки требуют доступа к памяти устройства
Чтобы исправить проблему с загрузкой на Xiaomi нет необходимости получать рут-права, перешивать устройство или делать другие аналогичные им операции. Способы решения проблемы довольно просты.
- Первым делом проверьте общую работоспособность вашего мобильного браузера.
- Закройте его, затем перейдите в настройки девайса, и выберите там «Все приложения».
- В перечне приложений найдите ваш браузер, тапните на нём, и перейдя в его настройки нажмите на «Очистить данные», а также на «Очистить кэш».
- Затем закройте настройки гаджета, запустите браузер, и попробуйте вновь скачать нужные вам файлы.
Если ошибка продолжает повторяться, тогда необходимо изменить настройки доступа вашего браузера и приложения «Загрузки». Перейдите в настройки вашего Xiaomi, там выберите «Все приложения» — («Сторонние»), затем «Браузер», потом «Разрешения приложений», и активируйте там ползунок «Память».
Также рекомендуется провести аналогичное действие в отношении приложения «Загрузка» (или по-английски «Downloads»). В настройках устройства необходимо найти указанное приложение, тапнуть по нему, и войдя в его настройки передвинуть ползунок «Память», отвечающий за доступ приложения к последней. Проблема будет решена.
Заключение
В абсолютном большинстве случаев появление сообщения «Загрузки требуют доступа к памяти устройства» означает, что настройки работы браузера не дают ему доступа к памяти вашего гаджета. Простым и эффективным решением проблемы является переход в настройки устройства и предоставление браузеру (или приложению «Загрузки») необходимых разрешений, после чего данная проблема будет эффективно решена.
Утилита диагностики Sysinternals показала, что процесс chrome.exe считывает файлы на локальном диске.
Характер активности процесса даёт понять, что chrome.exe
выполняет, скорее всего, антивирусное сканирование. Но зачем браузер занимается такой работой? Некоторых возмутило, что Chrome начал это без уведомления - и даже не спросил разрешения на доступ к папке «Мои документы». В наше время это выглядит крайне подозрительно.
Специалист по информационной безопасности Келли Шортридж (Kelly Shortridge) из компании SecurityScorecard пишет : согласно логам, такая активность браузера замечена ещё с осени прошлого года.
Сама же Келли и нашла ответ в справочном центре Chrome, где указан механизм удаления вредоносного программного обеспечения с помощью Chrome.
Согласно справке, чтобы удалить вирусы с компьютера нужно выполнить следующее:
- Когда Chrome предложит удалить ненужные программы, нажмите «Удалить». После этого Chrome ликвидирует вредоносный софт или расширение, а также вернёт изменённые настройки.
- Если вас попросят перезагрузить компьютер, нажмите «Перезагрузить».
«Теперь понятно, почему мой компьютер так часто глючит в последнее время, - пишет Келли. - Прежде я гуглила коды ошибок и получала советы избавиться от левых антивирусов, но до сих пор я думала, что у меня таких нет… твою мать».
И действительно, ещё в октябре прошлого года компания Google объявила о грядущих обновлениях браузера, в том числе о добавлении базового антивируса Chrome Cleanup Tool под Windows, разработанного антивирусной компанией ESET.
Антивирус работает следующим образом. Он ищет в системе вредоносное программное обеспечение, которое негативно влияет на браузер (например, изменяет домашнюю страницу и другие настройки по умолчанию). Затем оно отправляет в Google метаданные файла, в том числе некоторую системную информацию. А потом запрашивает у пользователя разрешение на удаление файла. Пользователю предлагают отказаться от отправки отчётов в Google.
Работа антивируса Chrome кажется вполне благонамеренной, направленной на защиту пользователя. Но сообщения в твиттере Келли Шортридж вызвали немалый резонанс. В наше время на фоне скандала с утечкой пользовательских данных Facebook такие новости действительно неприятны.
«Никому не нравятся сюрпризы, - говорит Харун Мир (Haroon Meer), основатель консалтинговой компании в области информационной безопасности Thinkst. - Когда люди боятся Большого брата, а технические гиганты заходят слишком далеко… то браузер, шарящий по личным файлам, к которым он не имеет никакого отношения, наверняка вызовет тревогу».
Естественно, после поднятой шумихи компании Google пришлось оправдываться. В роли «адвоката дьявола» выступил руководитель отдела безопасности Google Chrome Джастин Шух (Justin Schuh). Он