前提・実現したいこと
OCRの機能を使い、レシートから文字を読み取るプログラムを作っている所です。
現時点の目標としては読み取られた文字列を1行ずつ読み取って改行するということです。(改行したことを示すために試しに「>>>」という記号を挿入します)
ですが、処理をするという部分において変数のエラーが出てしまい、処理が行われません。
発生している問題・エラーメッセージ
1行ずつ処理するプログラム↓ try { BufferedReader(ocr.text).use({ reader -> var line: String? = null while (reader.readLine().also({ line = it }) != null) { println(">>>" + line) } }) } catch (e: IOException) { e.printStackTrace() } ocr.text = ocr.text
その中のBufferdReader(ocr.text)の"ocr.text"部分がエラーであり、
Type mismatch.
Required:Reader!
Found:CharSequence!
と表示されます。
該当のソースコード
kotlin
1package com.example.recieptapp_android 2 3//import androidx.exifinterface.media.ExifInterface 4import android.app.Activity 5import android.content.Intent 6import android.graphics.Bitmap 7import android.graphics.BitmapFactory 8import android.graphics.Matrix 9import android.media.ExifInterface 10import android.os.Bundle 11import android.widget.RadioButton 12import androidx.appcompat.app.AppCompatActivity 13import com.example.recieptapp_android.OCRUtil 14import io.realm.Realm 15import kotlinx.android.synthetic.main.activity_main.* 16import kotlinx.android.synthetic.main.activity_yomitori.* 17import java.io.BufferedReader 18import java.io.IOException 19import java.io.StringReader 20 21class Yomitori : AppCompatActivity() { 22 23 private val REQUEST = 0 24 lateinit var ocrUtil: OCRUtil 25 26 private lateinit var realm: Realm 27 28 override fun onCreate(savedInstanceState: Bundle?) { 29 super.onCreate(savedInstanceState) 30 setContentView(R.layout.activity_yomitori) 31 ocrUtil = OCRUtil(applicationContext) 32 button.setOnClickListener { 33 val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) 34 intent.addCategory(Intent.CATEGORY_OPENABLE) 35 36 intent.type = "image/*" 37 startActivityForResult(intent, REQUEST) 38 } 39 } 40 41 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 42 super.onActivityResult(requestCode, resultCode, data) 43 44 if (requestCode == REQUEST) { 45 if (resultCode == Activity.RESULT_OK && data != null) { 46 var bitmapOrigin: Bitmap? = null 47 var bitmap: Bitmap? = null 48 49 val uri = data.data 50 val uri2 = data.data 51 val uri3 = data.data 52 try { 53 uri?.let { 54 contentResolver.openFileDescriptor(it, "r").use { parcelFileDescriptorNullable -> 55 parcelFileDescriptorNullable?.let { parcelFileDescriptor -> 56 val fileDescriptor = parcelFileDescriptor.fileDescriptor 57 bitmapOrigin = BitmapFactory.decodeFileDescriptor(fileDescriptor) 58 contentResolver.openInputStream(it).use { 59 it?.let { 60 val exifInterface = ExifInterface(it) 61 val orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED) 62 val degrees = when (orientation) { 63 1 -> { 0f } 64 3 -> { 180f } 65 6 -> { 90f } 66 8 -> { 270f } 67 else -> { 0f } 68 } 69 val matrix = Matrix() 70 71 val imageWidth = bitmapOrigin?.getWidth() ?: 0 72 val imageHeight = bitmapOrigin?.getHeight() ?: 0 73 matrix.setRotate(degrees, imageWidth.toFloat() / 2, imageHeight.toFloat() / 2) 74 bitmap = Bitmap.createBitmap(bitmapOrigin!!, 0, 0, imageWidth, imageHeight, matrix, true) 75 } 76 } 77 } 78 } 79 } 80 81 bitmap?.let { 82 image.setImageBitmap(it) 83 val langId = radio_group.getCheckedRadioButtonId() 84 val langText = findViewById<RadioButton>(langId).text.toString() 85 86 ocr.text = ocrUtil.getString(applicationContext, it, OCRUtil.Companion.LangType.getLangType(langText).str) 87 88 // 1行ずつ処理するプログラム↓ 89 try { BufferedReader(ocr.text).use({ reader -> 90 var line: String? = null 91 while (reader.readLine().also({ line = it }) != null) { 92 println(">>>" + line) 93 } 94 }) 95 } catch (e: IOException) { 96 e.printStackTrace() 97 } 98 99 ocr.text = ocr.text 100 101 } ?: run { 102 ocr.text = "bitmap is null" 103 } 104 } catch (e: IOException) { 105 e.printStackTrace() 106 } 107 } else { 108 ocr.text = "system error" 109 } 110 } 111 } 112} 113
試したこと
val langId = radio_group.getCheckedRadioButtonId()
val langText = findViewById<RadioButton>(langId).text.toString()
val LineText = ocr.text
ocr.text = ocrUtil.getString(applicationContext, it, OCRUtil.Companion.LangType.getLangType(langText).str) // 1行ずつ処理するプログラム↓ try { BufferedReader(LineText).use({ reader -> var line: String? = null while (reader.readLine().also({ line = it }) != null) { println(">>>" + line) } }) } catch (e: IOException) { e.printStackTrace() }
このように新たにLineTextという変数を使っておきかえてからtryの中に入れましたが、
上記のエラーと全く同じものが出てしまいました。
補足情報(FW/ツールのバージョンなど)
使っている開発環境はこちらになります。
Android Studio 3.6.3
あなたの回答
tips
プレビュー