项目需要调用wps来查看office文档,因此在网上查找相关资料,发现没有找到接口文档,只能查找到一部分,找了半天最后在官网上找到了APi文档,现在整理了下,写成博客,方便以后查看。
整理了文档上的一些字段名称:
package com.houjianbo.wpsdemo;
public class WpsModel {
public static final String OPEN_MODE = "OpenMode";// 打开文件的模式。
public static final String SEND_SAVE_BROAD = "SendSaveBroad";// 文件保存时是否发送广播。
public static final String SEND_CLOSE_BROAD = "SendCloseBroad";// 文件关闭时是否发送广播
public static final String THIRD_PACKAGE = "ThirdPackage";// 第三方的包名,关闭的广播会包含该项。
public static final String CLEAR_BUFFER = "ClearBuffer";// 关闭文件时是否请空临时文件。
public static final String CLEAR_TRACE = "ClearTrace";// 关闭文件时是否删除使用记录。
public static final String CLEAR_FILE = "ClearFile";// 关闭文件时是否删除打开的文件。
public static final String VIEW_PROGRESS = "ViewProgress";// 文件上次查看的进度。
public static final String AUTO_JUMP = "AutoJump";// 是否自动跳转到上次查看的进度。
public static final String SAVE_PATH = "SavePath";// 文件保存路径。
public static final String VIEW_SCALE = "ViewScale";// 文件上次查看的视图的缩放。
public static final String VIEW_SCALE_X = "ViewScrollX";// 文件上次查看的视图的X坐标。
public static final String VIEW_SCALE_Y = "ViewScrollY";// 文件上次查看的视图的Y坐标。
public static final String USER_NAME = "UserName";// 批注的作者。
public static final String HOMEKEY_DOWN = "HomeKeyDown";// 监听home键并发广播
public static final String BACKKEY_DOWN = "BackKeyDown";// 监听back键并发广播
public static final String ENTER_REVISE_MODE = "EnterReviseMode";// 以修订模式打开文档
public static final String CACHE_FILE_INVISIBLE = "CacheFileInvisible";// Wps生成的缓存文件外部是否可见
public class OpenMode {
public static final String NORMAL = "Normal";// 只读模式
public static final String READ_ONLY = "ReadOnly";// 正常模式
public static final String READ_MODE = "ReadMode";// 打开直接进入阅读器模式
// 仅Word、TXT文档支持
public static final String SAVE_ONLY = "SaveOnly";// 保存模式(打开文件,另存,关闭)
// 仅Word、TXT文档支持
}
public class ClassName {
public static final String NORMAL = "cn.wps.moffice.documentmanager.PreStartActivity2";// 普通版
public static final String ENGLISH = "cn.wps.moffice.documentmanager.PreStartActivity2";// 英文版
public static final String ENTERPRISE = "cn.wps.moffice.documentmanager.PreStartActivity2";// 企业版
}
public class PackageName {
public static final String NORMAL = "cn.wps.moffice_eng";// 普通版
public static final String ENGLISH = "cn.wps.moffice_eng";// 英文版
}
public class Reciver {
public static final String ACTION_BACK = "com.kingsoft.writer.back.key.down";// 返回键广播
public static final String ACTION_HOME = "com.kingsoft.writer.home.key.down";// Home键广播
public static final String ACTION_SAVE = "cn.wps.moffice.file.save";// 保存广播
public static final String ACTION_CLOSE = "cn.wps.moffice.file.close";// 关闭文件广播
}
}
</pre><div>我前面想调用的时候就在头疼这个不知道有哪些字段,这些字段该怎么用,所以整理了下贴了上来。接下来上调用代码,这么多字段我偶没有所有的添加,只是添加了可以编辑的模式:</div><pre class="html" name="code">package com.houjianbo.wpsdemo;
import java.io.File;
import com.houjianbo.wpsdemo.WpsModel.ClassName;
import com.houjianbo.wpsdemo.WpsModel.OpenMode;
import com.houjianbo.wpsdemo.WpsModel.PackageName;
import com.houjianbo.wpsdemo.WpsModel.Reciver;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button tv;
String stringPath;
MyBroadCastReciver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (Button) findViewById(R.id.editor);
stringPath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/test.docx";
System.out.println("StringPath:"+stringPath);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean flag = openFile(stringPath);
if (flag == true) {
Toast.makeText(MainActivity.this," 打开文件成功", 2000).show();
}else{
Toast.makeText(MainActivity.this, "打开文件失败", 2000).show();
}
}
});
}
boolean openFile(String path) {
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(WpsModel.OPEN_MODE, OpenMode.NORMAL); // 打开模式
bundle.putBoolean(WpsModel.SEND_CLOSE_BROAD, true); // 关闭时是否发送广播
bundle.putString(WpsModel.THIRD_PACKAGE, getPackageName()); // 第三方应用的包名,用于对改应用合法性的验证
bundle.putBoolean(WpsModel.CLEAR_TRACE, true);// 清除打开记录
// bundle.putBoolean(CLEAR_FILE, true); //关闭后删除打开文件
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setClassName(PackageName.NORMAL, ClassName.NORMAL);
File file = new File(path);
if (file == null || !file.exists()) {
System.out.println("文件为空或者不存在");
return false;
}
Uri uri = Uri.fromFile(file);
intent.setData(uri);
intent.putExtras(bundle);
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
System.out.println("打开wps异常:"+e.toString());
e.printStackTrace();
return false;
}
return true;
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
//unregisterReceiver(receiver);
}
}
如果你的文档编写完成了,你可以通过监听广播来处理一些问题:
package com.houjianbo.wpsdemo;
import com.houjianbo.wpsdemo.WpsModel.ClassName;
import com.houjianbo.wpsdemo.WpsModel.PackageName;
import com.houjianbo.wpsdemo.WpsModel.Reciver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;
public class MyBroadCastReciver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()) {
case Reciver.ACTION_BACK://返回键广播
System.out.println(Reciver.ACTION_BACK);
break;
case Reciver.ACTION_CLOSE://关闭文件时候的广播
System.out.println(Reciver.ACTION_CLOSE);
break;
case Reciver.ACTION_HOME://home键广播
System.out.println(Reciver.ACTION_HOME);
break;
case Reciver.ACTION_SAVE://保存广播
System.out.println(Reciver.ACTION_SAVE);
break;
default:
break;
}
}
}
这里的广播我是在清单文件里静态注册的,原来是想动态注册的,但是发现了些问题,先上代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.houjianbo.wpsdemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:enabled="true">
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.houjianbo.wpsdemo.MyBroadCastReciver">
<intent-filter>
<action android:name="com.kingsoft.writer.back.key.down" />
<action android:name="cn.wps.moffice.file.close" />
<action android:name="com.kingsoft.writer.back.key.down" />
<action android:name="com.kingsoft.writer.home.key.down" />
</intent-filter>
</receiver>
</application>
</manifest>
调用wps来查看和编辑office文档,我发现了个问题,在这里提出来:
有的版本,编辑完成文档以后点击关闭文档或者是返回键不会返回原来的应用而是回到了桌面,我问了一些人,他们说这个是wps版本的问题,以前的老版本没有问题,最近的新版本才出现了这样的问题,我思考过后发现不是有广播吗?那我接收到广播后自己重新打开应用,然后在intent里面传一个值,在程序里面判断是否是这个值如果是这个值那么在跳转到最开始打开wps的那个界面,这样就能恢复原状了,当我早上起来写好代码测试的时候突然发现应用程序开启了两次,这是怎么回事呢?难道又可以返回到第三方应用了,我把自己打开应用程序的代码注释掉后测试,果然又能返回原来的应用了,这个我真是无语了.....