Home > Back-end >  Download pdf in android 11
Download pdf in android 11

Time:10-21

I have upgraded to android 11. I am having an issue downloading PDF files.

I have used this code:

private void createFile(Uri pickerInitialUri, String title) {
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("application/pdf");
    intent.putExtra(Intent.EXTRA_TITLE, title);

    // Optionally, specify a URI for the directory that should be opened in
    // the system file picker when your app creates the document.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri);
    }

    startActivityForResult(intent, CREATE_FILE);
}

The file is created but the file is empty. I am still unable to save the downloaded pdf file.

I used to use DownloadManager request to download the pdf file from web.

DownloadManager downloadManager = (DownloadManager) this.getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(uri);

        if (SDK_INT > Build.VERSION_CODES.Q) {

         //   Uri uri1 = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), ""));  //before android 11 this was working fine

           // Uri uri1 = Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "")); 

            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
                    .setAllowedOverRoaming(true).setTitle(title   strDate   ".pdf")
                    .setDescription(description)
                    //.setDestinationUri(uri1) // before android 11 it was working fine.
                    .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, title   strDate   ".pdf") // file is not saved on this directory.
                    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);//to show the DOWNLOAD notification when completed

           // createFile(uri , title   strDate   ".pdf"); // for new scoped storage


        } else {
            request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
                    .setAllowedOverRoaming(true).setTitle(title   strDate   ".pdf")
                    .setDescription(description)
                    .setDestinationInExternalPublicDir(FileUtils.downloadPdfDestination(), title   strDate   ".pdf")
                    .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //to show the DOWNLOAD notification when completed
        }
       long PDF_DOWNLOAD_ID = downloadManager.enqueue(request);```

CodePudding user response:

ACTION_CREATE_DOCUMENT is used to create a new document. If one already existed, it will be overwritten. If you want to view an existing document, use ACTION_VIEW.

Of course none of the code you posted actually downloads a PDF. If you need help with that, post your DownloadManager code.

CodePudding user response:

Check this code snippet:

override fun startDownload(url: String, one rror: (e: Exception) -> Unit) {
        try {
            val request = DownloadManager.Request(Uri.parse(url))
            request.setDestinationInExternalPublicDir(
                Environment.DIRECTORY_DOWNLOADS,
                UUID.randomUUID().toString()
            )
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION)
            (context.getSystemService(DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
        } catch (e: Exception) {
            e.printStackTrace()
            one rror.invoke(e)
        }
    }

It's working fine on Android 11 by using DownloadManger API.

  • Related