Почему Broadcast Receiver не звонит после завершения работы менеджера загрузок? - PullRequest
0 голосов
/ 08 июля 2019

Я устанавливаю менеджер загрузок для загрузки файла PDF для URL сервера.Файл загружен полностью, но Broadcast Receiver не вызывает для открытия файла.Я использую классы AsyncTask и doInBackground для загрузки и установки прав доступа. ИНТЕРНЕТ, разрешение.WRITE_EXTERNAL_STORAGE, разрешение.WRITE_INTERNAL_STORAGE, разрешение.READ_EXTERNAL_STORAGE в манифесте.Я проверил мой каталог на реальном устройстве, и PDF-файл полностью загружен без сбоев.

в OnCreate

        registerReceiver(onComplete, filter);

в OnClick Button

                    downloadPdf(v);
                } else {
                    requestStoragePermission(v);
                }

, а также установлен onDestroy

    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(onComplete);
    }

и загрузка файла

        @Override
        protected Void doInBackground(String... strings) {
            String fileUrl = strings[0];
            String fileName = strings[1];
            String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
            File folder = new File(extStorageDirectory, DIRECTORY_PDF_NAME);
            if (!folder.exists()) {
                folder.mkdir();
            }
//            File pdfFile = new File(folder, fileName);
            file_download(fileUrl);
            return null;
        }

        public void file_download(String fileUrl) {

            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + DIRECTORY_PDF_NAME + "/" + "au.pdf");
            if (file.exists()) {
                Intent target = new Intent(Intent.ACTION_VIEW);
                target.setDataAndType(Uri.fromFile(file), "application/pdf");
                target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

                Intent intent = Intent.createChooser(target, "انتخاب برنامه");
                try {
                    startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    Toast.makeText(LoginActivity.this, "عدم موفقیت در نمایش فایل", Toast.LENGTH_SHORT).show();
                }
            } else {
                mgr = (DownloadManager) LoginActivity.this.getSystemService(Context.DOWNLOAD_SERVICE);
                Uri downloadUri = Uri.parse(fileUrl);
                DownloadManager.Request request = new DownloadManager.Request(
                        downloadUri);
                request.setAllowedNetworkTypes(
                        DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE)
                        .setAllowedOverRoaming(false)
                        .setTitle("راهنمای ثبت نام")
                        .setDescription("  در حال دانلود..." + "فایل راهنمای ثبت نام")
                        .setDestinationInExternalPublicDir("/" + DIRECTORY_PDF_NAME + "/", "au.pdf");

                try {
                    refid = mgr.enqueue(request);
                    Log.d(TAG, "Checking download status for id: " + refid);

                } catch (ActivityNotFoundException e) {
                    Toast.makeText(LoginActivity.this, "عدم موفقیت در دانلود فایل", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }

и в конце

        public void onReceive(Context ctxt, Intent intent) {

            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + DIRECTORY_PDF_NAME + "/" + "au.pdf");
            Intent target = new Intent(Intent.ACTION_VIEW);
            target.setDataAndType(Uri.fromFile(file), "application/pdf");
            target.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            Intent intentPdf = Intent.createChooser(target, "انتخاب برنامه");
            try {
                startActivity(intentPdf);
            } catch (ActivityNotFoundException e) {
            }
        }

1 Ответ

0 голосов
/ 15 июля 2019

Я решаю эту проблему с помощью этого решения. Я создаю класс PDF и передаю в нем свой загружаемый код.

public Pdf(Context context, String url, String fileName) {
    this.context = context;
    this.url = url;
    this.fileName = fileName;
    init();
}


private void init() {
    downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    context.registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    Download_Uri = Uri.parse(url);
}

public void checkAndDownload() {
    if (isStoragePermissionGranted()) {
        if (isExistPdfFile()) {
            openGeneratedPDF();
        }else{
            downloadPdf();
        }

    }
}

public void permissionGranted(int[] grantResults) {
    if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
        downloadPdf();
    }
}

private boolean isStoragePermissionGranted() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (context.checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    } else {
        return true;
    }
}


public BroadcastReceiver onComplete = new BroadcastReceiver() {
    public void onReceive(Context ctxt, Intent intent) {
        isCompeleted = true;
        openGeneratedPDF();
    }

};

private boolean isExistPdfFile() {
    File target = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
    file = new File(target, DIRECTORY_PDF_NAME + "/" + fileName + ".pdf");
    if (file.exists()) {
        return true;
    }else{
        return false;
    }
}

private void openGeneratedPDF() {
    if (isExistPdfFile()) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
        Log.e("uri is",uri.toString());
        intent.setDataAndType(uri, "application/pdf");
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        try {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            context.startActivity(intent);
        } catch (ActivityNotFoundException e) {
            Toast.makeText(context, "برنامه‌ای برای نمایش فایل PDF وجود ندارد", Toast.LENGTH_LONG).show();
        }
    }else {
        Toast.makeText(context,"فایل مورد نظر یافت نشد",Toast.LENGTH_LONG).show();
    }
}

private void downloadPdf() {
    DownloadManager.Request request = new DownloadManager.Request(Download_Uri);
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE);
    request.setAllowedOverRoaming(true);
    request.setVisibleInDownloadsUi(true);
    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, Constant.DIRECTORY_PDF_NAME + "/" + fileName + ".pdf");
    refid = downloadManager.enqueue(request);
    Log.e("OUT", "" + refid);
}

public boolean getIsCompeleted() {
    return isCompeleted;
}

и вызываю его в своем требовании Activity, также я использую поставщика файлов, например

  Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
...