2015-10-24 12 views
6

I nasza aplikacja (Xamarin C#) pobieramy pliki z serwera. Pod koniec succeful pobrania otrzymujemy URI do nowo pobranego pliku i od URI mamy ścieżkę pliku:Android 6 pobierz ścieżkę do pobranego pliku

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

W Androidzie 4.4.2 i Androida 5 ścieżki uri i wyglądać następująco:

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

następnie używamy ścieżkę przetworzyć plik. Problem polega na tym, że w Androida 6 (na prawdziwym telefonie Nexus) otrzymujemy zupełnie inny Uri i ścieżkę:

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

To łamie mi kod rzucając wyjątek FileNotFound. Zauważ, że pobrany plik istnieje i znajduje się w folderze Pobrane. Jak mogę użyć identyfikatora URI, który otrzymałem z systemu Android 6, aby uzyskać poprawną ścieżkę do pliku, aby móc go przetworzyć i przetworzyć?

Dziękuję [email protected]

+0

To budować z SDK 22 – user1523271

+0

Próbowaliśmy zarówno SDK 22 i 23 tego samego rezultatu – user1523271

Odpowiedz

0

Niech Ci zbudować swój URI z folderu pobierania: Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) .toURI();

+1

To, co zrobiłem, ale to działa tylko na Androidzie 5, nie Android 6. znalazłem sposób wokół niego - nie mogę uzyskać dobrego identyfikatora URI, ale mogę otworzyć właśnie pobrany plik. Otwieram plik i kopiuję go, gdzie tylko chcę – user1523271

1

Nie dostałem rzeczywistego zapotrzebowania, ale wygląda na to, że chcesz przetworzyć zawartość pliku. Jeśli tak, można to zrobić, odczytując zawartość pliku za pomocą deskryptora pliku pobranego pliku. Fragment kodu pod numerem

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) { 
      } 
     } 
    } 

Ale szukam również przeniesienia lub usunięcia tego pliku po przetworzeniu.

0

To działa. @ 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; 
} 
Powiązane problemy