2017-01-02 6 views
1

Ich habe diese Anwendung, in der eine Funktion ermöglicht es Ihnen, ein Video herunterzuladen. Der Download-Teil funktioniert, aber ich muss direkt nach dem Download eine andere Funktion ausführen. Derzeit verwende ich AsyncTask, aber wenn ich versuche, auf PostExecute zu rösten, passiert nichts. Ich möchte eine andere Funktion aufrufen, um die ursprüngliche Datei zu verschlüsseln und dann zu löschen, nachdem der Download abgeschlossen wurde.Download Manager Android: Download Complete

Und übrigens, der Verschlüsselungsteil funktioniert auch. Das einzige, was ich brauche, ist etwas, mit dem ich wissen kann, ob der Download abgeschlossen ist.

Dies ist der Code, in dem ich die Datei von einer URL herunterladen werde. Aber ich muss wissen, ob der Download abgeschlossen ist die AsyncTask

public void downloadTutorial() throws Exception { 
    myURL = ""; 

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myURL)); 
    request.setTitle(injuryType + " Video"); 
    request.setDescription("File is being downloaded..."); 

    request.allowScanningByMediaScanner(); 
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
    String fileName = URLUtil.guessFileName(myURL, null, MimeTypeMap.getFileExtensionFromUrl(myURL)); 

    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); 

    DownloadManager manager = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE); 
    manager.enqueue(request); 

    //if the download is complete execute this 
    //new JSONTask().execute(); 

} 

Der Code des AsyncTask auszuführen ist:

public class JSONTask extends AsyncTask<Void, Void, Void>{ 

    @Override 
    protected Void doInBackground(Void... params) { 

     try { 
      Encrypter.encrypt(injuryType); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
      e.printStackTrace(); 
     } catch (InvalidKeyException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 

     Toast.makeText(getActivity(), "Download Done", Toast.LENGTH_SHORT).show(); 

    } 
} 
+0

ich weiß nicht, was das Problem ist aber yo ucan try Verwendung getApplicationContext (statt dem getActivity) –

+0

Es gibt kein Problem mit dem Code. Ich muss nur wissen, wie man weiß, ob der Download abgeschlossen ist. – VouchMe

Antwort

1

So wollen Sie die Datei zugreifen, nachdem das Herunterladen der Datei-Download-Manager verwenden . Zuerst benötigen Sie einen Broadcast-Empfänger, der Sie nach dem Herunterladen einer Datei informiert.

In Manifest:

<receiver 
      android:name="<your download receiver class extends Broadcast receiver>" 
      android:enabled="true" 
      android:protectionLevel= "signature" 
      > 
      <intent-filter> 
       <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
      </intent-filter> 
     </receiver> 

Jetzt müssen Sie die Download-Referenz-ID in sharedpref oder Datenbank speichern nun diesen Download Referenz-ID in Ihrer sharedpref oder Datenbank speichern, damit wir es in Rundfunkempfängern erhalten.

Uri uri = Uri.parse(content.url); 
              DownloadManager.Request request = new DownloadManager.Request(uri); 
             request.setDescription("Your App Title").setTitle(<file title>); 
              request.setDestinationInExternalFilesDir(getActivity(), Environment.DIRECTORY_DOWNLOADS, <file title>); 
              request.setVisibleInDownloadsUi(false); //the content will not shown in Download Manager App 
              mydownlodreference = downloadManager.enqueue(request); 

nun der Hauptteil, in OnReceive von BroadcastReceiver Klasse

   @Override 
       public void onReceive(Context context, Intent intent) { 
        DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
        long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 

    // take out the reference id from your sharedpref or database and check that referenceId with this reference 

    DownloadManager.Query query = new DownloadManager.Query(); 
       query.setFilterById(reference); 
       Cursor c = downloadManager.query(query); 
       c.moveToFirst(); 
       int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS); 
       int status = c.getInt(columnIndex); 
       int fileNameIndex = c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); 
       String filePath = c.getString(fileNameIndex); 
if (status == DownloadManager.STATUS_SUCCESSFUL) { 
// do whatever you want here 
} 

     } 
Verwandte Themen