Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 67, средняя оценка - 4.78
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
#1

Скачать файл из сети на SD карту - Android

30.06.2013, 21:38. Просмотров 8450. Ответов 10
Метки нет (Все метки)

Доброго времени суток. Есть такой вопрос:

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

Далеко не хочу пока копать, а для начала хочу разобраться в том, как загрузить файлы из сети на SD-карту и тут же отобразить их в activity??

p.s. я новичек в разработке android, буду очень благодарен за полезные ответы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1565 / 1307 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
05.07.2013, 20:21     Скачать файл из сети на SD карту #2
Для кэширования можно использовать LruCache<>. В чём именно проблема?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.07.2013, 22:44     Скачать файл из сети на SD карту #3
пример получения пути
Java
1
2
3
4
5
6
7
8
9
10
public static File getDiskCacheDir(Context context, String uniqueName) {
    // Check if media is mounted or storage is built-in, if so, try and use external cache dir
    // otherwise use internal cache dir
    final String cachePath =
            Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
                    !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() :
                            context.getCacheDir().getPath();
 
    return new File(cachePath + File.separator + uniqueName);
}
пример чтения
Java
1
2
3
4
5
6
7
8
9
10
11
URL yahoo = new URL("http://www.yahoo.com/");
BufferedReader in = new BufferedReader(
            new InputStreamReader(
            yahoo.openStream()));
 
String inputLine;
 
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);
 
in.close();
пример записи
Java
1
2
3
4
PrintWriter pw = new PrintWriter(new FileWriter(filename));
pw.println(line);
pw.flush();
pw.close();
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
06.07.2013, 08:44     Скачать файл из сети на SD карту #4
Как новичок новичку... Зачем Вам именно кеш? Пишу программу синхронизирующуюся с сервером. Она просто качает файл в СВОЮ ПАПКУ на диск-флешку. Перед скачиванием проверяет наличие старого и может его удалить или оставить и прервать закачку - по моему желанию. Полный "ручной" контроль файлов в папке - могу проверить наличие файла, "свежий" ли файл, полностью ли скачался... Так надежнее.

Кеш может пригодится (ИМХО) для веб-технологий (картинка на странице уже была скачана один раз - незачем обновлять)
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
06.07.2013, 11:37  [ТС]     Скачать файл из сети на SD карту #5
Цитата Сообщение от Tester64 Посмотреть сообщение
Перед скачиванием проверяет наличие старого и может его удалить или оставить и прервать закачку
ты же прочитай тему, поймеш чего я хочу именно:

сначала проверяем существование такого файла на SD-карте в нужной папке а потом если они есть - грузим с SD, а если нет то из сети
Добавлено через 2 минуты
Цитата Сообщение от V0v1k Посмотреть сообщение
пример получения пути
Java
1
2
3
4
5
6
7
8
9
10
public static File getDiskCacheDir(Context context, String uniqueName) {
    // Check if media is mounted or storage is built-in, if so, try and use external cache dir
    // otherwise use internal cache dir
    final String cachePath =
            Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ||
                    !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() :
                            context.getCacheDir().getPath();
 
    return new File(cachePath + File.separator + uniqueName);
}
пример чтения
Java
1
2
3
4
5
6
7
8
9
10
11
URL yahoo = new URL("http://www.yahoo.com/");
BufferedReader in = new BufferedReader(
            new InputStreamReader(
            yahoo.openStream()));
 
String inputLine;
 
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);
 
in.close();
пример записи
Java
1
2
3
4
PrintWriter pw = new PrintWriter(new FileWriter(filename));
pw.println(line);
pw.flush();
pw.close();
у тебя здесь строка читается... А как применить это, для загрузки из InputStream в imageView и на SD-карту?
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
06.07.2013, 12:39     Скачать файл из сети на SD карту #6
сначала проверяем существование такого файла на SD-карте в нужной папке а потом если они есть - грузим с SD, а если нет то из сети
А почему нельзя КАЖДЫЙ раз читать из сети на SD (если на SD еще нет) и работать уже с файлом с SD???
Просто не пойму зачем пользоваться "левой" папкой для кеша, когда можно выделить ФИСКИРОВАНУЮ папку на флеш-диске.

А скачать файл можно примерно так (вырезал из готового блока, удаляя свой лог и многопоточность - мог где-то ошибиться):


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        new File("/mnt/sdcard/ToFolder").mkdir();
        Str_StoragePath = "/mnt/sdcard/ToFolder/";
        
// удаляем старый
        File f1 = new File(Str_StoragePath+FileName);
        f1.delete();
        
 
        String ULRStr = "";
        URL url;
        URLConnection connection;
        int fileLength;
        InputStream input1 = null;
        try {
                ULRStr = "http://mysite.com/get.php";
            url = new URL(ULRStr);
            connection = url.openConnection();
            connection.connect();
            fileLength = connection.getContentLength();
            input1 = new BufferedInputStream(url.openStream());
         } catch (Exception e) {
            //return " Ошибка скачивания!";
        }
 
        try {
            // download the file
            OutputStream output = new FileOutputStream(Str_StoragePath+FileName);
            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input1.read(data)) != -1) {
                total += count;
            }
            output.flush();
            output.close();
            input1.close();
            
        } catch (Exception e) {
            return " Ошибка скачивания! "+e.toString();
        }
В инете есть похожие коды...
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.07.2013, 12:51     Скачать файл из сети на SD карту #7
битмап с потока
Java
1
Bitmap btm = BitmapFactory.decodeStream(InputStream is);
а дальше вставляем битмап в imageView.

витмап в поток
Java
1
bmp.compress(Bitmap.CompressFormat.PNG, 100, out);
Добавлено через 1 минуту
Цитата Сообщение от Tester64 Посмотреть сообщение
Просто не пойму зачем пользоваться "левой" папкой для кеша, когда можно выделить ФИСКИРОВАНУЮ папку на флеш-диске.
ага, постройте свой кеш с блекджеком и путанами...

Добавлено через 2 минуты
Tester64, недостатки вашего примера:
файлы будет видеть и сможет редактировать пользователь;
файлы не будут удаляться при удалении приложения;
файлы не будет удалять система при нехватки памяти;
не будет работать без наличия карты.

Добавлено через 2 минуты
я уже не говорю о том, что нельзя так путь на карту задавать.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
06.07.2013, 13:07     Скачать файл из сети на SD карту #8
Цитата Сообщение от V0v1k Посмотреть сообщение
файлы будет видеть и сможет редактировать пользователь;
файлы не будут удаляться при удалении приложения;
файлы не будет удалять система при нехватки памяти;
не будет работать без наличия карты.
Автор хоть и упоминал кеш, но не упоминал дополнительные требования (удаление, запрет на правку)
И упомянул SD, которая вроде есть ВСЕГДА в устройстве. Хотя-бы встроенная.
А если это личные фотки, которые хочется скачать, просмотреть и хранить для правки другими редакторами.

я уже не говорю о том, что нельзя так путь на карту задавать.
У меня на 4х устройствах/планшетах разных фирм заработало
Понимаю что теоретически диски можно переименовывать, но и в настройках программы можно ЗАДАТЬ папку

А КАК путь задавать? Допустим у меня есть ОТДЕЛЬНАЯ и БОЛЬШАЯ база данных (несколько гиг), которая не поместится во встроенной памяти и не должна "случайно" удалиться.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.07.2013, 13:14     Скачать файл из сети на SD карту #9
Цитата Сообщение от Tester64 Посмотреть сообщение
но не упоминал дополнительные требования (удаление, запрет на правку)
[sarcasm]
а еще он не упомянул такие требование:
приложение не должно падать;
телефон не должен взрываться при включении приложения.
[/sarcasm]

Цитата Сообщение от Tester64 Посмотреть сообщение
И упомянул SD, которая вроде есть ВСЕГДА в устройстве. Хотя-бы встроенная.
вот в случае встроенной может не работать, так как там путь другой, ну, на определенный устройствах так точно.
но встроенной может и не быть, а обычною могут и вытянуть.
Цитата Сообщение от Tester64 Посмотреть сообщение
А КАК путь задавать?
getExternalFilesDir() - External Storage
openFileOutput(FILENAME, Context.MODE_PRIVATE) - Internal Storage
http://developer.android.com/guide/t...a-storage.html
Sanu0074
58 / 58 / 2
Регистрация: 14.06.2010
Сообщений: 1,189
Записей в блоге: 5
07.07.2013, 14:43  [ТС]     Скачать файл из сети на SD карту #10
Цитата Сообщение от V0v1k Посмотреть сообщение
Bitmap btm = BitmapFactory.decodeStream(InputStream is);
я чего-то не могу сделать, есть готовый пример вставки в ImageView из is?.., я уже сколько перегуглил, почему-то все примеры мёртвые.. помоги pls

хотел основываться на этом, но ничего не получилось:
http://habrahabr.ru/post/132875/
http://android-dev-notes.blogspot.co...g-post_24.html
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 15:18     Скачать файл из сети на SD карту
Еще ссылки по теме:

Android Безопасно скачать файл
Android Перенос приложения на SD карту
Скачать файл при загрузке Android
Android Скачать файл .docx и считать из него текст
Android Необходимо открыть pdf документ из сети, есть только ссылка на файл, как это можно сделать

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

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.07.2013, 15:18     Скачать файл из сети на SD карту #11
Java
1
imageView.setImageBitmap(btm);
Yandex
Объявления
07.07.2013, 15:18     Скачать файл из сети на SD карту
Ответ Создать тему
Опции темы

Текущее время: 11:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru