Открыть файл pdf-файла, который хранится в хранилище Firebase.

Я загрузил файл Pdf в хранилище firebase, после загрузки файла pdf в хранилище firebase, я получаю URL-адрес загрузки. Теперь я хочу открыть pdf-файл из этого URL-адреса загрузки в своем приложении.

Ниже приведен URL, который я получаю после загрузки файла PDF в хранилище firebase.

https://firebasestorage.googleapis.com/v0/b/realtime-chat-46f4c.appspot.com/o/documents%2Fbf307aa5-79ae-4532-8128-ee394537b357.pdf?alt=media&token=2d0c5329-4717-4adc- 9418-6614913e5bfa

Теперь я хочу открыть намерение просмотреть этот pdf-файл, для этого я использовал приведенный ниже код:

String url = "https://firebasestorage.googleapis.com/v0/b/realtime-chat-46f4c.appspot.com/o/documents%2Fbf307aa5-79ae-4532-8128-ee394537b357.pdf?alt=media&token=2d0c5329-4717-4adc-9418-6614913e5bfa";

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "application/pdf");
startActivity(Intent.createChooser(intent, "Choose an Application:"));

В моем телефоне есть приложения, которые могут открыть этот pdf-файл, но он говорит, что для просмотра этого файла нет приложений.

Если я преобразую этот url в File и использую приведенный ниже код, тогда выборщик приложений открывается, но он дает ошибку, что файл не может быть открыт.

Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
File file = new File(name);
intent.setDataAndType(Uri.fromFile(file), "aplication/pdf");

Я видел много ответов, в которых говорится, что сначала загрузите файл, а затем откройте его, но я не хочу загружать файл, я просто хочу его просмотреть.

Пожалуйста, помогите мне, если у кого-нибудь есть представление об этом.

Большое спасибо в продвинутом виде.

android,pdf,firebase,firebase-storage,

3

Ответов: 5


Вы должны использовать Intent Chooser

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(url), "application/pdf");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
Intent newIntent = Intent.createChooser(intent, "Open File");
try {
    startActivity(newIntent);
} catch (ActivityNotFoundException e) {
    // Instruct the user to install a PDF reader here, or something
} 

1

Добавьте следующие файлы / метод в свой проект.

  1. PdfDownloader.java
  2. PDFDownloaderAsyncTask.java

а затем используя следующий метод handleViewPdf для просмотра pdf:

private void handleViewPdf () {

    File folder = getAppDirectory(context);
    String fileName = "test.pdf";// getPdfFileName(pdfUrl);
    File pdfFile = new File(folder, fileName);

    if (pdfFile.exists () && pdfFile.length () > 0) {
        openPDFFile (context, Uri.fromFile(pdfFile));
    }
    else {
        if (pdfFile.length () == 0) {
            pdfFile.delete ();
        }
        try {
            pdfFile.createNewFile ();
        }
        catch (IOException e) {
            e.printStackTrace ();
        }
        ArrayList<String> fileNameAndURL = new ArrayList<> ();
        fileNameAndURL.add (pdfFile.toString ());
        fileNameAndURL.add (pdfUrl);
        fileNameAndURL.add (fileName);
        if (pdfDownloaderAsyncTask == null) {
            pdfDownloaderAsyncTask = new PDFDownloaderAsyncTask (context, pdfFile);
        }
        if (hasInternetConnection (context)) {
            if (!pdfDownloaderAsyncTask.isDownloadingPdf ()) {
                pdfDownloaderAsyncTask = new PDFDownloaderAsyncTask (context, pdfFile);
                pdfDownloaderAsyncTask.execute (fileNameAndURL);
            }
        }
        else {
            //show error
        }
    }
}

PDFDownloaderAsyncTask.java

    import java.io.File;
    import java.util.ArrayList;

    import android.content.Context;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.Handler;
    import android.text.TextUtils;
    import android.widget.Toast;


    public class PDFDownloaderAsyncTask extends AsyncTask<ArrayList<String>, Void, String> {

        private boolean isDownloadingPdf = false;

        private File    file;
        private Context context;

        public PDFDownloaderAsyncTask (Context context, File file) {

            this.file = file;
            this.context = context;
            this.isDownloadingPdf = false;
        }

        public boolean isDownloadingPdf () {

            return this.isDownloadingPdf;
        }

        @Override
        protected void onPreExecute () {

            super.onPreExecute ();
            //show loader etc
        }

        @Override
        protected String doInBackground (ArrayList<String>... params) {

            isDownloadingPdf = true;
            File file = new File (params[0].get (0));
            String fileStatus = PdfDownloader.downloadFile (params[0].get (1), file);
            return fileStatus;
        }

        @Override
        protected void onPostExecute (String result) {

            super.onPostExecute (result);
            Loader.hideLoader ();
            if (!TextUtils.isEmpty (result) && result.equalsIgnoreCase (context.getString (R.string.txt_success))) {
                showPdf ();
            }
            else {
                isDownloadingPdf = false;
                Toast.makeText (context, context.getString (R.string.error_could_not_download_pdf), Toast.LENGTH_LONG).show ();
                file.delete ();
            }
        }

        @Override
        protected void onCancelled () {

            isDownloadingPdf = false;
            super.onCancelled ();
            //Loader.hideLoader ();
        }

        @Override
        protected void onCancelled (String s) {

            isDownloadingPdf = false;
            super.onCancelled (s);
            //Loader.hideLoader ();
        }

        private void showPdf () {

            new Handler ().postDelayed (new Runnable () {
                @Override
                public void run () {

                    isDownloadingPdf = false;
                    openPDFFile (context, Uri.fromFile (file));
                }
            }, 1000);
        }
    }

PdfDownloader.java

package com.pdf;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class PdfDownloader {
    private static final int MEGABYTE = 1024 * 1024;

    public static String downloadFile (String fileUrl, File directory) {

        String downloadStatus;
        try {

            URL url = new URL (fileUrl);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection ();
            urlConnection.connect ();

            InputStream inputStream = urlConnection.getInputStream ();
            FileOutputStream fileOutputStream = new FileOutputStream (directory);
            int totalSize = urlConnection.getContentLength ();

            Log.d ("PDF", "Total size: " + totalSize);
            byte[] buffer = new byte[MEGABYTE];
            int bufferLength = 0;
            while ((bufferLength = inputStream.read (buffer)) > 0) {
                fileOutputStream.write (buffer, 0, bufferLength);
            }
            downloadStatus = "success";
            fileOutputStream.close ();
        }
        catch (FileNotFoundException e) {
            downloadStatus = "FileNotFoundException";
            e.printStackTrace ();
        }
        catch (MalformedURLException e) {
            downloadStatus = "MalformedURLException";
            e.printStackTrace ();
        }
        catch (IOException e) {
            downloadStatus = "IOException";
            e.printStackTrace ();
        }
        Log.d ("PDF", "Download Status: " + downloadStatus);
        return downloadStatus;
    }


    public static void openPDFFile (Context context, Uri path) {

        Intent intent = new Intent (Intent.ACTION_VIEW);
        intent.setDataAndType (path, "application/pdf");
        intent.setFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP);
        try {
            context.startActivity (intent);
        }
        catch (ActivityNotFoundException e) {
            Toast.makeText (context, context.getString (R.string.txt_no_pdf_available), Toast.LENGTH_SHORT).show ();
        }
        Loader.hideLoader ();
    }

    public static File getAppDirectory (Context context) {

        String extStorageDirectory = Environment.getExternalStorageDirectory ().toString ();
        File folder = new File (extStorageDirectory, context.getString (R.string.app_folder_name).trim ());
        if (!folder.exists ()) {
            boolean success = folder.mkdirs();
            Log.d ("Directory", "mkdirs():" + success);
        }
        return folder;
    }

}

1
+50

Ваш телефон не обнаруживает PDF, потому что URL, который вы используете, является объектом String, а не объектом PDF. Технически, он никогда не должен открываться с телефона в формате PDF, если вы не загрузите PDF. Чтение PDF-файлов на телефоне активируется только после того, как ОС Android сообщит им, что у него есть действительный файл PDF. Пожалуйста, посмотрите исходный код любой из библиотек PDF, чтобы понять это лучше -> https://android-arsenal.com/tag/72?sort=created

Однако, чтобы ответить на вашу проблему, попробуйте открыть URL-адрес в качестве URL-адреса. Он активирует браузер на вашем телефоне, который, в свою очередь, обнаружит, что ему нужен PDF-ридер и активирует соответствующий считыватель.

Что-то вроде

String url = "https://firebasestorage.googleapis.com/v0/b/realtime-chat-46f4c.appspot.com/o/documents%2Fbf307aa5-79ae-4532-8128-ee394537b357.pdf?alt=media&token=2d0c5329-4717-4adc-9418-6614913e5bfa";


public void openWebPage(String url) {
    Uri webpage = Uri.parse(url);
    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

Тем не менее, я думаю, что вы хотите просто проверить, успешно ли загружен файл. И если на телефоне есть локальная копия, просто откройте локальную копию вместо загрузки другой копии. Если это так, то я рекомендую использовать метаданные файлов для достижения этого. Что-то вроде:

 // Create file metadata including the content type
StorageMetadata metadata = new StorageMetadata.Builder()
        .setCustomMetadata("myPDFfile", "localPDFfileName")
        .build();

// Upload the file and metadata
uploadTask = storageRef.child("pdf/localPDFfileName.pdf").putFile(file, metadata);

И в своем слушателе успеха извлеките метаданные файла. Если он загружен и выглядит полным, откройте PDF из своего локального телефона. Если нет, попробуйте загрузить из downloadURL, как я упоминал в начале сообщения. Это должно охватывать проверки, которые вы пытаетесь сделать.

Подумайте подробнее, если я не понял вашу проблему, правильно. Я подберу его и соответствующим образом изменю свой ответ.


0

попробуйте закодировать URL-адрес базы данных базы данных firebase. он работает со мной


Используйте Webview для просмотра pdf file-

 WebView webview = (WebView) findViewById(R.id.webview);
    webview.getSettings().setJavaScriptEnabled(true);
    String pdf = "https://firebasestorage.googleapis.com/v0/b/realtime-chat-46f4c.appspot.com/o/documents%2Fbf307aa5-79ae-4532-8128-ee394537b357.pdf?alt=media&token=2d0c5329-4717-4adc-9418-6614913e5bfa";
    webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + pdf);
андроид, PDF, firebase, firebase-хранения,
Похожие вопросы
Яндекс.Метрика