我正在尝试将对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文件的引用之后)?
感谢。
答案 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);