美文网首页三方
快速集成金山WPS专业版

快速集成金山WPS专业版

作者: 码个蛋 | 来源:发表于2019-07-15 23:21 被阅读3次

    最近由于公司的老项目,需要把之前的WPS换成专业版的WPS,所以开始踩坑金山WPS,确实有几个血坑,在此和大家分享一下:
    话不多说,先上金山官方链接http://mo.wps.cn/pc-app/office-pro.html
    第一步 :打开链接往下滑,选择Android 依次下载下来。

    image.png
    第一个是官方提供的开发文档,
    第二个是使用Demo(兼容eclipse)
    第三个是WPS专业版的软件(这个软件是收费的,但是可以试用一个月)
    打开Demo可以看到以下目录,这里主要要用到框选中的几个package
    image.png
    这里大致介绍一下这几个package,
    agent:就是提供AIDL通信的,
    broad:则是提供一些广播用来监听手机的back,home键和一些加为他的监听
    client:则是打开文件之后的一些操作
    util:这个就没什么好说的,主要是一些工具类,和常量类

    然后我们先把这些package拷贝到自己项目中的一个package中,然后记得把mainface中的文件也一并拷贝过来,这里主要有两个服务和四个广播比较重要

     <!--wps start 注册的server-->
            <service android:name="yh.com.wpstestdemo.openwps.client.MOfficeClientService" >
                <intent-filter>
                    <action android:name="yh.com.wpstestdemo.openwps.client.OfficeServiceClient" />
                </intent-filter>
            </service>
    
            <service android:name="yh.com.wpstestdemo.openwps.agent.AgentMessageService" >
                <intent-filter>
                    <action android:name="yh.com.wpstestdemo.openwps.agent.OfficeServiceAgent" >
                    </action>
                </intent-filter>
            </service>
            <!--wps end 注册的server-->
    
            <!--wps start 部分操作的广播-->
            <receiver android:name="yh.com.wpstestdemo.openwps.broad.CloseReceiver" >
                <intent-filter>
                    <!--<action android:name="cn.wps.moffice.file.close" /> -->      <!-- 该条是就的广播intent-filter,不推荐使用 -->
                    <action android:name="cn.wps.moffice.broadcast.AfterClosed" />
                </intent-filter>
            </receiver>
            <receiver android:name="yh.com.wpstestdemo.openwps.broad.SaveReceiver" >
                <intent-filter>
                    <!-- <action android:name="cn.wps.moffice.file.save" />-->      <!-- 该条是就的广播intent-filter,不推荐使用 -->
                    <action android:name="cn.wps.moffice.broadcast.AfterSaved" />
                </intent-filter>
            </receiver>
            <receiver android:name="yh.com.wpstestdemo.openwps.broad.BackKeyReceiver" >
                <intent-filter>
                    <action android:name="com.kingsoft.writer.back.key.down" />
                </intent-filter>
            </receiver>
            <receiver android:name="yh.com.wpstestdemo.openwps.broad.HomeKeyReceiver" >
                <intent-filter>
                    <action android:name="com.kingsoft.writer.home.key.down" />
                </intent-filter>
            </receiver>
            <!--  end  wps 部分操作的广播-->
    

    AgentMessageService非常重要,是为了提供AIDL通信的,下面这个OfficeServiceClientImpl其实就是一个AIDL中接收器(stub)的实现类,内部初始化了一个非常重要的监听OfficeEventListenerImpl,如果忘记拷贝这个package的话,在后续打开的时候就会出现问题


    image.png

    这里我们只需要拷贝到自己的项目中就行了,唯一记住的一点就是在OfficeServiceAgentImpl中 有一个成员变量JSON_DATA,这个是实现多应用打开wps的一个功能,wps默认给我提供了一个通信的key,但是这里我们一般使用自己的包名会比较好,这里我直接把文档中的原文粘贴出来


    image.png
    一定记住这两个地方不能配置错,不然会收不到打开后的回调,也就不能对打开的文件做后续的操作了

    这些配置完成之后,再回到demo里面 打开下面这个类


    image.png

    这个里面有详细的使用规则,这里我就不多说了代码如下

     public void  openFileWps(String fileName,String path){
            docPath = path;
            File file = new File (path);
            if (!file.exists()){
                return;
            }
            if (Util.IsWPSFile(file))
            {
                //如果是wps能打开的文件,则打开
                if (Define.WPS_OPEN_AIDL.equals(settingPreference.getSettingParam(Define.WPS_OPEN_MODE, "")))
                {
                    if (Util.isPDFFile(file.getAbsolutePath())) {
                        openPDFDoc();
                    } else if (Util.isPptFile(file.getAbsolutePath())) {
                        openPresentation();
                    } else if (Util.isExcelFile(file.getAbsolutePath())) {
                        openWorkBook();
                    } else {
                        openDocument();
                    }
                }
            }
            else
            {//不是wps文件则让用户选择
                Intent intent = new Intent();
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setAction(Intent.ACTION_VIEW);
                String type = Util.getMIMEType(file);
                intent.setDataAndType(Uri.fromFile(file), type);
                mWeakReference.get().startActivity(intent);
            }
        }
    

    以上几个方法记住一并拷贝过来,到此为止,就可以正常的打开部分文件了,没错,是部分文件,经过测试,PDF的文件打开会直接崩溃,.PPT文件打开没问题,但是退出会学出现一个wps软件异常的问题。(本人觉得这两个问题是金山自己的问题,因为用他们官方提供的demo一样也存在此类问题)

    下面我主要介绍一下什么是不落地打开文件,不落地就是说打开文件的时候,不需要写到SD卡中,直接通过内存中的流或者byte[]来打开,接下来说一下我在使用金山WPS实现不落地打开文件时遇到的坑
    首先贴出金山提供的不落地方案:


    image.png

    这个onOpenFile是在OfficeEventListenerImpl类面的,打开文件后会回调到onOpenFile(String path, OfficeOutputStream output )我们可以通过这两个参数做相应的处理,很明显,我们在调用openFile的时候,必须传给WPS一个path, 那么这里我的方案是,根据文件名,在SD卡下创建一个同名的文件,在onOpenFile()方法里面 根据path删除这个文件,然后把网络中的流或者byte[] 通过一个static的成员变量保存在内存中,在onOpenFile()的时候,通过该方法的第二个参数将bytes写出就完成了不落地方案。
    在参照这种模式实现不落地的时候,需要注意几点:
    1,在Mainface中注册服务和广播的时候,一定要注意包名写全:


    image.png

    如果你是简写的,可能会出现回调不回来的问题(本人亲自踩坑)

    2,在创建同名空文件的时候,一定要注意,文件名是否进行了加密,如果进行了加密,那么创建的文件一定要是加密之后的铭文,不然这里会出现在跳转到wps的时候,直接崩溃。


    image.png

    这行代码走完之后,你会在手机上看到“暂不支持查看,请期待后续版本”,看到这里,很容易觉得是wps版本的问题。(这也是WPS的一个坑)

    等所有的问题你都解决完了,你会发现.doc不落地打开是没问题的,打开PPT也没问题,但是关闭打开的ppt时,但是关闭了打开的ppt时,又出现了报错:


    image.png

    经过测试,其实这个问题跟不落地没半毛钱的关系,使用金山的demo也存在这个问题。

    3,当你不落地打开.xslx的时候,又出现了一个问题:


    image.png

    这个问题还算是稍微提示得比较明显,这里需要把文件全部写到本地,然后也不能在onOpenFile里面进行删除操作,需要在broadcast里面做删除操作,个人觉得这里也是比较坑的

    4,当你打开.txt文件的时候,不落地打开和本地打开是有区别的,不落地打开有部分内容会被wpsAPP的titlebar遮挡住,需要手动点击一点,才可以看到这个内容效,果如下:
    https://s31.aconvert.com/convert/p3r68-cdx67/5p0nw-kwzef.gif

    以上如有问题,可以直接留言。

    相关文章

      网友评论

        本文标题:快速集成金山WPS专业版

        本文链接:https://www.haomeiwen.com/subject/jlmokctx.html