快速集成金山WPS专业版
最近由于公司的老项目,需要把之前的WPS换成专业版的WPS,所以开始踩坑金山WPS,确实有几个血坑,在此和大家分享一下:
话不多说,先上金山官方链接http://mo.wps.cn/pc-app/office-pro.html
第一步 :打开链接往下滑,选择Android 依次下载下来。
第一个是官方提供的开发文档,
第二个是使用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 。
以上如有问题,可以直接留言。