集成扫描功能
本节介绍如何在 Android 端集成扫描扩展模块,并在完整阅读器(UI Extensions)场景中拉起扫描 UI。
步骤 1:添加依赖
将扫描相关 AAR 拷贝到
app/libs/目录。在
app/build.gradle中添加对应依赖。
步骤 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);
}
关于水印
initializeScanner 和 initializeCompression 的第 2、3 个参数设置为 0 时,扫描结果会带水印。如需去除水印,请通过 福昕开发中心 申请试用或获取下载指引,或联系福昕技术支持团队与销售代表获取对应授权。
步骤 3:参考实现
本节提供一个完整示例,基于"功能完整的 PDF 阅读器(UI Extensions)"增加一个浮动扫描按钮,点击后拉起扫描 UI。
注意
使用前请先将 fx_floatbutton_scan.xml 从 samples/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);
}
}