2015-10-24 3 views
6

Я наше приложение (Xamarin C#) мы загружаем файлы с сервера. В конце succeful загрузки мы получаем URI для вновь загруженного файла и из URI мы получаем путь к файлу:Android 6 получить путь к скачиваемому файлу

Android.Net.Uri uri = downloadManager.GetUriForDownloadedFile(entry.Value); 
path = u.EncodedPath; 

В Android 4.4.2 и Android 5, и URI путь выглядеть следующим образом:

uri="file:///storage/emulated/0/Download/2.zip" 
path = u.EncodedPath ="/storage/emulated/0/Download/2.zip" 

затем мы используем путь для обработки файла. Проблема заключается в том, что в Android 6 (на реальном Nexus телефон), мы получаем совершенно иной и URI путь:

uri="content://downloads/my_downloads/2802" 
path="/my_downloads/2802" 

Это разбивает мой код, бросая исключение FileNotFound. Обратите внимание, что загруженный файл существует и находится в папке «Загрузки». Как я могу использовать URI, который я получаю с Android 6, чтобы получить правильный путь к файлу, чтобы я мог в файл и обрабатывать его?

Спасибо, [email protected]

+0

Это было построено с SDK 22 – user1523271

+0

Попробованная как с SDK 22 и 23, такой же результат – user1523271

ответ

0

Может для Вас построить свой URI с папкой загрузки: Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) .toURI();

+1

Это то, что я сделал, но он работает только в Android 5, а не Android 6. Я нашел способ вокруг него - я не могу получить хороший URI, но я могу открыть только что загруженный файл. Поэтому я открываю файл и копирую его везде, где захочу – user1523271

1

Я не получил ваше фактическое требование, но похоже, что вы хотите обрабатывать содержимое файла. Если это можно сделать, прочитав содержимое файла, используя файловый дескриптор загруженного файла. Фрагмент кода как

ParcelFileDescriptor parcelFd = null; 
    try { 
     parcelFd = mDownloadManager.openDownloadedFile(downloadId); 
     FileInputStream fileInputStream = new FileInputStream(parcelFd.getFileDescriptor()); 
    } catch (FileNotFoundException e) { 
     Log.w(TAG, "Error in opening file: " + e.getMessage(), e); 
    } finally { 
     if(parcelFd != null) { 
      try { 
       parcelFd.close(); 
      } catch (IOException e) { 
      } 
     } 
    } 

Но я также хочу переместить или удалить этот файл после обработки.

0

Это работа. @ 2016.6.24

@Override 
public void onReceive(Context context, Intent intent) { 

    String action = intent.getAction(); 
    if(DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
     DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE); 
     long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
     DownloadManager.Query query = new DownloadManager.Query(); 
     query.setFilterById(downloadId); 
     Cursor c = downloadManager.query(query); 
     if(c != null) { 
      if (c.moveToFirst()) { 
       int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); 
       if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { 
        String downloadFileUrl = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
        startInstall(context, Uri.parse(downloadFileUrl)); 
       } 
      } 
      c.close(); 
     } 
    } 
} 




private boolean startInstall(Context context, Uri uri) { 
    if(!new File(uri.getPath()).exists()) { 
     System.out.println(" local file has been deleted! "); 
     return false; 
    } 
    Intent intent = new Intent(); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setAction(Intent.ACTION_VIEW); 
    intent.setDataAndType(uri, "application/vnd.android.package-archive"); 
    context.startActivity(intent); 
    return true; 
} 
Смежные вопросы