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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
#1

Файл не открывается после загрузки из сети - Программирование Android

28.05.2014, 23:37. Просмотров 1929. Ответов 5
Метки нет (Все метки)

Действия в программе такие: сначала загружается файл из сети, затем он открывается для получения содержащихся в нем данных.
В приложении я могу это сделать двумя способами:
1) Скачать файл (событие по нажатию button'а), а затем Открыть файл (также событие по button'у).
2) Скачать файл и затем открыть его (всё это одно событие по button'у).

Первый способ работает стабильно, ни каких проблем нет. Но если я пользуюсь вторым способом - ни чего не получается (ошибка: java.io.FileNotFoundException: /storage/sdcard/Download/tarif.csv: open failed: ENOENT (No such file or directory)).

Дело в том, что мне нужно в приложении использовать второй способ (первый - был создан, чтобы потестить).
Ниже представлены фрагменты кода:
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
//...
public void onClick(View v)
    {
        switch(v.getId())
        {
        
        case (R.id.btnDownloadUtil):
            if (Internet.isConnect(this))
            {
                //загрузка файла-ресурсов.
                String url="www.google.com/file.csv"; //не обращайте внимание на ссылку (она не настоящая).
                String description="Загрузка тарифов";
                String title="Тарифы";
                String fileName="tarif.csv";
                
                Internet.downloadFile(this, url, description, title, fileName);
                
                dbHelper=new DBHelper(this);
                SQLiteDatabase db=dbHelper.getWritableDatabase();
                
                try
                {
                    CSV.parse(this, dbHelper, fileName);
                } catch (IOException e)
                {
                    e.printStackTrace();
                    Toast.makeText(this, "Oops", Toast.LENGTH_LONG).show();
                }
                
                db.close();
            }
        }
        break;
        //...
    }
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class Internet
{
    //проверка статуса интернет-соединения.
    public static boolean isConnect(Context context)
    {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
          
        if (ni == null) 
            return false;
        else
           return true;
    }
    
    
    //загрузка файла с сервера.
    public static void downloadFile(Context context, String url, String description, String title, String fileName)
    {
        boolean available=false;        
        
        available=DMisAvailable(context);
        
        if (available) //менеджер загрузки доступен.
        {
            DownloadManager.Request request=new DownloadManager.Request(Uri.parse(url));
            request.setDescription(description);
            request.setTitle(title);        
            
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
            //получение сервера загрузки и установка файла в очередь.
            DownloadManager manager=(DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
            manager.enqueue(request);
        }
        else
        {
            Toast.makeText(context, "Менеджер загрузки не доступен!", Toast.LENGTH_SHORT).show();
        }
        
        Log.d("###MSG###", "Файл загружен");
    }
    
    
    //проверка доступности менеджера загрузки.
    public static boolean DMisAvailable(Context context)
    {
        try
        {
            if (Build.VERSION.SDK_INT<Build.VERSION_CODES.GINGERBREAD)
                return false;
                
            Intent intent=new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            intent.setClassName("com.android.providers.downloads.ui", "com.android.providers.downloads.ui.DownloadList");
            List<ResolveInfo> list=context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            return list.size()>0;
        }
        catch (Exception e)
        {
            return false;
        }
    }   
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void onCreate(SQLiteDatabase db)
    {
        //добавление таблиц в БД.
        db.execSQL("CREATE TABLE "+tableUtil+" ("+
                colIdUtil+" INTEGER PRIMARY KEY, "+
                colUtil+" TEXT)");
        
        //...
        
        
        try
        {
            parse(db);
        } 
        catch (IOException e)
        {
            e.printStackTrace();
            Log.d(TAG, "Ошибка при добавлении данных в БД");
        }
        
    }
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
public void parse(SQLiteDatabase db) throws IOException
    {   
        Log.d("###MSG###", "Парсер начинает работу");
                                                                                                    
        File path=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);       
        String link=path.toString()+"/"+fileName;                                                       
        File file=new File(link);                                                               
            
        InputStream is=new FileInputStream(file);
        
        BufferedReader reader=new BufferedReader(new InputStreamReader(is));
        //извлечение данных из csv-файла построчно.
        try
        {
            String line=reader.readLine();
            int i=0;
            while((line=reader.readLine())!=null)
            {
                i++;
                String[] RowData=line.split("\";\"");   
                addSpecUtil(db, RowData, i);
 
            }
            
        }
        catch (IOException ex)
        {
            Log.d(TAG, "Ошибка чтения данных");
        }
        finally
        {
            is.close();
        }
    }
Ошибка возникает в строке 9: InputStream is=new FileInputStream(file);

Содержимое LogCat'а:
Кликните здесь для просмотра всего текста
05-28 11:39:36.273: W/System.err(2603): java.io.FileNotFoundException: /storage/sdcard/Download/tarif.csv: open failed: ENOENT (No such file or directory)
05-28 11:39:36.283: W/System.err(2603): at libcore.io.IoBridge.open(IoBridge.java:409)
05-28 11:39:36.283: W/System.err(2603): at java.io.FileInputStream.<init>(FileInputStream.java:78)
05-28 11:39:36.283: W/System.err(2603): at com.example.calcutilities.DBHelper.parse(DBHelper.java:179)
05-28 11:39:36.293: W/System.err(2603): at com.example.calcutilities.DBHelper.onCreate(DBHelper.java:114)
05-28 11:39:36.293: W/System.err(2603): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
05-28 11:39:36.293: W/System.err(2603): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
05-28 11:39:36.293: W/System.err(2603): at com.example.calcutilities.MainActivity.onClick(MainActivity.java:91)
05-28 11:39:36.293: W/System.err(2603): at android.view.View.performClick(View.java:4438)
05-28 11:39:36.293: W/System.err(2603): at android.view.View$PerformClick.run(View.java:18422)
05-28 11:39:36.293: W/System.err(2603): at android.os.Handler.handleCallback(Handler.java:733)
05-28 11:39:36.293: W/System.err(2603): at android.os.Handler.dispatchMessage(Handler.java:95)
05-28 11:39:36.293: W/System.err(2603): at android.os.Looper.loop(Looper.java:136)
05-28 11:39:36.293: W/System.err(2603): at android.app.ActivityThread.main(ActivityThread.java:5017)
05-28 11:39:36.293: W/System.err(2603): at java.lang.reflect.Method.invokeNative(Native Method)
05-28 11:39:36.293: W/System.err(2603): at java.lang.reflect.Method.invoke(Method.java:515)
05-28 11:39:36.303: W/System.err(2603): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-28 11:39:36.303: W/System.err(2603): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-28 11:39:36.303: W/System.err(2603): at dalvik.system.NativeStart.main(Native Method)
05-28 11:39:36.303: W/System.err(2603): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
05-28 11:39:36.313: W/System.err(2603): at libcore.io.Posix.open(Native Method)
05-28 11:39:36.313: W/System.err(2603): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
05-28 11:39:36.313: W/System.err(2603): at libcore.io.IoBridge.open(IoBridge.java:393)
05-28 11:39:36.313: W/System.err(2603): ... 17 more


Добавлено через 2 часа 23 минуты
Тему можно закрыть. Удалось найти более изящный вариант загрузки и обработки файла. Приведу фрагмент кода, может быть пригодится кому-нибудь:

Java
1
2
3
4
5
6
7
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
        
String strUrl="http://www.google.com/file.csv";     
URL url=new URL(strUrl);
BufferedReader reader=new BufferedReader(new InputStreamReader(url.openStream()));
String line=reader.readLine();
Брал отсюда:
Кликните здесь для просмотра всего текста
http://www.cyberforum.ru/android-dev/thread915341.html#post4811390
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2014, 23:37     Файл не открывается после загрузки из сети
Посмотрите здесь:

Загрузки изображений из сети в адаптере GridView - Программирование Android
Загружаю картинки в адаптере gridview: //.. viewHolder.name.setText(arrayList.get(position).get(&quot;name&quot;)); ...

Старт Сервиса после загрузки системы - Программирование Android
Хочу реализовать в приложении опцию, запускать сервис при старте системы, но не могу понять как это можно сделать? Если проводить...

ListView после загрузки данных подсветить 1-ый элемент - Программирование Android
Доброго времени суток! Подскажите, как подсветить n-ый элемент в ListView после загрузки данных? пробую list1.setSelection(1) - не...

Выполнить tabHost.addTab() после загрузки данных - Программирование Android
Загружаю данные в потоке и потом из потока, когда всё загрузилось, вызываю handler. Как в этом хендлере выполнить tabHost.addTab ?? ...

Не открывается сохраненный файл - Программирование Android
написал текстовый редактор для Android, имеют кнопки сохранения и открытия по названию файла, файл сохраняется, но не открывается, пишет,...

Вылет приложения при запуске после загрузки шрифта - Программирование Android
Android Studio 2.3 В папке \app\src\main\ (рядом с манифестом) создал папку assets\fonts и положил файл ds-digit.TTF При добавлении...

Невозможно повесить на TextView текстовый расурс после загрузки приложения - Программирование Android
Привет) Надеюсь на вашу помощь. Есть Activity, код метода onCreate() следующий: super.onCreate(savedInstanceState); ...

Скачать файл из сети на SD карту - Программирование Android
Доброго времени суток. Есть такой вопрос: получаю ответ от сервера в виде XML-сообщения и разбираю его. Есть ссылки на файлы кот лежат...

Необходимо открыть pdf документ из сети, есть только ссылка на файл, как это можно сделать - Программирование Android
Салют! Столкнулась с проблемой: необходимо открыть pdf документ из сети, есть только ссылка на файл, как это можно сделать? Какую...

Не подписывается файл apk после обновления Android Studio - Программирование Android
Столкнулся с вот какой проблемой. Обновил Android Studio до версии 2.3, gradle до 3.3 Вроде бы все нормально, ошибок нет, приложение...

После загрузки Windows 10 открывается окно cmd и открывается сайт gangnamgame.net - Удаление вирусов
После загрузки Windows 10 открывается окно cmd и открывается сайт gangnamgame.net

После скачивания игры, после загрузки компа, открывается браузер который по умолчанию - Удаление вирусов
Добрый день! После скачивания игры, при запуске открывается браузер с сайтом (в моем случае liketour.org) который блокируется...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
29.05.2014, 00:46     Файл не открывается после загрузки из сети #2
Если тебе все же интересно в чем могла быть проблема, вот есть мысль:

метод Internet.downloadFile где-то в дебрях кода, которых ты не показал загружал твой файл в отдельном асинхронном потоке - это сто пудов так, потому что сетевые обращения в основном потоке приложения запрещены еще в бородатой версии андроида. Далее, сразу после запуска этого метода ты сразу начинал парсить файл. И судя по выбрасываемой ошибке твой файл к тому времени либо еще не начинал скачиваться или, что скорее всего - качался во временный файл, который после закачки должен был быть переименован в твой.

Когда ты жал кнопки по очереди - файл успевал скачиваться. Возможно, при тормозном инете ты бы получил ту же ошибку, если бы нажимал кнопки быстро.
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
29.05.2014, 01:09  [ТС]     Файл не открывается после загрузки из сети #3
Цитата Сообщение от kvaka Посмотреть сообщение
Если тебе все же интересно в чем могла быть проблема, вот есть мысль:
метод Internet.downloadFile где-то в дебрях кода, которых ты не показал загружал твой файл в отдельном асинхронном потоке - это сто пудов так, потому что сетевые обращения в основном потоке приложения запрещены еще в бородатой версии андроида. Далее, сразу после запуска этого метода ты сразу начинал парсить файл. И судя по выбрасываемой ошибке твой файл к тому времени либо еще не начинал скачиваться или, что скорее всего - качался во временный файл, который после закачки должен был быть переименован в твой.
Когда ты жал кнопки по очереди - файл успевал скачиваться. Возможно, при тормозном инете ты бы получил ту же ошибку, если бы нажимал кнопки быстро.
Конечно интересно!) Возможно так и есть... Но я предполагал, что переход к процедуре парсинга происходит лишь после загрузки файла.
kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
29.05.2014, 02:46     Файл не открывается после загрузки из сети #4
нет. Это 2 параллельные задачи. Это сделано для того, чтобы интерфейс не блокировался и оставался отзывчивым в то время когда качается файл
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
29.05.2014, 03:09  [ТС]     Файл не открывается после загрузки из сети #5
Цитата Сообщение от kvaka Посмотреть сообщение
нет. Это 2 параллельные задачи. Это сделано для того, чтобы интерфейс не блокировался и оставался отзывчивым в то время когда качается файл
каким образом можно делать подобные задачи последовательно?
kvaka
29 / 29 / 3
Регистрация: 26.06.2012
Сообщений: 163
29.05.2014, 11:10     Файл не открывается после загрузки из сети #6
для этого нужно попасть в ту часть кода где происходит непосредственно процесс загрузки. Скорее это происходит в отдельном AsyncTask. Далее вариантов масса.
вцелом сам парсинг ты можешь сделать также в асинхронном потоке - это даже лучше, т. к. парсинг также блокирует основной поток приложения и на время парсинга интерфейс будет блокирован.
Чтобы по окончанию парсинга выдать уведомление - либо сделай это из метода onPostExecute вышеуказанного таска или в любом месте с помощью объекта Handler, созданного в основном потоке.
Прежде чем как-то сдвигаться в данном вопросе обязательно прочитай про классы Handler, AsyncTask и их использование - что не поймешь спрашивай
Yandex
Объявления
29.05.2014, 11:10     Файл не открывается после загрузки из сети
Ответ Создать тему
Опции темы

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