安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件

Tbs是
官方的接入文档有点坑 ,也在网上找了好几个博客 内容都是一样的

这里我总结下Tbs的使用 和 踩到的坑吧

1.引入SDK, 有两种方式

  1. 去官网下载它的SDK :https://x5.tencent.com/tbs/sdk.html
安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件_第1张图片
  1. 直接使用Gradle拉取
    implementation 'com.tencent.tbs.tbssdk:sdk:43903'
    api 'com.tencent.tbs.tbssdk:sdk:43903'
安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件_第2张图片

2.把jar文件 copy到 libs目录下,如果使用Gradle拉取则跳过这一步

  1. 复制jar包

安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件_第3张图片

  1. 右键添加jar包

安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件_第4张图片

3.配置安卓的权限

  1. 在AndroidManifest.xml 中添加,

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission
    android:name="android.permission.INSTALL_PACKAGES"
    tools:ignore="ProtectedPermissions" />
    <!-- 硬件加速对X5视频播放非常重要,建议开启 -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SETTINGS" />
<uses-permission
    android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<uses-permission
    android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />
  1. AndroidManifest.xml 在6.0以后系统 是不行的,还需要配置 FileProvider,在application中加入如下:
<provider
    android:name="com.tencent.smtt.utils.FileProvider"
    android:authorities="${applicationId}"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/x5webview_file_paths" />
</provider>

<service
    android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
    android:label="dexopt"
    android:process=":dexopt" />

并且创建x5webview_file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="sdcard" path="."/>
</paths>

安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件_第5张图片

4.初始化X5 和 WebView

1.新键一个初始化类

/*
 * @DateTime 2020/6/30 9:37
 * @Author zwb
 * @Des 初始化X5
 * */
public class X5App {
    public void initX5app(Context context){
        //设置非wifi条件下允许下载X5内核
        QbSdk.setDownloadWithoutWifi(true);
        
        //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
            @Override
            public void onViewInitFinished(boolean arg0) { 
            //x5內核初始化完成的回调,true表x5内核加载成功,否则表加载失败,会自动切换到系统内核。
                Log.d("app", " 内核加载 " + arg0);
            }
            @Override
            public void onCoreInitFinished() { 
            }
        };
        
        //x5内核初始化接口
        QbSdk.initX5Environment(context,  cb);
    }
}

2.调用初始化类进行初始化,我是在启动app时就调用了
initX5Environment 的 onViewInitFinished 回调 一定要为True 如果是False则失败
之前我就是因为这里一直为false导致无法使用 这里有个坑 一定要确保为True!!!!!

    @Override
    public void onCreate() {
        super.onCreate();
//        调用初始化X5
        new X5App().initX5app(getApplicationContext());
    }

安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件_第6张图片

1.创建X5WebView类

/*
 * @DateTime 2020/6/24 10:27
 * @Author zwb
 * @Des 继承x5webview 做一些设置
 * */
public class X5WebView extends WebView {
    private WebViewClient client = new WebViewClient() {
        /**
         * 防止加载网页时调起系统浏览器
         */
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    };
    @SuppressLint("SetJavaScriptEnabled")
    public X5WebView(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
        this.setWebViewClient(client);
        initWebViewSettings();
        this.getView().setClickable(true);
    }
    private void initWebViewSettings() {
        WebSettings mWebSettings = this.getSettings();
        mWebSettings.setJavaScriptEnabled(true);
        mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        mWebSettings.setAllowFileAccess(true);
        mWebSettings.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
        mWebSettings.setSupportZoom(true);
        mWebSettings.setBuiltInZoomControls(true);
        mWebSettings.setUseWideViewPort(true);
        mWebSettings.setSupportMultipleWindows(true);
        mWebSettings.setAppCacheEnabled(true);
        mWebSettings.setDomStorageEnabled(true);
        mWebSettings.setGeolocationEnabled(true);
        mWebSettings.setAppCacheMaxSize(Long.MAX_VALUE);
        mWebSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
        mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    }
    public X5WebView(Context arg0) {
        super(arg0);
        setBackgroundColor(85621);
    }
}

2.使用X5WebView

activity_x5_tbs_web_view_page.xml

	<!--创建视图 ,这里布局 使用com.example.demo.x5.X5WebView 替代 WebView-->
    <com.example.demo.x5.X5WebView
        android:id="@+id/mX5WebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/title_row"
        tools:ignore="MissingClass">
    </com.example.demo.x5.X5WebView>

X5TbsWebViewPage.java
注意:这里面的导包 要导com.tencent.smtt.sdk下的包

import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
/*
 * @DateTime 2020/6/29 16:51
 * @Author zwb
 * @Des X5内核WebView页面
 * */
public class X5TbsWebViewPage extends AppCompatActivity {
    private X5WebView  mX5WebView ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_x5_tbs_web_view_page);
        mX5WebView = (X5WebView) findViewById(R.id.mX5WebView);
        mX5WebView.loadUrl("https://x5.tencent.com/");
    }
    /*返回上个页面  */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            if (mX5WebView != null && mX5WebView.canGoBack()) {
                mX5WebView.goBack();
                return true;
            } else {
                return super.onKeyDown(keyCode, event);
            }
        }
        return super.onKeyDown(keyCode, event);
    }
    @Override
    protected void onDestroy() {
        //释放资源
        if (mX5WebView != null){
            mX5WebView.destroy();
        }
        super.onDestroy();
    }
}

5.使用Tbs的文件服务 打开PDF,WORD,EXCLE等文件

  1. 创建activity activity_x5_tbs_file_service_page.xml
	创建一个容器
    <RelativeLayout
        android:id="@+id/X5TbsView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/title_row"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@color/colorPrimary"
        />
  1. X5TbsFileServicePage.java 在Activity中 实现 TbsReaderView.ReaderCallback
    文件预览页面只能是生成的,
    这里我把它生成到 容器里去 mRelativeLayout = findViewById(R.id.X5TbsView);
/*
 * @DateTime 2020/6/29 16:51
 * @Author zwb
 * @Des X5内核文件预览页面
public class X5TbsFileServicePage extends AppCompatActivity implements TbsReaderView.ReaderCallback {

    private String tbsReaderTemp = Environment.getExternalStorageDirectory() + "/TbsReaderTemp";
    TbsReaderView mTbsReaderView;
    RelativeLayout mRelativeLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_x5_tbs_file_service_page);
        // 绑定容器
        mRelativeLayout = findViewById(R.id.X5TbsView);
        FileModel fileModel = new FileModel();
        fileModel.setPath("/storage/emulated/0/demo/word.docx");
        displayFile(fileModel);
    }
    
    public void displayFile(FileModel fileModel) {
        mTbsReaderView = new TbsReaderView(this,this);
        //增加下面一句解决没有TbsReaderTemp文件夹存在导致加载文件失败
        String bsReaderTemp = tbsReaderTemp;
        File bsReaderTempFile =new File(bsReaderTemp);

        if (!bsReaderTempFile.exists()) {
            Log.d("print","文件不存在准备创建/TbsReaderTemp!!");
            boolean mkdir = bsReaderTempFile.mkdir();
            if(!mkdir){
                Log.d("print","创建/TbsReaderTemp失败!!!!!");
            }
            Toast.makeText(this,"文件不存在!",Toast.LENGTH_SHORT).show();
        }
        mRelativeLayout.addView(mTbsReaderView,new RelativeLayout.LayoutParams(-1,-1));
        Bundle bundle = new Bundle();
        bundle.putString("filePath",fileModel.getPath());
        bundle.putString("tempPath", tbsReaderTemp);
        boolean result = mTbsReaderView.preOpen(getFileType("word.docx"), false);
        Log.d("print","查看文档---"+result);
        if (result) {
            mTbsReaderView.openFile(bundle);
        }else{

        }
    }

    private String getFileType(String paramString) {
        String str = "";

        if (TextUtils.isEmpty(paramString)) {
            Log.d("print", "paramString---->null");
            return str;
        }
        Log.d("print", "paramString:" + paramString);
        int i = paramString.lastIndexOf('.');
        if (i <= -1) {
            Log.d("print", "i <= -1");
            return str;
        }

        str = paramString.substring(i + 1);
        Log.d("print", "paramString.substring(i + 1)------>" + str);
        return str;
    }

    @Override
    public void onCallBackAction(Integer integer, Object o, Object o1) {
        Log.i("触摸监听:"," ");
    }

    /**
     * 返回上个页面
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return super.onKeyDown(keyCode, event);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mTbsReaderView != null) {
            mTbsReaderView.onStop();
            mTbsReaderView.destroyDrawingCache();
        }
    }

}
  1. 使用 我这里是跳转页面,FileModel 是一个实体类 自己定义自己要的参数即可
X5TbsFileServicePage x5TbsFileServicePage =new X5TbsFileServicePage();
FileModel fileModel = new FileModel();
fileModel.setPath("/storage/emulated/0/demo/pdf.pdf");
x5TbsFileServicePage.displayFile(fileModel);

Intent intent = new Intent();
intent.setClass(MainActivity.this, X5TbsFileServicePage.class);
startActivity(intent);

到此,结束

你可能感兴趣的:(Android,android)