Как открыть файл PDF, загруженный и сохраненный в папке «Скачать» на мобильном устройстве? - PullRequest
0 голосов
/ 06 февраля 2020

Я исследовал различные решения этой проблемы, но ни один из них не работает для меня. Я пытаюсь загрузить файл из Firebase (что мне удалось сделать), а затем я пытаюсь открыть этот файл в своем приложении сразу после завершения загрузки. Однако мое приложение либо вылетает, либо ничего не делает.

Ниже приведен код для загрузки файла (из FirebaseStorage, который работает):

public void download(String name) {
    final String pdf_name = name.substring(0, name.lastIndexOf('.'));
    storageReference = firebaseStorage.getInstance().getReference();
    ref=storageReference.child("Auctions/" + name);
    ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            String url = uri.toString();
            downloadFile(ActiveAuctionsActivity.this, pdf_name, ".pdf", DIRECTORY_DOWNLOADS, url);
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            SpannableString spannableString = new SpannableString("אין תיק עבודה למכרז זה");
            spannableString.setSpan(
                    new ForegroundColorSpan(getResources().getColor(android.R.color.holo_red_light)),
                    0,
                    spannableString.length(),
                    0);
            Toast.makeText(ActiveAuctionsActivity.this, spannableString, Toast.LENGTH_LONG).show();
        }
    });

}

public void downloadFile(Context context, String fileName, String fileExtention, String destinationDirectory, String url){
    DownloadManager downloadmanager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
    Uri uri = Uri.parse(url);
    DownloadManager.Request request = new DownloadManager.Request(uri);

    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDescription("מוריד.....");
    //request.setDestinationInExternalFilesDir(context, destinationDirectory, fileName + fileExtention);

    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName + fileExtention);
    // call allowScanningByMediaScanner() to allow media scanner to discover your file
    request.allowScanningByMediaScanner();

    downloadmanager.enqueue(request);
    registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    Toast.makeText(getApplicationContext(), "מוריד את התיק העבודה.....",
            Toast.LENGTH_SHORT).show();
}

После того, как я настроил приемник с помощью openFile() метод:

BroadcastReceiver onComplete=new BroadcastReceiver() {
    public void onReceive(Context ctxt, Intent intent) {
        Toast.makeText(getApplicationContext(), "ההורדה הסתיימה",
                Toast.LENGTH_LONG).show();
        openFile("GMU.pdf");
    }
};

public void openFile(String fileName){
    try {
        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName);
        Uri path = Uri.fromFile(file);
        Log.i("Fragment2", String.valueOf(path));
        Intent pdfOpenintent = new Intent(Intent.ACTION_VIEW);
        pdfOpenintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        pdfOpenintent.setDataAndType(path, "application/pdf");

        this.startActivity(pdfOpenintent);
    } catch (ActivityNotFoundException e) {
        Toast.makeText(ActiveAuctionsActivity.this, "error", Toast.LENGTH_LONG).show();
    }

}

Опять же, файл загружается, но не открывается.

Что я делаю не так, не могли бы вы посоветовать мне?

РЕДАКТИРОВАТЬ Я также попробовал приведенный ниже код как мой openFile (), но он также не работает:

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName);

    Uri path = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", file);
    Intent pdfOpenintent = new Intent(Intent.ACTION_VIEW);
    pdfOpenintent.setDataAndType(path, pdfOpenintent.getType());
    pdfOpenintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    pdfOpenintent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    try {
        ActiveAuctionsActivity.this.startActivity(pdfOpenintent);
    } catch (ActivityNotFoundException e) {
        pdfOpenintent.setType("application/*");
        startActivity(Intent.createChooser(pdfOpenintent, "No Application found to open File - " + fileName));
    }
...