2015-10-24 9 views
6

I la nostra app (Xamarin C#) scarichiamo i file da un server. Al termine di un download succeful otteniamo l'URI per il file appena scaricato e dalla URI otteniamo il percorso del file:Android 6 get percorso per il file scaricato

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

In Android 4.4.2 e Android 5 percorso uri e simile a questa:

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

Abbiamo quindi utilizzare percorso per elaborare il file. Il problema è che in Android 6 (su un vero e proprio telefono Nexus) otteniamo una completamente diversa uri e percorso:

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

Questo rompe il mio codice lanciando un'eccezione FileNotFound. Si noti che il file scaricato esiste ed è nella cartella Download. Come posso utilizzare l'URI che ottengo da Android 6 per ottenere il percorso file corretto in modo che possa accedere al file ed elaborarlo?

Grazie, [email protected]

+0

Questo è stato costruito con SDK 22 – user1523271

+0

provato sia con SDK 22 e 23, lo stesso risultato – user1523271

risposta

0

Può Sei un costruire la vostra URI con la cartella di download: Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) .toURI();

+1

Questo è quello che ho fatto, ma funziona solo in Android 5, non Android 6. Ho trovato un modo tutt'intorno: non riesco a ottenere un buon URI, ma posso aprire il file appena scaricato. Così apro il file e lo copio dove voglio – user1523271

1

Non ho ricevuto il tuo requisito effettivo ma sembra che tu voglia elaborare il contenuto del file. Se è così può essere fatto leggendo il contenuto del file utilizzando il descrittore di file del file scaricato. Snippet di codice come

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

Ma sto anche cercando di spostare o eliminare quel file dopo l'elaborazione.

0

È lavoro. @ 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; 
} 
Problemi correlati