过去几个小时我们一直试图解决这个问题,最后决定我们应该恢复到StackOverflow。
这里 -
我们有一个应用程序将PDF文件从服务器下载到应用程序的缓存目录,然后使用数据包管理器打开它。当然,它会通过grantUriPermission()
为所有可用包提供读(和写)权限。
虽然它在大多数设备上运行良好,但今天我们遇到了一个安装了POLARIS Office 5作为默认PDF查看器的设备。
每当我们打开文件时,Polaris只会显示一条消息“无法打开此文档”。
我应该说,当尝试通过Acrobat Reader打开文件时,效果很好。 此外,当我们将文件从缓存目录复制到外部目录(使用Android的文件管理器),然后手动在Polaris中打开它时效果很好。
我们会放弃它,但由于Polaris是许多设备上的默认查看器,我们真的很乐意解决这个问题。
这是代码 -
public void onDownloadDone(String filepath) {
// Set a file object that represents the downloaded file
File file = new File(filepath);
// Set an intent for the external app
Intent intent = new Intent(Intent.ACTION_VIEW);
// Get mime type of the downloaded file
String fileExtension = MimeTypeMap.getFileExtensionFromUrl(filepath);
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExtension);
intent.setType(mimeType);
// Look for installed packges according to the file's mime type
PackageManager pm = context.getPackageManager();
Uri contentUri = FileProvider.getUriForFile(context, "myapp.fileprovider", file);
// Set the file uri in the intent
intent.setData(contentUri);
// Give permissions to the file to each external app that can open the file
List<ResolveInfo> activities = pm.queryIntentActivities(intent, 0);
for (ResolveInfo externalApp: activities){
String packageName = externalApp.activityInfo.packageName;
context.grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
// Start the activities (or launch the menu) if any activity exists
if (activities.size() > 0){
context.startActivity(intent);
} else {
System.out.println("Warning!!! No app for file " + filepath);
}
}
非常感谢!
答案 0 :(得分:6)
我有完全相同的问题。 PDF文件将以 ezPDF 和 Adobe 打开,但不会与 Polaris Viewer 打开。 您必须使用以下内容设置数据和类型:
intent.setDataAndType(uri, "application/pdf");
而不是使用:
intent.setType("application/pdf");
intent.setData(uri);
对我来说,现在> Polaris 正好可以使用以下内容:
Uri uri = FileProvider.getUriForFile(MyApplication.getContext(), MyApplication.getContext().getPackageName() + ".myfileprovider", destFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "application/pdf");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);