2010-09-14 27 views
7

Trong onCreate của tôi() Tôi làm việc kiểm tra này:Hiện PDF trong 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(); 
} 

On HTC Desire của tôi, điều này không trả về một trận đấu, mặc dù tôi có xem Adobe PDF. Câu trả lời cho câu hỏi này android: open a pdf from my app using the built in pdf viewer đề cập rằng Adobe có thể không có bất kỳ Mục đích công khai nào, vì vậy việc kiểm tra ở trên rõ ràng sẽ không trả lại gì.

Bất kỳ ai cũng có thể xác minh xem bạn có thể khởi chạy Acrobat từ mục đích hay không hoặc có phương pháp hoặc trình xem PDF nào khác để sử dụng.

Các trường hợp sử dụng thực tế là tải bản sao hoá đơn và lưu trữ chúng trên bộ nhớ cục sử dụng mã như:

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

và sau đó để hiển thị

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

Trả lời

6

Kết nối điện thoại với bạn PC, khởi động Eclipse và mở LogCat. Sau đó tải xuống tệp PDF bằng trình duyệt và mở tệp đó. Bạn sẽ thấy một dòng như (Tôi đã sử dụng mong muốn của HTC):

09-14 17: 45: 58.152: INFO/ActivityManager (79): Bắt đầu hoạt động: Intent {act = android.intent.action.VIEW dat = file: ///sdcard/download/FILENAME.pdf typ = application/pdf flg = 0x4000000 cmp = com.htc.pdfreader/.ActPDFReader}

Hãy di chuyển với mục đích rõ ràng bằng cách sử dụng thông tin thành phần. Documents nói ở đây:

> phần - Chỉ định một tên rõ ràng của một lớp thành phần để sử dụng cho mục đích. Thông thường, điều này được xác định bằng cách xem xét các thông tin khác trong mục đích (hành động, dữ liệu/loại và danh mục) và kết hợp với một thành phần có thể xử lý nó. Nếu thuộc tính này được thiết lập thì không có đánh giá nào được thực hiện và thành phần này được sử dụng chính xác như là. Bằng cách chỉ định thuộc tính này, tất cả các thuộc tính Intent khác trở thành tùy chọn.

Nhược điểm là bạn sẽ bị ràng buộc với trình đọc htc. Nhưng bạn có thể thử một ý định ngầm trước và nếu điều đó không thành công, hãy thử mục đích rõ ràng như một dự phòng.

+1

Cảm ơn - ý tưởng hay – BJB

0

-Sao chép mã sau trong hoạt động của bạn. Gọi hàm CopyReadAssets ("File_name.pdf") từ hàm onCreate(). Đặt tệp File_name.pdf trong thư mục nội dung.

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); 
    } 
} 
Các vấn đề liên quan