Edited at

ナンプレ解答アプリ「ナンプレ自動解答」(Android版)とその実装機能の紹介

よちよちサンデープログラミングトップへ


はじめに

「ナンプレ自動解答」(Android版)は、ナンプレ(数独)の問題を写真に撮ると、その問題を自動的に解き、答えを示すアプリです。

そのため、例えばナンプレの懸賞本の大量の問題を解く時間を短縮したり、解答が載っていない問題の答えを確認したり、あるいは自作した問題が正しく答えを導き出せるものであるかどうかを確認したりするのに使えます。

ナンプレ自動解答画面

本記事では、ナンプレ自動解答で実装している各機能をTipsとして解説します。


  • アプリのダウンロードは、こちら

  • プロジェクトソースの入手は、こちら

  • iOS版「ナンプレ自動解答」の解説記事は、こちら


開発・実行環境

ナンプレ自動解答は、以下の環境で開発・実行しています。


  • 開発環境 : macOS、Android Studio(3.3~3.4)、Java

  • 実行環境 : Android 5.0以上


アプリの構成の概要

ナンプレ自動解答は、2つの画面を持ちます。1つは、ナンプレの問題(9x9のマス目や各マスの数字)を表示し、数字を編集するため操作を受け付ける独自ビューと、機能を呼び出す複数のボタンと、広告(AdMob)が表示されます。もう1つは、ナンプレの問題を写真に撮るためのCamera2 APIを使ったカメラ画面です。

本アプリでは、カメラで撮影した写真から、ナンプレの問題(9x9のマス目)を切り出し、さらにその各マスの数字を認識し、解答処理を行う対象データとして取り込みますが、マス目の切り出しにはOpenCVを使い、数字の認識にはOCRライブラリ(tess-two)を使っています。解答処理は、オリジナルのヒューリスティックアルゴリズムです。


実装している機能

本アプリを実現するために、以下の機能を実装しており、それぞれTipsとして解説していきます。

※リンクをクリックするとTips解説記事に飛びます。リンクされていない項目は、記事を鋭意作成中です。


  • AdMobを組み込む(AdMob SDK)

  • 広告を表示する(AdMob SDK)

  • OpenCVライブラリを組み込む

  • 写真から、四角形領域を切り出す(OpenCV)

  • OCRライブラリを組み込む(tess-two)

  • OCR機能で文字を認識する(tess-two)

  • アセットに格納しているデータをファイルに書き出す

  • 独自ビューを生成する(FrameLayout、View)

  • 独自ビューに描画する(View)

  • 画面レイアウト決定後に、ビューを再描画する(FrameLayout)

  • 独自カメラ機能を実装する(Camera2)

  • ユーザからカメラの利用許可を得る

  • 画面(アクティビティ)間でデータをやり取りする(Intent)

  • 画像(Bitmap)をファイルに保存する(FileOutputStream)

  • 画像(Bitmap)の一部を切り出す

  • 非同期処理(別スレッド処理)をする(AsyncTaskLoader)

  • 処理待ちのインジケータ(くるくる)を表示する・消す(ProgressBar)

  • アプリのバージョン番号を取得する(PackageManager)

  • メニューを表示する(Menu)

  • ボタンの形状をカスタマイズする(Button)

  • 多言語対応する