2015-10-24 9 views
6

Ich unsere App (Xamarin C#) wir Dateien von einem Server herunterladen. Am Ende eines succeful Download wir den URI in die neu heruntergeladene Datei erhalten und aus dem URI bekommen wir den Dateipfad:Android 6 erhalten Pfad heruntergeladene Datei

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

In Android 4.4.2 und Android 5 der uri und Weg wie folgt aussehen:

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

Wir verwenden dann Pfad die Datei zu verarbeiten. Das Problem ist, dass in Android 6 (auf einem echten Nexus-Telefon) bekommen wir einen ganz anderen uri und Weg:

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

Das ist meinen Code bricht durch eine FileNotFound Ausnahme werfen. Beachten Sie, dass die heruntergeladene Datei vorhanden ist und sich im Ordner Downloads befindet. Wie kann ich die URI von Android 6 verwenden, um den richtigen Dateipfad zu erhalten, damit ich die Datei bearbeiten und bearbeiten kann?

Danke, [email protected]

+0

Dieses SDK sowohl mit 22 mit SDK 22 – user1523271

+0

Versuchte und 23, die gleiche Resultat – user1523271

Antwort

0

Kann Sie Ihre URI mit dem Download-Ordner erstellen: Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DOWNLOADS) .toURI();

+1

bauen war, aber es funktioniert nur in Android 5, nicht Android 6. fand ich einen Weg drum herum - ich kann keine gute URI bekommen, aber ich kann die gerade heruntergeladene Datei öffnen. Also öffne ich die Datei und kopiere sie wo immer ich will – user1523271

1

Ich habe Ihre tatsächliche Anforderung nicht erhalten, aber es sieht so aus, als ob Sie den Dateiinhalt verarbeiten möchten. Wenn dies der Fall ist, können Sie den Dateiinhalt mit dem Dateideskriptor der heruntergeladenen Datei lesen. Code-Snippet als

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

Aber ich bin auch die Suche der Datei nach der Verarbeitung zu verschieben oder zu löschen.

0

Es ist Arbeit. Das ist, was ich tat, @ 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; 
} 
Verwandte Themen