在Android中读取office文件有两种,一种是在本软件内部读取(通过webView或者通过腾讯TBS),另外一种是通过Android调用第三方软件读取。根据项目需求,两种方法都做到了读取文件的效果,最终因为终端的网络限制而选取了第二种方式。是时候总结一下在这过程中所遇到的坑了。
首先是腾讯的TBS。
可以在腾讯TBS官网中下载官网的DEMO里面会有对应的jar,添加依赖即可,如果手机是64位的,可能在最后程序运行的时候提示不支持64位的手机,我的做法是在资源文件下增加文件夹,替换so文件,如图
不过那两个文件都是空的。
//配置so文件
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
关于使用过程中出现的初始化失败的问题,可以在程序加载之前对x5进行初始化。还有一个软件是“TBS工具集”可以检测本机的TBS内核加载情况。最好用x5之前移动终端中有QQ、微信或者QQ浏览器等腾讯产品(应该是会本地加载一个TBS文件夹)。
//初始化X5内核
QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
@Override
public void onCoreInitFinished() {
//x5内核初始化完成回调接口,此接口回调并表示已经加载起来了x5,有可能特殊情况下x5内核加载失败,切换到系统内核。
}
@Override
public void onViewInitFinished(boolean b) {
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
Log.e("print", "加载内核是否成功:" + b);
}
});
其他的坑,在论坛中都可以找到对应的答案。
再说说第二种读取office文件的方法,就是调用第三方的软件,其实这个方法本身很简单,也很容易实现,如下两段代码即可,以word为例:
Intent intent = OpenFiles.getWordFileIntent(path);
startActivity(intent);
在OpenFiles文件中:
public static Intent getWordFileIntent(String Path) {
File file = new File(Path);
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri,"application/msword");
return intent;
}
本身这就可以实现了,但是在后来产品测试的时候,通过安卓的不同版本做测试,发现在安卓6.0以下的版本没有出现异常,但是在安卓7.0及以上版本上测试的时候,发现并没有反应,程序跑不了。后来发现这是版本兼容的问题,归根结底是Uri的格式不对,在安卓7.0之后,为了安全Uri对地址做了些许改变,为了解决问题,在网上找到了一些方法,总结如下:
1、在AndroidManifest中添加provide标签,注意在authorities中的 android:authorities="${applicationId}.provider"不是 android:authorities="${applicationId}.fileprovider"。
2、对版本判断,对不同版本的file路径对应的Uri进行解析
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri uri = FileProvider.getUriForFile(context, getPackageName() + ".provider", filess);
Intent intent = OpenFiles.getWordFileIntent(uri);
startActivity(intent);
}
// content://com.example.administrator.xiangmuliucheng.provider/external_files/yzt/wendang/asdfg.docx
else {
Uri uri = Uri.fromFile(filess);
Intent intent = OpenFiles.getWordFileIntent(uri);
startActivity(intent);
}
// sdcard/test1为本地Word文件的路径
} catch (Exception e) {
//没有安装第三方的软件会提示
Toast toast = Toast.makeText(FileTree_Third.this, "没有找到打开该文件的应用程序", Toast.LENGTH_SHORT);
toast.show();
}
这其中对于OpenFile文件中读取word方法的参数进行了改变,这次传参的Uri。
//android获取一个用于打开Word文件的intent
public static Intent getWordFileIntent(Uri uri) {
// File file = new File(Path);
Intent intent = new Intent("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= 24){
intent. addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
// Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/msword");
return intent;
我这里同样对版本进行了判断,这样的话就解决了Android通过第三方软件读取office文件的兼容问题了。