2010-09-14 23 views
7

Nel mio onCreate() faccio questo controllo:Visualizza PDF in 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(); 
} 

Sul mio HTC Desire, questo non restituire una partita, anche se ho visualizzatore PDF di Adobe. Una risposta a questa domanda android: open a pdf from my app using the built in pdf viewer menziona che Adobe potrebbe non avere intenzioni pubbliche, quindi il controllo sopra riportato non restituirà ovviamente nulla.

Qualcuno può verificare se si dovrebbe essere in grado di avviare Acrobat da un intent, o c'è qualche altro metodo o visualizzatore PDF da usare.

Il caso di effettivo utilizzo sta scaricando copie delle fatture e la loro memorizzazione su storage locale utilizzando il codice come ad esempio:

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(); 

e quindi per mostrare

// 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); 

risposta

6

Collegare il telefono al vostro PC, inizio Eclipse e apri LogCat. Quindi scaricare un file PDF con il browser e aprirlo. Dovresti vedere una riga come (ho usato il desiderio di HTC):

09-14 17: 45: 58.152: INFO/ActivityManager (79): Attività di avvio: Intent {act = android.intent.action.VIEW dat = file: ///sdcard/download/FILENAME.pdf typ = application/pdf flg = 0x4000000 cmp = com.htc.pdfreader/.ActPDFReader}

Provare con un intento esplicito utilizzando le informazioni del componente. Documenti dice qui:

> componente - Specifica un nome esplicito di una classe di un componente da utilizzare per l'intento. Normalmente questo viene determinato osservando le altre informazioni nell'intento (l'azione, i dati/tipo e le categorie) e confrontando ciò con un componente che può gestirlo. Se questo attributo è impostato, nessuna valutazione viene eseguita e questo componente viene utilizzato esattamente così com'è. Specificando questo attributo, tutti gli altri attributi di Intent diventano facoltativi.

Al contrario, sarete legati al lettore htc. Ma potresti prima provare un intento implicito e se fallisce, prova l'intento esplicito come ripiego.

+1

Grazie - buona idea – BJB

0

-Copia il seguente codice nella tua attività. Chiama la funzione CopyReadAssets ("File_name.pdf") dalla funzione onCreate(). Inserire il file File_name.pdf nella cartella delle risorse.

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); 
    } 
} 
Problemi correlati