2017-01-02 12 views
1

私はこのアプリケーションを使用して、ビデオのダウンロードを可能にします。ダウンロード部分は動作していますが、ダウンロードが完了した直後に別の機能を実行する必要があります。現在、AsyncTaskを使用していますが、PostExecuteでトーストしようとすると、何も起こりません。私は、ダウンロードが完了した後、元のファイルを暗号化してから削除する別の関数を呼びたいと思います。ダウンロードマネージャAndroid:ダウンロード完了

そしてbtw、暗号化部分も同様に働いています。私に必要なのは、ダウンロードが完了したかどうかを知ることができるものだけです。

これは私がURLからファイルをダウンロードするコードです。しかし、私はダウンロードは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(); 

} 
を実行するために完了しているかどうかを知る必要があり

AsyncTaskのコードは次のとおりです。

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

私は、コードには問題はありません問題が何であるかを知っているが、よUCANはgetApplicationContext(代わりにgetActivity) –

+0

を使用してみてくださいいけません。私はダウンロードが完了したかどうかを知る方法を知る必要があります。 – VouchMe

答えて

1

だからあなたがダウンロードマネージャを使用してファイルをダウンロードした後、ファイルにアクセスしたいです。 最初にファイルをダウンロードした後に通知するブロードキャスト受信機が必要です。マニフェストに

<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> 

今では私たちは放送受信機でそれを得ることができるようにあなたのsharedprefまたはデータベースで、このダウンロード参照IDを保存する今sharedprefまたはデータベース でダウンロード参照IDを保存する必要があります。

BroadcastReceiverクラスのonReceiveで今
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); 

主要部分、

   @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 
} 

     } 
関連する問題