9

我正在尝试检索对存储在assets目录中的文件的引用到名为myfile.pdf. 我试图这样做:

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

false不知何故,当目录myfile.pdf中存在do时,我得到了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 文件的引用之后)?

谢谢。

4

3 回答 3

24

正如 Barak 所说,您可以将其从资产复制到内部存储或 SD 卡,然后使用内置的 pdf 应用程序从那里打开它。

关注 Snippet 将对您有所帮助。(我已更新此代码以写入和读取内部存储中的文件。

但我不推荐这种方法,因为 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" />

在清单中

于 2012-06-11T13:36:37.443 回答
1

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

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

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

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

于 2012-06-11T13:25:11.040 回答
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);
于 2015-05-28T21:40:52.873 回答