我正在使用以下代码从设备上的内部存储中下载和读取PDF文件。
我可以将文件成功下载到目录:
data/data/packagename/app_books/file.pdf
但是我无法使用像Adobe Reader这样的PDF阅读器应用程序来阅读文件。
//Creating an internal dir;
File mydir = getApplicationContext().getDir("books", Context.MODE_WORLD_READABLE);
try {
File file = new File(mydir, outputFileName);
URL downloadUrl = new URL(url);
URLConnection ucon = downloadUrl.openConnection();
ucon.connect();
InputStream is = ucon.getInputStream();
FileOutputStream fos = new FileOutputStream(file);
byte data[] = new byte[1024];
int current = 0;
while ((current = is.read(data)) != -1) {
fos.write(data, 0, current);
}
is.close();
fos.flush();
fos.close();
isFileDownloaded=true;
} catch (IOException e) {
e.printStackTrace();
isFileDownloaded = false;
System.out.println(outputFileName + " not downloaded");
}
if (isFileDownloaded)
System.out.println(outputFileName + " downloaded");
return isFileDownloaded;
PackageManager packageManager = getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("application/pdf");
List list = packageManager.queryIntentActivities(testIntent,
PackageManager.MATCH_DEFAULT_ONLY);
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
File fileToRead = new File(
"/data/data/com.example.filedownloader/app_books/Book.pdf");
Uri uri = Uri.fromFile(fileToRead.getAbsoluteFile());
intent.setDataAndType(uri, "application/pdf");
startActivity(intent);
} catch (Exception ex) {
Log.i(getClass().toString(), ex.toString());
Toast.makeText(MainActivity.this,
"Cannot open your selected file, try again later",
Toast.LENGTH_SHORT).show();
}
一切正常,但读者应用程序说“文件路径无效”。
答案 0 :(得分:1)
您的路径仅对您的应用有效。将文件放在其他应用可以“看到”它的位置。使用GetExternalFilesDir()或getExternalStorageDirectory()。
答案 1 :(得分:0)
请注意在Context.getDir(String name, int mode)
创建的目录中创建的文件,他们只能由您自己的应用程序访问;您只能设置整个目录的模式,而不能设置单个文件的模式。
所以你可以使用Context.openFileOutput(String name, int mode)
。我正在重复使用您的代码作为示例:
try {
// Now we use Context.MODE_WORLD_READABLE for this file
FileOutputStream fos = openFileOutput(outputFileName,
Context.MODE_WORLD_READABLE);
// Download data and store it to `fos`
// ...
您可能需要查看本指南:Using the Internal Storage。
答案 2 :(得分:0)
确保您拥有存储权限,如棉花糖设备支持等,然后按照以下步骤操作
private void CopyReadAssets()
{
AssetManager assetManager = getContext().getAssets();
FileInputStream in = null;
FileOutputStream out = null;
File sdcard = Environment.getExternalStorageDirectory();
File dir = new File(Environment.getExternalStorageDirectory()+File.separator+ "A_level");
File dir2;
if (dir.exists() && dir.isDirectory()){
Log.e("tag out", ""+ dir);
}else {
dir.mkdir();
Log.e("tag out", "not exist");
}
File file = new File(dir, mTitle+".pdf");
try
{
Log.e("tag out", ""+ file);
out = new FileOutputStream(file);
in = new FileInputStream (new File(mPath));
Log.e("tag In", ""+ in);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e)
{
Log.e("tag out", ""+ out);
Log.e("tag In", ""+ in);
Log.e("tag", e.getMessage());
Log.e("tag", ""+file);
Log.i("tag",""+sdcard.getAbsolutePath() + "A_level");
}
}
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);
}
}
答案 3 :(得分:0)
如果您希望保持文件应用程序的具体,您可以使用PdfRenderer用于Lollipop及以上版本。谷歌和youtube上的精彩教程运作良好。您正在使用的方法是一种存储PDF文件的安全方式,该文件只能从应用程序内部读取。没有像Adobe PDF Reader这样的外部应用程序甚至不能看到该文件。我花了很多时间进行了搜索,但是通过使用这个网站,尤其是youtube,我找到了一个解决方案。