项目总结之Android读取office文件遇到的坑

        在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"。

   <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

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文件的兼容问题了。

猜你喜欢

转载自blog.csdn.net/qq_35642849/article/details/81387381
今日推荐