2012-06-11 3 views
9

Я пытаюсь получить ссылку на файл, хранящийся в каталоге assets, в файл с именем myfile.pdf. Я попытался сделать это следующим образом:Android - Файл доступа из активов Просмотр PDF

File file = new File("android_assest/myfile.pdf); 
Log.d("myTag", "" + file.isFile()); 

Каким-то образом, я получаю false когда myfile.pdf делать существует в каталоге assets. Я проверил его с использованием getAssets().list("") и Log.d() каждого элемента в возвращаемом массиве.

Более того, я пытаюсь получить ссылку на файл PDF, а затем использовать любой просмотрщик PDF, который уже установлен на устройстве, для просмотра PDF.

Я думаю, что с момента предыдущего выпуска (получение ссылки на файл) возвращает false, то следующий код пропущено не удается:

Intent i = new Intent(Intent.ACTION_VIEW, 
    Uri.parse("file:///android_asset/myfile.pdf")); 
startActivity(i); 

Каждый имеет понятия, почему я не могу получить ссылку на файл ? и почему я не могу использовать уже установленный просмотрщик PDF для отображения PDF (после получения ссылки на файл PDF)?

Спасибо.

+0

Check [как к открытой-а -PDF сохраненного-либо-в-рес-сырьевые-или-активы-папка] (http://stackoverflow.com/questions/6491210/how-to-open-a-pdf-stored-either-in-res- raw-or-assets-folder) –

ответ

22

Как сказал Барак, вы можете скопировать его из активов во внутреннее хранилище или на SD-карту и открыть ее там, используя встроенные pdf-приложения.

Следующий фрагмент поможет вам. (Я обновил этот код на запись и чтение файлов из внутренней памяти.

Но я не рекомендую этот подход, потому что PDF-файл может быть больше 100mb в размере.

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

Также убедитесь, что при сохранении файла на внутреннюю память используется

openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); 

Тогда только другие приложения могут читать.

Проверьте следующий фрагмент.

package org.sample; 

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.res.AssetManager; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 

public class SampleActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     CopyReadAssets(); 

    } 

    private void CopyReadAssets() 
    { 
     AssetManager assetManager = getAssets(); 

     InputStream in = null; 
     OutputStream out = null; 
     File file = new File(getFilesDir(), "git.pdf"); 
     try 
     { 
      in = assetManager.open("git.pdf"); 
      out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE); 

      copyFile(in, out); 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
     } catch (Exception e) 
     { 
      Log.e("tag", e.getMessage()); 
     } 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(
       Uri.parse("file://" + getFilesDir() + "/git.pdf"), 
       "application/pdf"); 

     startActivity(intent); 
    } 

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

} 

Убедитесь включить

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

манифеста

+1

+1, я должен был разместить что-то подобное в моем ответе, поскольку OP специально спросил об открытии это с другими приложениями. – Barak

+0

Как записать файл во внутреннюю память (поскольку у меня нет SD-карты)? – EviatarS

+0

Отметьте обновленный ответ –

1

Вы не можете этого сделать. В apk нет структуры каталогов, это просто данные. Структура знает, как получить к ней доступ (getAssets), но вы не можете искать ее как файл в каталоге.

Вы можете открыть его в качестве входного потока ...

in = new BufferedReader(new InputStreamReader(activity.getAssets().open(myfile.pdf))); 

Или вы можете скопировать его из активов во внутренней памяти или на SD-карту и доступ к нему там.

+0

Но я могу сделать это для файлов HTML. Например, я могу получить доступ к файлам HTML в каталоге 'assets' и просматривать их в WebView. – EviatarS

+1

Послушал меня немного, но я понял почему. URL-адрес «файл: /// android_asset /» не указывает на конкретный каталог, он используется WebView для обращения к активам. Вытащил из [здесь] (http://stackoverflow.com/a/3281337/1105376) – Barak

+0

много tnx для улучшения моей перспективы :) – EviatarS

0

как говорят Vipul Shah, но в том случае, для внешнего.

import android.app.Activity; 
import android.content.Intent; 
import android.content.res.AssetManager; 
import android.net.Uri; 
import android.os.Environment; 
import android.os.Bundle; 
import android.util.Log; 
import java.io.BufferedOutputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 


public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     copyReadAssets(); 
    } 


    private void copyReadAssets() 
    { 
     AssetManager assetManager = getAssets(); 

     InputStream in = null; 
     OutputStream out = null; 

     String strDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "Pdfs"; 
     File fileDir = new File(strDir); 
     fileDir.mkdirs(); // crear la ruta si no existe 
     File file = new File(fileDir, "example2.pdf"); 



     try 
     { 

      in = assetManager.open("example.pdf"); //leer el archivo de assets 
      out = new BufferedOutputStream(new FileOutputStream(file)); //crear el archivo 


      copyFile(in, out); 
      in.close(); 
      in = null; 
      out.flush(); 
      out.close(); 
      out = null; 
     } catch (Exception e) 
     { 
      Log.e("tag", e.getMessage()); 
     } 

     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.parse("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "Pdfs" + "/example2.pdf"), "application/pdf"); 
     startActivity(intent); 
    } 

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

части изменения кода, как это:

out = new BufferedOutputStream(new FileOutputStream(file)); 

, прежде чем пример для PDFS, в случае примера .txt

FileOutputStream fos = new FileOutputStream(file); 
Смежные вопросы