如何在 Android 中实现文档扫描功能?

androidmobile developmentapps/applications

简介

许多 Android 应用都具备文档扫描功能,应用会拍摄文档照片,并根据需要裁剪文档图像,最终以图片形式显示。我们还可以为图片添加滤镜,例如黑白滤镜等等。本文将介绍如何在 Android 中实现文档扫描功能。

实现

我们将创建一个简单的应用,其中包含一个文本视图,用于显示应用标题。之后,我们将创建一个图像视图,用于显示扫描文档后裁剪的图像。应用启动时,我们会显示一个文档扫描器。该扫描器将扫描文档,并裁剪后的图像显示在图像视图中。现在让我们进入 Android Studio,创建一个新项目。

步骤 1:在 Android Studio 中创建新项目

按照下图所示,打开 Android Studio。在下图所示的界面中,点击"新建项目"创建一个新的 Android Studio 项目。

点击"新建项目"后,您将看到下图所示的界面。

在此界面中,我们只需选择"空 Activity",然后点击"下一步"。

点击"下一步"后,您将看到以下屏幕。

在此屏幕中,我们只需指定项目名称。然后,包名将自动生成。

注意- 请确保选择 Kotlin 作为语言。

指定所有详细信息后,点击"完成"以创建一个新的 Android Studio 项目。

项目创建完成后,我们将看到两个已打开的文件:activity_main.xml 和 MainActivity.kt 文件。

步骤 2:在 build.gradle 文件中添加文档扫描器依赖项。

导航到 app>build.gradle 文件(项目级别),并在 dependencies 部分添加以下依赖项。

implementation 'com.websitebeaver:documentscanner:1.0.0'

添加上述依赖项后,只需点击"立即同步"选项即可安装。

步骤 3:处理 activity_main.xml

导航至 activity_main.xml 文件。如果该文件不可见,请在左侧面板中导航至 app>res>layout>activity_main.xml 打开该文件。打开该文件后,将以下代码添加到其中。代码中添加了注释,以便您了解详细信息。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".MainActivity">
   <!-- creating a text view for displaying the heading of the application -->
   <TextView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_above="@id/idIVImage"
       android:layout_centerHorizontal="true"
       android:layout_margin="10dp"
       android:padding="4dp"
       android:text="Document Scanner Application"
       android:textAlignment="center"
       android:textColor="@color/black"
       android:textSize="20sp"
       android:textStyle="bold" />
   <!-- creating an image view for displaying the scanned document -->
   <ImageView
       android:id="@+id/idIVImage"
       android:layout_width="match_parent"
       android:layout_height="400dp"
       android:layout_centerInParent="true"
       android:layout_margin="10dp"
       android:padding="4dp" />
</RelativeLayout>

说明:在上面的代码中,我们创建了一个根布局,它使用相对布局 (Relative Layout)。在这个布局中,我们创建了一个文本视图 (TextView),用于显示应用程序的标题。之后,我们创建了一个图像视图 (ImageView),用于显示文档扫描完成后生成的图像。

步骤 4:使用 MainActivity.kt 文件

导航到 MainActivity.kt 文件。如果该文件不可见,请在左侧面板中导航到 app>res>layout>MainActivity.kt 打开它。打开文件后,将以下代码添加到其中。代码中添加了注释,以便您详细了解其含义。

package com.example.kotlintestapplication
import android.graphics.BitmapFactory
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.animation.AnimationUtils
import android.widget.ImageView
import android.widget.Toast
import com.websitebeaver.documentscanner.DocumentScanner
class MainActivity : AppCompatActivity() {
   // 下面这行代码创建了一个用于图像视图的变量。
   private lateinit var docImageView: ImageView
   // 下面这行代码创建了一个用于文档扫描仪的变量并对其进行了初始化。
   private val documentScanner = DocumentScanner(
       this,
       // 下面这行代码调用一个方法来显示裁剪后的图像结果。
       { croppedImageResults ->
           // 下面这行代码获取裁剪后的图像,并将该图像显示在我们的图像视图中。
           // 下面这行代码设置了图像视图的图像位图。
           docImageView.setImageBitmap(
               // 下面这行调用 decode file 函数,从裁剪后的图像结果中解码文件,并将其显示在图像视图中。
               BitmapFactory.decodeFile(croppedImageResults.first())
           )
       },
       {
           // 下面这行显示错误信息。
               errorMessage ->
           // 显示错误提示信息。
           Toast.makeText(this,"Fail to get document : "+ errorMessage,Toast.LENGTH_SHORT).show()
       },
       {
           // 当用户取消文档扫描时,将调用以下方法。
           Toast.makeText(this,"Document Scanning has been cancelled by the user. ",Toast.LENGTH_SHORT).show()
       }
   )
   // 下面这行代码调用了默认的创建方法来初始化我们的变量。
   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)
       // 下面这行代码初始化了图像视图的变量。
       docImageView = findViewById(R.id.idIVImage)
       // 下面这行调用 start scan 方法来启动文档扫描。
       documentScanner.startScan()
   }
}

说明:在上面的代码中,我们首先创建了图像视图的变量。之后,我们创建了一个文档扫描仪的变量并对其进行初始化。在这个文档扫描仪变量中,我们调用了三个不同的方法。

第一个方法会在文档扫描仪获取到结果时被调用。在这个方法中,我们会将从文档扫描仪获得的结果设置到我们创建的图像视图中。

第二个方法会在文档扫描仪出现错误时被调用。在这个方法中,我们只是简单地显示一个 Toast 消息来显示错误信息。

第三个方法会在用户取消文档扫描时被调用。在这种情况下,我们也会显示"用户已取消扫描"的 Toast 消息。

现在我们来看看 onCreate 方法。这是每个 Android 应用程序的默认方法。当应用程序视图被创建时,就会调用此方法。在这个方法中,我们设置内容视图,也就是名为 activity_main.xml 的布局文件,以便从该文件中设置 UI。在 onCreate 方法中,我们使用 activity_main.xml 文件中指定的 id 初始化图像视图变量。之后,我们调用 start scan 方法来启动文档扫描仪,以便扫描文档。

添加以上代码后,只需点击顶部栏中的绿色图标即可在移动设备上运行我们的应用程序。

注意:请确保您已连接到真机或模拟器。

输出

结论

在本文中,我们探讨了如何在 Android 应用程序中实现文档扫描功能。


相关文章