Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/51: Рейтинг темы: голосов - 51, средняя оценка - 4.75
Sanu0074
58 / 58 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
#1

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

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

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

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

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

p.s. я новичек в разработке android, буду очень благодарен за полезные ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 21:38
Ответы с готовыми решениями:

Не могу сохранить файл на карту
Почему этот код сохраняет файл на внутреннем накопителе, вместо SD карты???...

Не получается сохранить файл на SD карту
String FILENAME = "settings"; String string = "hello world!"; File sdDir =...

скачать xml файл из сети, с условием что используется прокси сервер
Добрый день, раньше пользовался парсером курса валют с сайта ЦБ: // Текущая...

скачать драйвера на карту Nvidia GeForce9500M GS turbo
Нужно скачать дрова на карту Nvidia GeForce9500M GS turbo

Построить карту сети такую, что на ней виден каждый каждый коммутатор, состояние его портов, информация о вланах, топология сети
Здравствуйте! Собственно есть сеть из кучи коммутаторов, с вланами, QinQ,...

10
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
05.07.2013, 20:21 #2
Для кэширования можно использовать LruCache<>. В чём именно проблема?
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
05.07.2013, 22:44 #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();
2
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
06.07.2013, 08:44 #4
Как новичок новичку... Зачем Вам именно кеш? Пишу программу синхронизирующуюся с сервером. Она просто качает файл в СВОЮ ПАПКУ на диск-флешку. Перед скачиванием проверяет наличие старого и может его удалить или оставить и прервать закачку - по моему желанию. Полный "ручной" контроль файлов в папке - могу проверить наличие файла, "свежий" ли файл, полностью ли скачался... Так надежнее.

Кеш может пригодится (ИМХО) для веб-технологий (картинка на странице уже была скачана один раз - незачем обновлять)
0
Sanu0074
58 / 58 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
06.07.2013, 11:37  [ТС] #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-карту?
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
06.07.2013, 12:39 #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();
        }
В инете есть похожие коды...
1
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
06.07.2013, 12:51 #7
битмап с потока
Java
1
Bitmap btm = BitmapFactory.decodeStream(InputStream is);
а дальше вставляем битмап в imageView.

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

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

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

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

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

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

хотел основываться на этом, но ничего не получилось:
http://habrahabr.ru/post/132875/
http://android-dev-notes.blogspot.com/2010/02/blog-post_24.html
0
V0v1k
1160 / 984 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.07.2013, 15:18 #11
Java
1
imageView.setImageBitmap(btm);
1
07.07.2013, 15:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.07.2013, 15:18

Где можно скачать образ внутренней системы PocketBook 624 на SD карту?
Где можно скачать образ внутренней памяти PocketBook 624 на SD карту? Система...

Kali Linux (VirtualBox) : где скачать и как установить драйвера на wi-fi карту?
Здравствуйте, на днях установил Kali Linux на Virtual Box. Можете помочь, где...

Создать карту сети
Ребят помогите создать карту сети. Надо так чтобы в программе в textbox...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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