2012-05-07 3 views
0

Я пытаюсь передать sdcard pdf из моей необработанной папки, чтобы открыть его с намерением по умолчанию.Передача pdf из активов в SDCard

Когда я его открываю, мне говорят, что pdf поврежден. так как я не совсем понимаю, как работает поток, я думаю, что проблема возникает там.

final String extStorageDirectory = Environment 
         .getExternalStorageDirectory().toString(); 
       final String festivalDirectory_path = extStorageDirectory 
         + Constants.PDF_STORAGE_PATH; 
       File pdfOutputFile = new File(festivalDirectory_path, "/"); 
       if (pdfOutputFile.exists() == false) { 
        pdfOutputFile.mkdirs(); 
       } 
       File pdfFile = new File(pdfOutputFile, nameOfThePdf); 

       try { 
        InputStream in = getResources().openRawResource(R.raw.blablublo); 

        FileOutputStream out = new FileOutputStream(pdfFile); 
        byte[] buffer = new byte[1024]; 
        int bufferLength = 0; 
        while ((bufferLength = in.read(buffer)) > 0) { 
         out.write(buffer, 0, bufferLength); 
        } 
        out.close(); 
       } catch (Exception e) { 
        Log.e("tag", e.getMessage()); 
       } 
       Uri path = Uri.fromFile(pdfFile); 
//    Uri path = Uri.parse(Constants.SPLASH_URI + R.raw.cartecannotpdf); 
       Intent intent = new Intent(Intent.ACTION_VIEW); 
       intent.setDataAndType(path, "application/pdf"); 
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent); 

Надеюсь, что кто-то может мне помочь!

ТНХ

Renaud

+0

Вы не _copying_ файл. Взгляните на http://stackoverflow.com/a/4530294/1321873 – Rajesh

+0

thx, я просмотрел эту ссылку и, соответственно, изменил свой код, но мне нужно пропустить что-то еще –

+0

В чем проблема? Попробуйте изолировать проблему - проверьте, может ли скопированный файл быть прочитан (например, загрузив его на компьютер). – Rajesh

ответ

0

Ну, это выглядит, как ваше решение наполовину закончена.

InputStream inputStream = assetManager.open("cartecanotpdf.pdf"); - Создает поток, который вы можете использовать для чтения всех данных из файла PDF в папке с ресурсами.

File file = new File(dir, "cartecannotpdf.pdf"); - Это просто создает ссылку на местоположение на SDCARD, где будет находиться файл.

Те части, которые вам не хватает, фактически копируют байты из входного потока в выходной поток. На данный момент файл SDCARD либо не существует, либо просто пустая оболочка (у нее нет данных), поэтому ваше намерение будет жаловаться на ее повреждение.

Это QA, который имеет полное решение для вас. How to copy files from 'assets' folder to sdcard?

Редактировать: Кроме того, я не уверен, что вам нужно поместить файл в свою папку с ресурсами или оставить его в папке RAW. Я всегда работал с файлами в папке с моими активами. Убедитесь, что вы действительно получаете файл при вызове assetManager.open (...)

+0

ОК, извините за задержку, я пытался изменить свой код, как вы оба сказали, он все еще не работает. Думаю, я думаю, что теперь я хорошо заполняю файл sdcard. Я не вижу другого способа прочитать pdf-файл, кроме этого –

+0

1) Попробуйте вызвать 'out.flush();' before' out.close() '2) Каковы размеры файлов оригинального и скопированного PDF-файла hte? – Gophermofur

+0

Попробуйте изменить 'FileOutputStream out = new FileOutputStream (pdfFile);' to 'OutputStream out = new FileOutputStream (pdfFile);' – Gophermofur