手の動きでモンスターボール投げ! 2

↑ これの続きです。

システム構成
(1):ToF AR が入った Android アプリで手認識
(2):(1) から信号受信しスワイプ操作を実行するスマホ上のプログラム
(3):ポケモンGo

今回は (2) の技術検証、具体的には

Android Studio で Java プログラムを作成して ADB.exe から実行

の解説になります。

成果物は以下のリポジトリで公開しておきます。



下記は最初から作る場合の、備忘の意味も含めた解説になります。

1.Android Studio のセットアップ

↑ こちらから Android Studio をインストールしてください。

2.新規プロジェクトの作成

File > New > New Project を選択して新規プロジェクトを作成します。

プロジェクトのテンプレート選択

↑ この選択はどれでも良いと思われますが、とりあえず Empty Activity を選択しておいてください。Next を押します。

プロジェクト名入力

Name は TouchProgram などとしておきます。この場合、パッケージ名(プロジェクト固有の ID のようなもの)は自動で com.example.touchprogram となります。Finish を押します。

自動でプロジェクトの初期設定が行われます。ウィンドウ下に進捗が表示されます。完了するまで少し待ちます。

3-1.Javaプログラムを作成

プロジェクト初期設定後の画面

MainActivity.kt というファイルが開かれた状態になります。このファイルは編集しません。左側の Project 一覧の com.example.touchprogram というフォルダのようなものを右クリックします。

右クリックメニューの上から 4 番目あたりにある「Java Class」を選択します。Class 名入力ダイアログが表示され名前入力を求められます。なんでも良いのですが、とりあえず今回は「TouchServer」と入力しておきます。

TouchServer.java が生成されました。今回は検証用なので、標準出力だけを行うプログラムを書きます。

package com.example.touchprogram;

public class TouchServer {
    public static void main(String[] args){
        System.out.println("hogehoge");
    }
}

何の変哲もない Java プログラムの初歩ですね。

3-2.Manifest ファイルの設定

プログラム実行するために必要な設定をします。

左側の階層のなかにある app > manifests というフォルダをクリックし、AndroidManifest.xml ファイルを開きます。3 行目 (manifest タグの中) に package="com.example.touchprogram" を追加します。

追加するとこんな感じ

パッケージ名指定でプログラム実行する際に、見つけるために必要な設定のようです。解説を見ると「AndroidManifest.xml に直接書かないでね」とあるようなので、正しい設定方法が他にあるかもしれませんが、今回はアプリ公開するわけではないのでこれで良しとしています。

4.アプリを実行する

Android Studio 上部のバーにある再生ボタンを押します。これによりアプリがインストールされ、アプリが実行されます。

アプリ実行画面

サンプルアプリが実行され、Hello World ! という画面が表示されました。

しかしこれはあくまでアプリが実行されただけで、先程書いた TouchServer.java は動作していません。Java プログラムのビルドインストールまでが完了していて、実行はこれからになります。

5.Java プログラムを実行する

プログラムを実行するには、インストールされたアプリの情報が必要になります。

ここから先は ADB.exe を使います。予め ADB.exe にパスを通しておく必要性があります。(パスを通す方法は下記ページなどを参考にしてください。)

Android スマホを PC と接続し、コマンドプロンプト(もしくは Windows PowerShell)を開きます。

adb shell

と入力し、スマホ内の操作へ移ります。

pm list package -f -3 | grep touchprogram

と入力することで、インストールされた端末内でのアプリのパス(ここでは「内部アプリ名」と呼ぶことにします)が表示されます。(grep により、touch という名前がついているものだけに限定しています)

/data/app/(内部アプリ名)=com.example.touchprogram

ちなみに自分の環境では以下のようになったので

SOG01:/ $ pm list package -f -3 | grep touchprogram
package:/data/app/~~cu82JXzpZmWfx3xI7AIjUQ==/com.example.touchprogram-ub0gZY-MmjmjxxIpVCCOAQ==/base.apk=com.example.touchprogram

「内部アプリ名」

/data/app/~~cu82JXzpZmWfx3xI7AIjUQ==/com.example.touchprogram-ub0gZY-MmjmjxxIpVCCOAQ==/base.apk

となります。(最後の =com.example.touchprogram の手前まで)

この後、プログラム実行する前に、端末内操作から抜けておきます。

exit

プログラム実行コマンドは以下の通りです。

adb shell CLASSPATH=(内部アプリ名) /system/bin/app_process /system/bin com.example.touchprogram.TouchServer

自分の環境では以下のようなコマンドになりました。

adb shell CLASSPATH=/data/app/~~cu82JXzpZmWfx3xI7AIjUQ==/com.example.touchprogram-ub0gZY-MmjmjxxIpVCCOAQ==/base.apk /system/bin/app_process /system/bin com.example.touchprogram.TouchServer

実行すると、

Java プログラムにあった標準出力処理が実行され hogehoge と表示される

hogehoge
と表示されれば成功になります。

Aborted
と表示された場合は CLASSPATH やクラス名などにミスがある可能性があります。

Killed 
と表示された場合はマニフェストファイルの設定が失敗している可能性があります。


今回、Java プログラムを Android 端末上で動作させることに成功しました。次回はこのプログラムからタッチ操作を発生させようと思います。

↓ 続きはこちら

この記事が気に入ったらサポートをしてみませんか?