2012-06-11 13 views
9

Estoy tratando de recuperar una referencia a un archivo almacenado en el directorio assets en un archivo llamado myfile.pdf. He tratado de hacerlo de la siguiente manera:Android - Acceder al archivo desde assets PDF display

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

De alguna manera, me sale false cuando el myfile.pdf hacer existe en el directorio assets. Lo verifiqué usando getAssets().list("") y Log.d() cada elemento en la matriz devuelta.

Más de lo cual, estoy tratando de obtener una referencia a un archivo PDF y luego utilizar cualquier visor de PDF, que ya está instalado en el dispositivo, para ver el PDF.

supongo que desde la edición anterior (recuperar una referencia al archivo) devuelve false luego falla el siguiente código cortó:

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

Cualquier persona tiene una idea de por qué no soy capaz de recuperar una referencia al archivo ? y ¿por qué no puedo usar el visor de PDF ya instalado para mostrar un PDF (después de recuperar una referencia al archivo PDF)?

Gracias.

+0

Comprobar [How-to-abierta una -pdf-stored-either-in-res-raw-or-assets-folder] (http://stackoverflow.com/questions/6491210/how-to-open-a-pdf-stored-either-in-res- carpeta raw-or-assets) –

Respuesta

22

Como dijo Barak, puede copiarlo de sus activos en el almacenamiento interno o en la tarjeta SD y abrirlo desde allí usando aplicaciones pdf integradas.

Siguiendo a Snippet te ayudará. (He actualizado el código para escribir y leer archivos de almacenamiento interno.

pero yo no recomendaría este enfoque porque el archivo PDF puede contener más de 100 MB de tamaño.

Así que no es recomendada para salvar ese enorme archivo en el almacenamiento interno

también asegúrese de que al guardar el archivo en la memoria interna se utiliza

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

Entonces sólo otras aplicaciones puedan leerlo.

Verificar el siguiente fragmento.

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

} 

Asegúrese de incluir

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

en el manifiesto

+1

+1, debería haber publicado algo similar en mi respuesta ya que el OP me preguntó específicamente sobre la apertura con otras aplicaciones. – Barak

+0

¿Cómo puedo escribir el archivo en el almacenamiento interno (ya que no tengo una tarjeta SD)? – EviatarS

+0

Ver respuesta actualizada –

1

No puede hacerlo así. No hay una estructura de directorio en una apk, solo son datos. El marco sabe cómo acceder a él (getAssets), pero no puede buscarlo como un archivo en un directorio.

Puede abrirlo como un flujo de entrada ...

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

O se puede copiar a los activos de la memoria interna o la tarjeta SD y acceder a ella allí.

+0

Pero puedo hacerlo para archivos HTML. Por ejemplo, puedo acceder a archivos HTML dentro del directorio 'assets' y verlos en' WebView'. – EviatarS

+1

Me llevó un poco de búsqueda, pero descubrí por qué. La URL "file: /// android_asset /" no apunta a un directorio en particular, solo es usado por WebView para direccionar activos. Saqué eso de [aquí] (http://stackoverflow.com/a/3281337/1105376) – Barak

+0

many tnx para mejorar mi perspectiva :) – EviatarS

0

como dicen Vipul Shah, pero en el caso de la externa.

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

piezas de cambio de código como éstas:

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

el ejemplo es para antes de PDFs, en caso de que el ejemplo .txt

FileOutputStream fos = new FileOutputStream(file); 
Cuestiones relacionadas