android - 使用 Gluon-mobile ShareService 从 android 上的应用程序打开 PDF 时出现异常
问题描述
在我的应用程序中,我想向用户显示帮助文件 (PDF)。帮助文件与资源一起发布,并在第一次请求时复制到公共存储。这行得通!我可以看到文件并在设备上使用 Adobe Acrobat 打开它。
但是在调用 Gluon-mobile ShareService 时出现异常: 尝试调用虚拟方法 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)'在空对象引用上
我在 Android 9.1 上使用 ShareService 3.8.6。
这是代码:
private void onHelp(ActionEvent event)
{
Optional<StorageService> oss = Services.get(StorageService.class);
if(oss.isPresent())
{
StorageService ss = oss.get();
Optional<File> of = ss.getPublicStorage("");
if(of.isPresent())
{
File parentfolder = of.get();
if(parentfolder != null && parentfolder.exists() && parentfolder.canWrite())
{
File publicPdf = new File(parentfolder.getAbsolutePath(), "helpfile.pdf");
if(!publicPdf.exists())
{
InputStream origPdf = getClass().getClassLoader().getResourceAsStream("files/helpfile.pdf");
try {
FileOutputStream fos = new FileOutputStream(publicPdf);
while (origPdf.available() > 0) {
fos.write(origPdf.read());
}
fos.close();
origPdf.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
try {
//EDIT:
System.out.println(publicPdf.getAbsolutePath() + " exists: "
+ publicPdf.exists()+ " canRead: "+ publicPdf.canRead());
Services.get(ShareService.class).ifPresent(service -> {
service.share("application/pdf", publicPdf);
});
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
}
编辑:我在 ShareService 和 adb logcat 显示之前添加了 System.out.println
03-02 17:30:24.119 20119 20146 I System.out: /storage/emulated/0/helpfile.pdf exists: true canRead: true
编辑2:
logcat 输出带有System.setProperty("com.gluonhq.charm.down.debug","true")
set plus
e.printStackTrace()
in catch(Exception e)
after service.share(...)
。
I System.out: /storage/emulated/0/helpfile.pdf exists: true canRead: true
I AndroidShareService: File to share: /storage/emulated/0/helpfile.pdf
I AndroidShareService: Application name provider: com.myapp.ui.javafx.fileprovider
W myapp.ui.javaf: Class android.support.v4.content.FileProvider failed lock verification and will run slower.
W System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
W System.err: at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:584)
W System.err: at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:558)
W System.err: at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
W System.err: at com.gluonhq.charm.down.plugins.android.AndroidShareService.share(AndroidShareService.java:105)
W System.err: at com.gluonhq.charm.down.plugins.android.AndroidShareService.share(AndroidShareService.java:82)
W System.err: at com.myapp.ui.javafx.GMMain.lambda$onHelp$1(GMMain.java:280)
W System.err: at com.myapp.ui.javafx.GMMain$$Lambda$3.accept(Unknown Source:8)
W System.err: at java.util.Optional.ifPresent(Optional.java:155)
W System.err: at com.myapp.ui.javafx.GMMain.onHelp(GMMain.java:279)
...
访问私有存储时的 logcat 输出Optional<File> of = ss.getPrivateStorage();
:
I System.out: /data/user/0/com.myapp.ui.javafx/files/helpfile.pdf exists: true canRead: true
I AndroidShareService: File to share: /data/user/0/com.myapp.ui.javafx/files/helpfile.pdf
I AndroidShareService: Application name provider: com.myapp.ui.javafx.fileprovider
W myapp.ui.javaf: Class android.support.v4.content.FileProvider failed lock verification and will run slower.
W System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
W System.err: at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:584)
W System.err: at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:558)
W System.err: at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
W System.err: at com.gluonhq.charm.down.plugins.android.AndroidShareService.share(AndroidShareService.java:105)
W System.err: at com.gluonhq.charm.down.plugins.android.AndroidShareService.share(AndroidShareService.java:82)
W System.err: at com.myapp.ui.javafx.GMMain.lambda$onHelp$1(GMMain.java:280)
W System.err: at com.myapp.ui.javafx.GMMain$$Lambda$3.accept(Unknown Source:8)
W System.err: at java.util.Optional.ifPresent(Optional.java:155)
W System.err: at com.myapp.ui.javafx.GMMain.onHelp(GMMain.java:279)
...
对于这两种情况,抛出的异常看起来几乎相同。
解决方案
推荐阅读
- asp.net - 将事件侦听器附加到 Microsoft.IdentityModel.Logging
- r - 使用连接的粘贴向量重新分配列名
- python - 您如何为文本文件编号,但在再次计数之前还要重复每个数字 x 次?
- c# - Telerik 下拉控件不允许我从下拉列表中选择项目
- azure - 使用 Azure Powershell cmdlet New-AzVM 创建 Windows 10 VM
- laravel - 为什么 Laravel 每次请求都会生成一个新会话?
- shell - 从日志文件中过滤掉 uniq 行
- excel - 为 If 语句引用“onclick”事件 - IE 自动化
- pdf - pdf文本不对齐
- firebase - 使用 orderByKey 在 Firebase 数据库中搜索值不起作用 DailogFlow