项目中遇到了使用第三方软件打开word,excel等文件的需求,最后是考虑用wps来打开这些软件。从网络上搜集了很多别人的代码,整理出来梳理一遍流程,做出一个小demo,实测可用。
限制:被打开的文档需要是存放在外部存储的(mnt目录下或者storage目录下),data目录下是内部存储,具体可以看看这篇博文https://blog.csdn.net/u012702547/article/details/50269639
直接上代码吧:
MainActivity的.xml文件:很简单就一个button用来点击触发事件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
在MainActivity里:File获取要打开的文件的路径,bundle传递wps打开的模式,稍后会有代码,FileOpen类执行具体打开操作
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File file = new File("/mnt/sdcard/计算公式整理v2.0.docx");
Bundle bundle = new Bundle();
bundle.putString(WpsModel.OPEN_MODE, WpsModel.OpenMode.NORMAL); // 打开模式
bundle.putBoolean(WpsModel.ENTER_REVISE_MODE, true); // 以修订模式打开文档
bundle.putBoolean(WpsModel.SEND_CLOSE_BROAD, true); // 文件关闭时是否发送广播
bundle.putBoolean(WpsModel.SEND_SAVE_BROAD, true); // 文件保存时是否发送广播
bundle.putBoolean(WpsModel.HOMEKEY_DOWN, true); // 单机home键是否发送广播
bundle.putBoolean(WpsModel.BACKKEY_DOWN, true); // 单机back键是否发送广播
bundle.putBoolean(WpsModel.SAVE_PATH, true); // 文件这次保存的路径
bundle.putString(WpsModel.THIRD_PACKAGE, WpsModel.PackageName.NORMAL); // 第三方应用的包名,用于对改应用合法性的验证
FileOpen.openFile(MainActivity.this,file);
}
});
MyMimeMap类:
public class MyMimeMap {
private static final HashMap<String, String> mapSimple = new HashMap<>();
/**
* 常用"文件扩展名—MIME类型"匹配表。
* 注意,此表并不全,也并不是唯一的,就像有人喜欢用浏览器打开TXT一样,你可以根据自己的爱好自定义。
*/
public static HashMap<String, String> getMimeMap() {
if (mapSimple.size() == 0) {
mapSimple.put(".3gp", "video/3gpp");
mapSimple.put(".apk", "application/vnd.android.package-archive");
m