Skip to content

集成扫描功能

本节介绍如何在 Android 端集成扫描扩展模块,并在完整阅读器(UI Extensions)场景中拉起扫描 UI。

说明

扫描功能为独立模块,不包含在 UI Extensions 组件中。使用前请先完成以下准备:

步骤 1:添加依赖

  1. 将扫描相关 AAR 拷贝到 app/libs/ 目录。

    参考:集成 SDK - 拷贝 AAR 到工程

  2. app/build.gradle 中添加对应依赖。

    参考:集成 SDK - 启用常见扩展能力的依赖

步骤 2:初始化并拉起扫描 UI

在需要触发扫描时,使用以下代码初始化扫描模块并拉起扫描 UI:

java
import com.foxit.pdfscan.PDFScanManager;

// 初始化扫描模块
long framework1 = 0;
long framework2 = 0;
PDFScanManager.initializeScanner(this.getApplication(), framework1, framework2);

// 初始化压缩模块
long compression1 = 0;
long compression2 = 0;
PDFScanManager.initializeCompression(this.getApplication(), compression1, compression2);

// 初始化成功后拉起扫描 UI
if (PDFScanManager.isInitializeScanner() && PDFScanManager.isInitializeCompression()) {
    PDFScanManager pdfScanManager = PDFScanManager.instance();
    pdfScanManager.showUI(MainActivity.this);
}

关于水印

initializeScannerinitializeCompression 的第 2、3 个参数设置为 0 时,扫描结果会带水印。如需去除水印,请通过 福昕开发中心 申请试用或获取下载指引,或联系福昕技术支持团队与销售代表获取对应授权。

步骤 3:参考实现

本节提供一个完整示例,基于"功能完整的 PDF 阅读器(UI Extensions)"增加一个浮动扫描按钮,点击后拉起扫描 UI。

注意

使用前请先将 fx_floatbutton_scan.xmlsamples/complete_pdf_viewer/app/src/main/res/drawable/ 拷贝到您工程的 app/src/main/res/drawable/

[MainActivity.java]
java
package com.foxit.pdfreader;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.foxit.pdfscan.PDFScanManager;
import com.foxit.sdk.PDFViewCtrl;
import com.foxit.sdk.common.Constants;
import com.foxit.sdk.common.Library;
import com.foxit.uiextensions.UIExtensionsManager;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import static com.foxit.uiextensions.utils.AppFileUtil.getSDPath;

public class MainActivity extends AppCompatActivity {

    private PDFViewCtrl pdfViewCtrl = null;
    private UIExtensionsManager uiExtensionsManager = null;
    private static final int REQUEST_ALL_FILES_ACCESS_PERMISSION = 222;
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static final String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    // sn 和 key 的值分别来自 SDK 包中的 rdk_sn.txt 和 rdk_key.txt
    private static String sn = " ";
    private static String key = " ";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 初始化 SDK
        int errorCode = Library.initialize(sn, key);
        if (errorCode != Constants.e_ErrSuccess)
            return;

        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

        // 初始化 PDFViewCtrl 和 UIExtensionsManager
        pdfViewCtrl = new PDFViewCtrl(this);
        pdfViewCtrl.setAttachedActivity(this);

        uiExtensionsManager = new UIExtensionsManager(this.getApplicationContext(), pdfViewCtrl);
        uiExtensionsManager.setAttachedActivity(this);
        uiExtensionsManager.onCreate(this, pdfViewCtrl, savedInstanceState);
        pdfViewCtrl.setUIExtensionsManager(uiExtensionsManager);

        // 构建布局:阅读器视图 + 扫描浮动按钮
        RelativeLayout rootView = new RelativeLayout(getApplicationContext());
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        rootView.addView(uiExtensionsManager.getContentView(), layoutParams);
        rootView.addView(getScanButton());
        setContentView(rootView);

        // 请求文件访问权限
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            if (!Environment.isExternalStorageManager()) {
                Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
                intent.setData(Uri.parse("package:" + getApplicationContext().getPackageName()));
                startActivityForResult(intent, REQUEST_ALL_FILES_ACCESS_PERMISSION);
                return;
            }
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            int permission = ContextCompat.checkSelfPermission(this.getApplicationContext(),
                    Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permission != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
                return;
            }
        }

        // 打开文档
        String path = Environment.getExternalStorageDirectory().getPath() + "/FoxitSDK/Sample.pdf";
        uiExtensionsManager.openDocument(path, null);
    }

    // 创建扫描浮动按钮
    private View getScanButton() {
        ImageView ivScan = new ImageView(this);
        ivScan.setImageResource(R.drawable.fx_floatbutton_scan);
        ivScan.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!PDFScanManager.isInitializeScanner()) {
                    long framework1 = 0;
                    long framework2 = 0;
                    PDFScanManager.initializeScanner(
                            MainActivity.this.getApplication(), framework1, framework2);
                }

                if (!PDFScanManager.isInitializeCompression()) {
                    long compression1 = 0;
                    long compression2 = 0;
                    PDFScanManager.initializeCompression(
                            MainActivity.this.getApplication(), compression1, compression2);
                }

                if (PDFScanManager.isInitializeScanner()
                        && PDFScanManager.isInitializeCompression()) {
                    PDFScanManager pdfScanManager = PDFScanManager.instance();
                    pdfScanManager.showUI(MainActivity.this);
                } else {
                    Toast.makeText(getApplicationContext(),
                            "扫描模块未授权,请联系福昕获取授权。",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });

        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);
        lp.bottomMargin = 150;
        lp.rightMargin = 50;
        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        ivScan.setLayoutParams(lp);
        return ivScan;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
            @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == REQUEST_EXTERNAL_STORAGE
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            String path = Environment.getExternalStorageDirectory().getPath()
                    + "/FoxitSDK/Sample.pdf";
            uiExtensionsManager.openDocument(path, null);
        } else {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ALL_FILES_ACCESS_PERMISSION) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                if (Environment.isExternalStorageManager()) {
                    String path = Environment.getExternalStorageDirectory().getPath()
                            + "/FoxitSDK/Sample.pdf";
                    uiExtensionsManager.openDocument(path, null);
                }
            }
        } else {
            if (pdfViewCtrl != null) {
                pdfViewCtrl.handleActivityResult(requestCode, resultCode, data);
            }
        }
    }

    @Override
    public void onStart() {
        if (uiExtensionsManager != null) uiExtensionsManager.onStart(this);
        super.onStart();
    }

    @Override
    public void onStop() {
        if (uiExtensionsManager != null) uiExtensionsManager.onStop(this);
        super.onStop();
    }

    @Override
    public void onPause() {
        if (uiExtensionsManager != null) uiExtensionsManager.onPause(this);
        super.onPause();
    }

    @Override
    public void onResume() {
        if (uiExtensionsManager != null) uiExtensionsManager.onResume(this);
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        if (uiExtensionsManager != null) uiExtensionsManager.onDestroy(this);
        super.onDestroy();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (uiExtensionsManager != null)
            uiExtensionsManager.onConfigurationChanged(this, newConfig);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (uiExtensionsManager != null && uiExtensionsManager.onKeyDown(this, keyCode, event))
            return true;
        return super.onKeyDown(keyCode, event);
    }
}