web-dev-qa-db-ja.com

DownloadManagerが機能していませんAndroid 10(Q))

私はかなりの間にこの問題に対して頭を殴ってきました...私は、外部記憶域パブリックディレクトリにファイルをダウンロードするような単純なタスクを実行するために、ダウンロードマンガを使用するアプリを更新しています。

_Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
_

ここではすべてが細かく機能します。Android API 19-28。 API 29(Q/10)でテストするときの問題が発生するところです。 Android実装されたスコープされたストレージと、getExternalStoragePublicDirectory ...を非推奨にしました。結果として、API 19 -29をサポートするための互換性のあるソリューションを見つける必要があります。 DownloNationManagerがSecurityExceptionをスローするため、Internal Application Storageを使用できません。 Androidのマニュアルは、DownloNationManager.Request setDestinationUriを使用できることを示しています。Context.getExternalFilesDir(String)を使用できることをAndroid qでも正確に説明します。私がこれをするとき、パスはまだエミュレートされたパスです。

_/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml
_

ダウンロードマネージャからダウンロードが完了したこと(正しいIDを持つ)でコールバックが表示されますが、保存した領域からダウンロードをつかむことはできません。ファイルが存在するかどうかを確認し、Falseを返します。

_new File("/storage/emulated/0/Android/data/com.my.package.name/files/Download/myFile.xml").exists();
_

あらゆる助けがあります

コンテキストのコードを追加します。だからダウンロードマネージャを設定します

_    private void startDownload() {
        IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
        registerReceiver(downloadReceiver, filter);

        String remoteURL= getString(R.string.remote_url);

        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(remoteUrl));
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
        request.setTitle(getString(R.string.download_title));
        request.setDescription(getString(R.string.download_description));
        request.setDestinationUri(Uri.fromFile(new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml")));

        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        mainDownloadID= manager.enqueue(request);
    }
_

ファイルが存在する場合はファイルを確認してください。

_new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "myFile.xml").exists(); //this returns false in the onReceive (and download IDs match)
_
7
New Guy

Android Q以上]で、アプリのプライベートディレクトリの外部のファイルパス。

参照 https://developer.android.com/training/data-storage#scoped-storage

ユーザーにファイルをダウンロードする場所に問い合わせる必要がありますが、これによりDownloadManager宛先のURIが表示されます。

https://developer.android.com/training/data-storage/shared/documents-files#grant-Access-Directory - *

あなたはおそらくこの許可を永続化したいでしょう

https://developer.android.com/training/data-storage/shared/documents-files#persist-permissions :

0
Andrew

ええ、そのスコープストレージがQ +でファイルをダウンロードすることはできますが、DownloadMangerを使用する必要がありませんAndroid:requestLegacyExternalStorage="true" _

私はこのようにしています。

  1. man man
  • - >
  1. ダウンロードマンガー

     val fileName =
         Constants.FILE_NAME + Date().time
    
     val downloadUri = Uri.parse(media.url)
     val request = DownloadManager.Request(
         downloadUri
     )
     request.setAllowedNetworkTypes(
         DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE
     )
         .setAllowedOverRoaming(true).setTitle("Some name")
         .setDescription("Downloading file")
         .setDestinationInExternalPublicDir(
             Environment.DIRECTORY_DOWNLOADS, File.separator + FOLDER + File.separator + fileName
         )
    
    
     Toast.makeText(
         context,
         "Download successfully to ${downloadUri?.path}",
         Toast.LENGTH_LONG
     ).show()
    
     downloadManager.enqueue(request)
     _

したがって、QとQ +では、QとQ +で書き込み権限を求めます。

0
Mohd Faizan