2010-09-14 3 views
7

В моей OnCreate() я эту проверку:Показать PDF в Android

// 
// 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: open a pdf from my app using the built in pdf viewer упоминает, что Adobe не может иметь никаких публичных намерений, поэтому вышеуказанная проверка, очевидно, ничего не вернет.

Может ли кто-нибудь проверить, следует ли запускать 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); 

ответ

6

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

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

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

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

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

+1

Thanks - good idea – BJB

0

-Копируйте следующий код в своей деятельности. Вызовите функцию 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); 
    } 
}