Android - 从资产\ PDF显示访问文件

时间:2012-06-11 13:17:10

标签: java android android-intent assets

我正在尝试将对assets目录中存储的文件的引用检索到名为myfile.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文件的引用之后)?

感谢。

3 个答案:

答案 0 :(得分:24)

正如巴拉克所说,您可以将资产从资产中复制到内部存储或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)

你不能这样做。 apk中没有目录结构,只是数据。框架知道如何访问它(getAssets),但您不能将其作为目录中的文件来查找。

您可以将其作为输入流打开...

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

或者您可以将其从资产中复制到内部存储或SD卡并在那里访问。

答案 2 :(得分: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);