ニッチなアプリ「Screen Scanner」を作った
スマホに表示されているバーコードを読み取るアプリを作りました。画像を渡して読み取ることもできます。カメラで読み取る機能は現状つけていません。
動機(1年半前)
今から1年半ほど前の話です。
スマホのサイト上に表示されたQRコードを読み取りたいことがあったのですが、スマホが1台しかなく、それを読み取る手段がありませんでした。そこに不便を覚えたので、作ろうと思いました。
バーコード読み取りには、Zxing(ゼブラクロッシング)というOSSがあることを知っていたので、それを使おうと思いました。 画面にバーコードを置いて動かすことはできたので、画面を透過して対象のバーコードの上に載っければ行けるかなーと思っていたら、 アプリからキャプチャできるのは自身だけ のようで、透過部分が真っ暗になりました。 解消するにはルート権限を取るしかない(実は後述の方法はあった)ようで、それは辛いと思いこのアイディアは頓挫しました。。
動機(現在)
エンジニアからしたらちょっと試して駄目だった。なんてのは日常茶飯事で、自分が試してだめだったものや途中のものを眺めていました。
これもなんで駄目だったんだっけ?と動かしてみて、調べなおしてみたら、Android5.0からルート権限不要で画面のキャプチャが取れるAPIがあることを知りました。 そして、Android7.0からクイック設定に、アプリがタイルを置けることも知ったので、これは相性が良さそう!思い再び作り始めることにしました。
動き始めたコミットログ
作ってみて
本当は年内に作り上げたかったのですが、意外とやることが多かったです。QRコードっていろんな情報詰められるんですね。。wifiとかイベント情報とか知らなかったです。 初めの想定だと使いにくいので修正や、追加で使ってみたい機能などがでてきて、思った以上に時間がかかってしまいました。
以下の技術(?)を使いました。それぞれハマったところや気づきがあったので追々個別に記事にできればなと思います。アプリを触ってみると、どんな風に使われてるのかわかると思います。
- MediaProjection API
- Quick Settings Tile API
- Mobile Vision
- MessengerのようなChat Heads(これ正式名称なんなんだろう。。)
- App Shortcuts
まとめ
昔は技術的制約で駄目だったものも、今ならできるようになっていたり、別の実現方法ができていたりします。 初めて触る技術は自分の想像以上のことができたりして楽しいです。逆もあったりするけど。
参考
AWS LambdaでKotlinのコードを動かす
Web APIを作ってみたいと思い、AWS Lambdaを触ってみました。PythonかNodeかJavaが使えるとのことだったので、自分が一番書きやすいKotlinで動かしてみるところまでやりました。
まだ詳しくわかっていない部分が多いので、動作したことのメモ書き程度。
確認した順番
- チュートリアルを見ながらNodeの
hello-world
のblueprintで動作確認。 - IntelliJでMavenプロジェクトでJavaファイルを作成して
mvn clean package
- IntelliJでGradleプロジェクトでJavaファイルを作成して
./gradlew clean assemble
- IntelliJでGradleプロジェクトでktファイルを作成して
./gradlew clean build
上記のようにやっていくことで、問題の切り分けを行いながら確認しました。
詰まったところ
[ERROR] The goal you specified requires a project to execute but there is no POM in this directory (/PATH/target). Please verify you invoked Maven from the correct directory. -> [Help 1]
[2]の確認で起きました。Mavenでpackageコマンドを入力して起きました。めちゃくちゃ単純なのですが、一度 mvn package
を実行して、成果物を確認するために target
に移動したのを忘れてました。。
プロジェクトルートでコマンドを実行しないとだめです。
"errorType": "class java.lang.ClassNotFoundException"
[4]の確認で起きました。 ./gradlew clean assemble
で生成した jar
をLambdaの管理画面からuploadして、testをしたら発生したエラーです。
build.gradleにkotlinを使うための記述が漏れてました。ktファイルを作成するだけではなく、必要な記述を追記しましょう。よく見たら生成されたjar
のファイルサイズがめちゃくちゃ小さいので気づけます。
必要な記述
Androidで使うように、同じように書いたら動きました。
- build.gradle
apply plugin: "java" apply plugin: "kotlin" version = '1.0' repositories { mavenCentral() } sourceSets { main.kotlin.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/java' } dependencies { compile ( 'com.amazonaws:aws-lambda-java-core:1.1.0', 'com.amazonaws:aws-lambda-java-events:1.1.0', "org.jetbrains.kotlin:kotlin-stdlib:1.0.4" ) testCompile group: 'junit', name: 'junit', version: '4.11' } task buildZip(type: Zip) { from compileJava from processResources into('lib') { from configurations.runtime } } build.dependsOn buildZip buildscript { ext.kotlin_version = '1.0.4' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } }
"errorType": "java.lang.NoClassDefFoundError"
[4]の確認で起きました。 ./gradlew clean assemble
で生成した jar
をLambdaの管理画面からuploadして、testをしたら発生したエラーです。
これが一番詰まりました。。どうやら、 ./gradlew clean assemble
で生成される jar
ではなく、 ./gradlew clean build
で生成される zip
の方じゃないとだめみたいです。
jarはbuild/libs
に生成されますが、zipはbuild/distributions
に生成されます。
試してみて
まだアプリから使うところや、実際に利用するようなWeb APIには全くなっていないですが、自分の選択肢を増やせて良いなと思ったところです。
今回の検証結果はこちら。
参考
ステップ 2: HelloWorld Lambda 関数を作成してコンソールを探る / AWS Lambda
AWS LambdaがJava対応したので簡単チュートリアル / Qiita
GenymotionにGooglePlayを入れるのが簡単になってた
以前もGenymotionでGooglePlayを動かせるようにする記事を書いたのですが、それよりも簡単な方法が、公式のQAで紹介されていました。
次のサイトから、zipファイルを落として起動しているGenymotionのEmulatorに入れるだけです。ファイルが一つで済むようになってました。
- Platformは
x86
を選択 - AndroidはGooglePlayを使えるようにしようとしているEmulatorのOSバージョンを選択
- Varientは
nano
を選択 - Downloadボタンを選択
ただし、Genymotionのバージョンが、 2.7.2以上 の必要があります。
時々失敗しますが、その場合はEmulatorを作り直して再度zipを入れるとうまくいきました。