我使用以下代码打开我在工作应用模块中放置的特定文件...
private void openPDF(String filename) {
File file = new File(Environment.getExternalStorageDirectory(), filename);
Uri path = Uri.fromFile(file);
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
try {
startActivity(pdfIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(MainActivity.this, "There is no PDF file.",
Toast.LENGTH_SHORT).show();
}
}
我进入try-statement
并调用startActivity(...)
方法。我得到一个对话框,选择我要打开文件的应用程序,但是当我选择应用程序时,Android会打开应用程序,在应用程序中显示正确的文件名,但之后会自动关闭PDF应用程序显示。
在用户决定实际“关闭”之前,如何保持PDF文件处于打开状态?
顺便说一句,我没有收到任何错误消息,也没有我能看到的警告。 PDF应用程序刚关闭。我也尝试用Google Custom Tabs
打开文件,因为我已经在我的应用程序中使用了该文件,但它没有打开PDF文件(正如我预期的那样)
为了实施StreamProvider
,我决定为StreamProvider
创建一个简单的扩展程序,该扩展程序将读取将委派工作以打开pdf-path
文件的唯一标记asset
这是代码......
public class PdfProvider extends StreamProvider {
// Special xml path tag that will work for PDFs (or any asset really)
private static final String PDF_TAG = "pdf-path";
@Override
protected String getUriPrefix() { return null; }
@Override
protected StreamStrategy buildStrategy(Context context, String tag, String name, String path, HashMap<String, String> attrs) throws IOException {
if (PDF_TAG.equals(tag)) {
super.buildStrategy(context, "asset", name, path, attrs);
}
return super.buildStrategy(context, tag, name, path, attrs);
}
}
另外,我对noCompress
文件和路径元数据gradle
进行了添加...
<paths>
<pdf-path name="resume" path="resume/resume.pdf"/>
</paths>
我对如何实际使用PdfProvider
感到困惑。文档似乎有asset
逻辑作为第二个想法,StreamProvider
的演示代码有点复杂的额外逻辑使得更难理解提供者方面。
答案 0 :(得分:1)
唉,不,不。这是您的开发机器上的项目。在~15亿台设备上不是external storage。我只是在app模块中拖放文件。不在src文件夹中。这是对的吗?
如果您的长期目标是从外部存储中实际显示PDF,请将其放在设备或模拟器的外部存储设备上。使用Android Studio 2.x模拟器,您可以将PDF拖放到模拟器窗口中,但这会将其放在外部存储的assets/
目录中,而不是根目录。
如果您的长期目标是显示使用您的应用打包的PDF,请将PDF放入模块的main
源集app/src/main/assets/
中(例如,FileProvider
Android Studio项目)。然后,要么:
使用my StreamProvider
直接从那里提供PDF,或
编写代码以将PDF复制到文件系统的某个位置(可能是internal storage),然后使用{{1}}来提供它,正如我在this sample app
<中所展示的那样/ LI>