安卓使用百度SDK完成OCR文字识别(二)

前言

上一篇完成了初步实现,当时说了要尽快加上相机拍照功能,于是乎,今天我又来啦。
上一篇的链接,已经不记得的小伙伴可以查看出处。

首先我还是对上篇进行一下部分的总结,可能误导了一部分人,我引入的ocr-ui包没有使用,确实,大家可以去掉,我本来没看包里什么内容就先引用过来了,后来才发现根本没用到0_0,其次类很简单也只有两个 Mainactivity和SimpleTextActivity,多余的东西可以去掉。

话不多说看代码

此次代码就只贴SimpleTextActivity部分内容了,因为这次的代码里面有很多注释内容,就是我尝试了种处理方法,但是没有必要,所以都注释了,但是这些代码在别的地方可能需要,我并没有删除,方便自己下次记忆。对于大家来说没有必要看这些乱七八糟的灰色注释,于是我节选有用的代码给大家分享一哈。

  //从相册选取图片
        findViewById(R.id.enhanced_photo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (hasPermission()) {
                    Intent intent = new Intent(Intent.ACTION_PICK, null);
                    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                    startActivityForResult(intent, REQUEST_ENHANCED_CODE_ALBUM);
                }
            }
        });
        //拍照选取图片
        findViewById(R.id.enhanced_take_photo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               takePhoto();
            }
        });

首先是两个点击事件,触发一切的开始。点击之后进行权限判断,没有权限的话打回!,拍照的权限放在takePhoto里了。

 /**
     * 执行拍照
     */
    private void takePhoto() {
        if (!hasPermission()) {
            return;
        }

        Intent intent = new Intent();
        intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        String path = Environment.getExternalStorageDirectory().getAbsolutePath();
        if (new File(path).exists()) {
            try {
                new File(path).createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        mTmpPath = path + "/temp.jpg";
        mTmpFile = new File(mTmpPath);
        mTmpFile.getParentFile().mkdirs();
        Uri imageUri;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String authority = getPackageName() + ".provider";
            imageUri = FileProvider.getUriForFile(SimpleTextActivity.this, authority, mTmpFile);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            List<ResolveInfo> resInfoList = this.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            for (ResolveInfo resolveInfo : resInfoList) {
                String packageName = resolveInfo.activityInfo.packageName;
                this.grantUriPermission(packageName, imageUri, FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_READ_URI_PERMISSION);
            }
        } else {
            imageUri = Uri.fromFile(mTmpFile);
        }
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, REQUEST_ENHANCED_CODE_CAMERA);
    }

其中mTmpFile和mTmpPath是成员变量,因为下面传递需要。

顺便把权限判断的请求和回调都展示一下

 	/**
     * 判断是否有权限
     * @return
     */
    private boolean hasPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, REQUEST_PERIMISSION_CODE);
            return false;
        }else {
            return true;
        }
    }

	@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERIMISSION_CODE) {
            if (grantResults.length > 0) {
                for (int grantResult: grantResults) {
                    if (grantResult == PackageManager.PERMISSION_DENIED) {
                        Toast.makeText(SimpleTextActivity.this, "拒绝权限将不能正常使用!", Toast.LENGTH_SHORT).show();
                        return;
                    }
                }
            }
        }
    }

然后在相机返回照片后的处理上,也是我当初不懂踩坑的地方。

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_ALBUM) {
            // 从相册返回的数据
            if (data != null) {
                // 得到图片的全路径
                Uri uri = data.getData();
                recSimpleText(getRealPathFromURI(uri));
            }
        } else if (requestCode == REQUEST_ENHANCED_CODE_ALBUM) {
            // 从相册返回的数据
            if (data != null) {
                // 得到图片的全路径
                Uri uri = data.getData();
                recEnhancedText(getRealPathFromURI(uri));
            }
        } else if (requestCode == REQUEST_ENHANCED_CODE_CAMERA) {
            //相机返回
            recEnhancedText(mTmpPath);
        }
    }

一开始我和上面一样判断data是否为空然后从里面取uri,但是一直都是空!后来很纳闷为什么,但是我到现在也不知道为什么data返回就是空,然后看了一下别人的做法,并没有从data里面获取uri!而是直接从上面的mTmpPath那直接获取路径,确实不用多此一举!回头想想也是,人傻了!

然后把provider的相关也贴一下,需要留意的是现在很多使用androidx,不用v4包了,照着网上的导肯定是要飚红的。

这段贴在AndroidManifest.xml的<application>

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.kxqin.ocrtest.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

filepaths.xml

<resources>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path
            name="camera_photos"
            path="." />
    </paths>
</resources>

不过我写完了provider之后,有前辈说并不需要,我也不懂这个不需要是指哪部分代码不需要还是说provider不需要?反正现在运行良好不报错就行哈哈哈。

对了 ,还有一个需要注意的是,都加上竖屏锁定吧,因为在将识别后的文字展示之后,切换横屏,文字就消失了。

		//设置竖屏
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

放在onCreate里。
关于布局页面,着实没啥看的。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SimpleTextActivity" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:id="@+id/take_a_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="普通文字识别-拍照"
            android:visibility="gone"/>

        <Button
            android:id="@+id/select_a_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="普通文字识别-相册"/>

        <Button
            android:id="@+id/enhanced_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="高精度文字识别-相册"/>

        <Button
            android:id="@+id/enhanced_take_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="高精度文字识别-拍照"/>

        <TextView
            android:id="@+id/info_text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
</ScrollView>

心满意足了不?那我去瞅瞅百度人脸识别了,虽无远大造轮志向,但是大佬们造好的轮子也得会用吧!

发布了5 篇原创文章 · 获赞 10 · 访问量 404

猜你喜欢

转载自blog.csdn.net/qq_39168470/article/details/103685885