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

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

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

Скачать файл из сети на SD карту - Программирование Android

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

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

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

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

p.s. я новичек в разработке android, буду очень благодарен за полезные ответы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
1567 / 1309 / 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 Необходимо открыть pdf документ из сети, есть только ссылка на файл, как это можно сделать
Не отображает карту Android
Android Перенос приложения на SD карту
Маркер на google карту Android

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

Или воспользуйтесь поиском по форуму:
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 карту
Ответ Создать тему
Опции темы

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