Показать PDF в Android - PullRequest
       1

Показать PDF в Android

7 голосов
/ 14 сентября 2010

В моем onCreate () я делаю эту проверку:

//
// check if we have a PDF viewer, else bad things happen
//
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setType("application/pdf");

List<ResolveInfo> intents = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);

if (intents == null || intents.size() == 0) {
       // display message then...
       finish();
}

В моем HTC Desire это не возвращает совпадения, даже если у меня есть программа просмотра PDF от Adobe. Ответ на этот вопрос android: откройте pdf из моего приложения с помощью встроенного средства просмотра pdf упоминает, что Adobe может не иметь общедоступных Intents, поэтому приведенная выше проверка, очевидно, ничего не даст.

Может ли кто-нибудь проверить, можете ли вы запускать Acrobat из намерения или есть какой-то другой метод или средство просмотра PDF для использования.

Фактический вариант использования - загрузка копий счетов и их хранение в локальном хранилище с использованием кода, такого как:

 URL url = new URL(data);
 InputStream myInput = url.openConnection().getInputStream();

 FileOutputStream fos = openFileOutput(fname, Context.MODE_WORLD_READABLE);

 // transfer bytes from the input file to the output file
 byte[] buffer = new byte[8192];
 int length;
 while ((length = myInput.read(buffer)) > 0) {
    fos.write(buffer, 0, length);
    progressDialog.setProgress(i++);
 }
 fos.close();

, а затем показать

// read from disk, and call intent
openFileInput(fname);   // will throw FileNotFoundException

File dir = getFilesDir();       // where files are stored
File file = new File(dir, fname);   // new file with our name

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
intent.setType("application/pdf");

startActivity(intent);

Ответы [ 2 ]

6 голосов
/ 14 сентября 2010

Подключите телефон к компьютеру, запустите Eclipse и откройте LogCat. Затем загрузите файл PDF с помощью браузера и откройте его. Вы должны увидеть строку, такую ​​как (я использовал желание HTC):

09-14 17: 45: 58.152: INFO / ActivityManager (79): начало деятельности: намерение {act = android.intent.action.VIEW dat = file: ///sdcard/download/FILENAME.pdf typ = application / pdf flg = 0x4000000 cmp = com.htc.pdfreader / .ActPDFReader}

Иди с явным намерением, используя информацию о компонентах. Документы говорят здесь:

> component - Задает явное имя класса компонента, используемого для намерения. Обычно это определяется путем просмотра другой информации в намерении (действие, данные / тип и категории) и сопоставления ее с компонентом, который может ее обработать. Если этот атрибут установлен, то никакая оценка не выполняется, и этот компонент используется точно так, как есть. При указании этого атрибута все остальные атрибуты Intent становятся необязательными.

Недостатком является то, что вы будете связаны с читателем HTC. Но вы могли бы сначала попробовать неявное намерение, а если это не удалось, попробуйте явное намерение как запасной вариант.

0 голосов
/ 20 июля 2014

-Скопируйте следующий код в вашей деятельности. Вызовите функцию CopyReadAssets ("File_name.pdf") из функции onCreate (). Поместите файл File_name.pdf в папку ресурсов.

private void CopyReadAssets(String pdfname)
{
    AssetManager assetManager = getAssets();
    InputStream in = null;
    OutputStream out = null;
    File file = new File(getFilesDir(), pdfname);
    try
    {
        in = assetManager.open(pdfname);
        out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);
        copyFile(in, out);
        in.close();
        in = null;
        out.flush();
        out.close();
        out = null;
    } catch (Exception e)
    {
        Toast.makeText(getApplicationContext(), "Pdf Viewer not installed", Toast.LENGTH_SHORT).show();
    }
    try
    {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(
            Uri.parse("file://" + getFilesDir() + "/"+pdfname),
            "application/pdf");

    startActivity(intent);
    }catch (Exception e) {
        // TODO: handle exception
        Toast.makeText(getApplicationContext(), "Pdf Viewer not installed" ,Toast.LENGTH_SHORT).show();
    }
}

private void copyFile(InputStream in, OutputStream out) throws IOException
{
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1)
    {
        out.write(buffer, 0, read);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...