Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930

Сохранить файл в памяти телефона, доступной из диспетчера файлов или на ПК

21.02.2017, 13:50. Показов 3001. Ответов 11

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Мне необходимо сохранять некоторые файлы в публичной области памяти телефона (НЕ внешней, т.к. внешней памяти может и не быть).
Конкретно - сериализованные в XML файлы для последующей выгрузки на ПК по USB.
Сейчас код такой:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 public boolean savePreset(Context context, String name)
    {
        try
        {
            Serializer serializer = new Persister();
            File dir = new File(Environment.getDataDirectory() + "/AaA/");
            if (!dir.exists())
                dir.mkdir();
            File xmlFile = new File (dir + "/" + name);
            if (!xmlFile.exists())
                xmlFile.createNewFile();
            serializer.write(mController.getCurrentConnectSet(), xmlFile);
            return true;
        }
        catch (Exception ex)
        {
            mListenerRegister.AddLog(new ProgressInfo(ProgressInfo.InfoType.MESSAGE, nfcTasks.HOLD, ex.getMessage()));
            return false;
        }
    }
По коду путь для файла задаётся: /data/AaA/MyPreset.xml
При каждом запуске каталог не находится, хотя mkdir вроде отрабатывает.

При попытке создания файла получаю эксепшн: java.io.IOException: open failed: ENOENT (No such file or directory)

Может надо другой путь задать?

Добавлено через 10 минут
Поправка: mkdir, как и mkdirs не выбрасывает ексепшн, но возвращает false. Каталог не хочет создаваться.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.02.2017, 13:50
Ответы с готовыми решениями:

Сохранить фото из bitmap в формате jpg на sdcard или внутреннюю память телефона Андроид
Здравствуйте! Может кто сталкивался с таким вопросом. Есть TImage в него с камеры грузится фото. Потом мне надо сохранить его под нужным...

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

Определить область доступной памяти
как определить область доступной памяти,с помощью Dos?

11
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 13:52
Что с разрешениями?
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
21.02.2017, 14:06  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
Что с разрешениями?
XML
1
2
3
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
Java
1
2
3
4
5
6
7
8
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
 
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
 
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.MANAGE_DOCUMENTS))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.MANAGE_DOCUMENTS}, 1);
Больше ничего относящегося к файловой системе не нашёл. Гугл опять-же молчит.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,450
21.02.2017, 14:12
aquaMakc, а если
Java
1
Environment.getDataDirectory().getAbsolutePath()
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
21.02.2017, 14:15  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
а если
тоже самое.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 14:16
а если:
Java
1
Environment.getExternalStorageDirectory().getAbsolutePath()
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
21.02.2017, 14:20  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
а если:
т.к. внешнего хранилища на конкретном телефоне нет, путь получается: /storage/emulated/0/AaA
При попытке создать в по нему файл получаю всё тоже исключение.

Добавлено через 1 минуту
Пробовал не создавать отдельную папку, кидать сразу в /data. На что получил закономерное java.io.IOException: open failed: EACCES (Permission denied)
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 14:36
Проверяй разрешения в настройках приложения.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
21.02.2017, 16:06  [ТС]
Не пойму логики андройда.
В телефон SD не установлена, но
Java
1
Environment.getExternalStorageState();
возвращает mounted, т.е. "смонтировано".
Environment.getExternalStorageDirectory( ) возвращает /storage/emulated/0/, в который я не могу произвести запись, хотя все разрешения есть.
Вставляю SD. Та-же самая картина.

Добавлено через 1 час 15 минут
в общем андроид упорно отказывается сохранять файлы даже на внешний носитель. Ни файлы создать, ни каталоги. Пробовал и в Environment.getExternalStoragePublicDire ctory(Environment.DIRECTORY_DOCUMENTS) и в Environment.getExternalStorageDirectory( ).
Разрешения все есть, даже лишних накидал на всякий случай:
XML
1
2
3
4
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/>
В коде запрашиваю их отдельно:
Java
1
2
3
4
5
6
7
8
9
10
11
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE))
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
 
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_EXTERNAL_STORAGE))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
 
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS))
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS}, 1);
 
        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.MANAGE_DOCUMENTS))
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.MANAGE_DOCUMENTS}, 1);
Ничего не помогает.

Добавлено через 3 минуты
Флешку форматировал, телефон перезагружал. Осталось только девственицу в жертву принести...

Добавлено через 5 минут
Умляуть...
Пришлось открыть руками настройки приложения и руками же включить разрешение на доступ к памяти.
Почему-то программно разрешения не включились/запросились.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 16:32
Цитата Сообщение от ExFau$t Посмотреть сообщение
Проверяй разрешения в настройках приложения.
А я что написал?

Добавлено через 1 минуту
recuestCode желательно разный делать.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
21.02.2017, 16:35  [ТС]
Цитата Сообщение от ExFau$t Посмотреть сообщение
А я что написал?
ну так я и проверял...в коде приложения.

В общем я не правильно запрашивал разрешения (надо было внимательно читать лог андроид студии). Я каждое разрешение запрашивал отдельно. На что студия ругалась, но тихо.
Надо запрашивать разрешения одним пакетом, например:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 private void setPermissions()
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int canRead = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
            int canWrite = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            int canNfc = ContextCompat.checkSelfPermission(this, Manifest.permission.NFC);
 
            if (canRead != PackageManager.PERMISSION_GRANTED || canWrite != PackageManager.PERMISSION_GRANTED || canNfc != PackageManager.PERMISSION_GRANTED) {
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE))
                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.NFC }, NUMBER_OF_REQUEST);
            }
        }
    }
Добавлено через 1 минуту
Цитата Сообщение от ExFau$t Посмотреть сообщение
recuestCode желательно разный делат
пробовал делать разный реквест-код. Не помогало. Только после объединения нужных запросов в один массив заработало.
1
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
21.02.2017, 16:35
Я запрашиваю отдельно, и никто не ругается, и всё работает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2017, 16:35
Помогаю со студенческими работами здесь

Проверить объем доступной памяти
Нужно проверить объем доступной памяти до и после выполнения программы. Как это можно сделать?

Объём доступной памяти в процентах
Есть WBS скрипт который выполняется на сервере Он сравнивает процент свободной памяти с эталонным значением и выводит Ок или не ОК...

Узнать объем доступной памяти
Следующая команда GC.GetTotalMemory(True) показывает объем пямяти занимаемой приложением. А как узнать объем доступной памяти? Иногда...

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

Определить объем доступной оперативной памяти
Добрый день. Собственно вопрос в шапке. Какие средства позволяют оценить этот параметр. Цель следующая. Нужно файл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru