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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
yol
10 / 10 / 0
Регистрация: 13.10.2012
Сообщений: 155
28.05.2014, 23:37     Файл не открывается после загрузки из сети #1
Действия в программе такие: сначала загружается файл из сети, затем он открывается для получения содержащихся в нем данных.
В приложении я могу это сделать двумя способами:
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     Файл не открывается после загрузки из сети
Посмотрите здесь:

Android Имидж загрузки игры
Android ListView после загрузки данных подсветить 1-ый элемент
Скачать файл из сети на SD карту Android
Загрузки изображений из сети в адаптере GridView Android
Android Выполнить tabHost.addTab() после загрузки данных
Android Не работает анимация загрузки
Android Долго открывается активность
Старт Сервиса после загрузки системы Android
Android Невозможно повесить на TextView текстовый расурс после загрузки приложения
% загрузки файла Android
Android Не открывается сохраненный файл
Android Необходимо открыть pdf документ из сети, есть только ссылка на файл, как это можно сделать

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kvaka
 Аватар для 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
 Аватар для 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
 Аватар для 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     Файл не открывается после загрузки из сети
Ответ Создать тему
Опции темы

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