首页 > 解决方案 > 使用 Gluon-mobile ShareService 从 android 上的应用程序打开 PDF 时出现异常

问题描述

在我的应用程序中,我想向用户显示帮助文件 (PDF)。帮助文件与资源一起发布,并在第一次请求时复制到公共存储。这行得通!我可以看到文件并在设备上使用 Adob​​e 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)
...

对于这两种情况,抛出的异常看起来几乎相同。

标签: androidpdfgluon-mobile

解决方案


推荐阅读