Открытие файла после загрузки с помощью BroadcastReceiver - PullRequest
0 голосов
/ 18 февраля 2020

Я столкнулся с некоторыми проблемами, заставляющими это работать. Файл успешно загружается, однако программа просмотра PDF на устройстве открывается и сразу же закрывается, и отображается сообщение об ошибке: «Не удается получить доступ к файлу, проверьте местоположение или сеть и повторите попытку». Единственное, о чем я могу думать, это то, что загрузка не завершена. когда программа просмотра PDF пытается открыть файл. Я не уверен в размещении этой строки кода для регистрации приемника вещания registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));, так как считаю, что это, вероятно, большая часть моей проблемы. Я очень новичок в java и все еще пытаюсь понять это. Устройство работает android 10 API 29

MainActivity. java

    asw_view.setDownloadListener(new DownloadListener() {

        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        long downloadId;
        String file_Ext;
        String file_Type;

        private BroadcastReceiver downloadCompleteReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                //Fetching the download id received with the broadcast
                long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
                //Checking if the received broadcast is for our enqueued download by matching download id
                if (downloadId == id) {
                    Toast.makeText(MainActivity.this, "Download Completed", Toast.LENGTH_SHORT).show();

                    Cursor c = dm.query(new DownloadManager.Query().setFilterById(downloadId));
                    if (c != null) {
                        c.moveToFirst();
                        try {
                            String fileUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                            File mFile = new File(Uri.parse(fileUri).getPath());
                            String fileName = mFile.getAbsolutePath();

                            MimeTypeMap mime = MimeTypeMap.getSingleton();
                            file_Ext = mFile.getName().substring(mFile.getName().lastIndexOf(".") + 1);
                            file_Type = mime.getMimeTypeFromExtension(file_Ext);

                            openFile(fileName, file_Type);
                        }catch (Exception e){
                            Log.e("error", "Could not open the downloaded file");
                        }
                    }
                }
            }
        };


        private void openFile(String fileToOpen, String file_Type){
            try {
                File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() +"/"+ fileToOpen);

                Intent openFileIntent = new Intent(Intent.ACTION_VIEW);
                openFileIntent.setAction(Intent.ACTION_VIEW);
                openFileIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_CLEAR_TOP);

                Uri contentUri = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", file);
                openFileIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                openFileIntent.setDataAndType(contentUri, file_Type);

                startActivity(openFileIntent);

            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "No pdf viewing application detected. File saved in download folder",Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {

            if (!check_permission(2)) {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, file_perm);
            } else {

                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));

                //Get the name of the file being downloaded from the url
                String DownloadFileName = url.substring(url.lastIndexOf("/") + 1);

                request.setMimeType(mimeType);
                String cookies = CookieManager.getInstance().getCookie(url);
                request.addRequestHeader("cookie", cookies);
                request.addRequestHeader("User-Agent", userAgent);
                request.setDescription(getString(R.string.dl_downloading));
                request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url, contentDisposition, mimeType));
                //DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                assert dm != null;
                downloadId = dm.enqueue(request);

                Toast.makeText(getApplicationContext(), getString(R.string.dl_downloading2) + ": " + DownloadFileName, Toast.LENGTH_LONG).show();

                registerReceiver(downloadCompleteReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));


            }

        }
    });

AndroidManifest. xml имеет оба

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Любая помощь будет принята с благодарностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...