我已经实现了一个自定义内容提供程序,将pdf文档作为ParcelFileDescriptor提供。文件存储在标记为PRIVATE的本地存储中。根据URI,文档将被移交给选定的pdf应用程序。
这适用于除adobe reader之外的所有PDF Viewer应用程序。有人可以确认adobe reader不能与内容提供商合作吗?代码如下:
下载文件后:
private void loadDocInReader(String doc) throws ActivityNotFoundException, Exception
{
Uri uri = Uri.parse(doc);
logger.debug("PDF Application ID is: " + pdfAppID);
if (this.pdfAppID != null && this.pdfAppID.length() > 0)
{
boolean pdfApplicationIsInstalled = checkPDFApplicationIsInstalled(this.pdfAppID);
if(pdfApplicationIsInstalled) {
Intent intent = new Intent();
intent.setPackage(pdfAppID);
intent.setData(uri);
intent.setType("application/pdf");
startActivity(intent);
}
else {
logger.error("Please install Adobe Reader first!");
}
}
else {
Intent intent = new Intent();
intent.setData(uri);
intent.setType("application/pdf");
startActivity(intent);
}
}
除adobe reader之外,所有其他pdf查看器应用程序都会调用此方法:
public class DocumentProvider extends ContentProvider
{
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException
{
File file = null;
try {
file = new File(uri.getPath());
logger.debug("Delivering ParcelFileDescriptor for path: " + file.getPath());
return ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
} catch (FileNotFoundException e) {
logger.error("Error loading Document: ",e);
} finally {
if(file.exists()) {
file.delete();
}
}
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
}
Adobe Reader始终声明:“文件路径无效”
提前致谢!!!凯。
答案 0 :(得分:1)
据我所知,Adobe Reader对于从ContentProviders读取文件有不稳定的支持。在我的例子中,调用openFile方法并返回一个有效的ParcelFileDescriptor,但Adobe Reader报告“无法打开文档”。我的内容提供商可以使用“Drive PDF Viewer”,“PDF Reader”和“qPDF Reader”,这些都是Play商店中的顶级PDF查看器。
Adobe Reader可以使用Gmail内容提供商在Gmail中打开PDF文件附件,但我无法确定其工作原理或原因。
答案 1 :(得分:0)
我也遇到了Adobe Acrobat Reader的问题,因为我没有使用我的自定义提供程序,最终让它运行起来。我的问题是app-local文件空间中的文件是加密的,并且它们的名称是经过哈希处理的。所以Uri
就像是:
content://my.app.provider/08deae8d9ea9bc0b84f94475d868351830e9f7e7
它适用于我测试的任何PDF查看器应用程序,除了Adobe Reader。今天我最后一次尝试向Content Uri添加.pdf
扩展程序(这绝对不是必需的),当Adobe调用openFile()
函数时,我删除了扩展程序。 VOILA,它有效!!!
<强>更新强>
由于_display_name
查询还包含ContentProvider
扩展程序!!!
请确保您的query(Uri, String[], String, String[], String)
列也返回.pdf
列。
注意强>
使用 Adobe Acrobat Reader 版本进行测试 16.3