AndroidThings & Raspberry Pi3 で猫用扇風機を作る（3）

2017年9月23日に実施された「[東北Tech道場 郡山道場 第6回](https://medium.com/@koriyamadojo/%E6%9D%B1%E5%8C%97tech%E9%81%93%E5%A0%B4-%E9%83%A1%E5%B1%B1%E9%81%93%E5%A0%B4-%E7%AC%AC3%E6%9C%9F-%E7%AC%AC6%E5%9B%9E%E9%96%8B%E5%82%AC-a905cc4ef07c)」の作業内容をまとめます。

再度断っておきますが、Android Things も Raspberry Pi3 も、Android Studioでさえ経験がありません。見当違いのことを書いていたらお許しください。m(_ _)m

#1. 猫用扇風機「CatFans」の作成
前回作成したDoorbellアプリを元に猫用扇風機CatFansを作成しようと試みますが、Android Studioでプロジェクトの新規作成からつまづきます。[第3回Tech道場](https://qiita.com/tomato_sugar/items/24bedab2eabcf8494b7e)で学習したとおりにアプリを作ってみましたが、Doorbellとはファイルの構成が違います。無理やりDoorbellのソースをコピーしましたが、ライブラリが無いと怒られます。ライブラリを探してきてビルドを通しても実行エラーが出ます。しばらくあれこれやってみましたが諦めて、時間もないので、Doorbellを丸々CatFansにすることにしました。

- GCP(Google Cloud Platform)とFirebaseに「catfans」でプロジェクトを作成し、APIキーの取得とgoogle-service.jsonのダウンロードを行う。
- Dorebellプロジェクトにcatfans用のパッケージ（xxxxxとします）を作る。
- 「DoorbellActivity」→「CatFansActivity」、「DoorbellCamera」→「CatFansCamera」と名前を変えてコピー。
- 「CloudVisionUtils」、「BoardDefaults」はそのままコピー。
- Android Studioの「Edit」－「Find」ー「Replace in Path」でひたすら「com.example.androidthings.doorbell」→「xxxxx.catfans」に、「doorbell」→「catfans」に変える。
- 元々のDorebellのパッケージは削除する。

これでビルドしたら無事にDorebellと同じように動作しました。もうこれでOKにして次に進みますます。('◇')ゞ

#2. 5秒おきに写真を撮るように修正する
Doorbellのようにボタンで写真を撮るのではなく、一定周期で写真を撮る必要があるので、タイマーで動くようにしました。
##(1) CatFansTimerTask クラスの追加
次のようにソースを書きます。（今はtakePictureの個所でエラーが出ます）

```java:CatFansTimerTask.java
package xxxxx.catfans;

import java.util.TimerTask;
import android.os.Handler;
import android.content.Context;

public class CatFansTimerTask extends TimerTask {
    private Handler handler;
    private Context context;

    //コンストラクタ
    public CatFansTimerTask(Context context) {
        handler = new Handler();
        this.context = context;
    }

    @Override
    public void run() {
        handler.post(new Runnable() {
            @Override
            public void run() {
                //写真撮影メソッドを呼ぶ
                ((CatFansActivity)context).takePicture();
            }
        });
    }
}

```
##(2) CatFansActivity クラスの修正

###(i) フィールドの追加
```java:CatFansActivity.java
import java.util.Timer;
    :
    :
private Timer timer;
```
###(ii) onCreateメソッドでタイマーを起動
onCreateメソッドの最後に次のコードを追加します。

```java:CatFansActivity.java
import java.util.TimerTask;
    :
    :
//タイマーの作成と設定
timer = new Timer();
TimerTask timerTask = new CatFansTimerTask(this);
timer.scheduleAtFixedRate(timerTask, 0, 5000);      //5秒ごとにタイマーを起動

```

###(iii) takePictureメソッドを追加
takePictureメソッドの追加して次のように記述します。

```java:CatFansActivity.java
 //カメラで写真を撮る
 public void takePicture(){
     mCamera.takePicture();
     Log.d(TAG, "Take a picture.");
 }
```
##(3) ボタン関係のコードを削除
次の個所を削除します。

- private ButtonInputDriver mButtonInputDriver;
- onCreateメソッドの中の「initPIOメソッド」の呼び出し部分
- initPIOメソッド
- onKeyUpメソッド
- onDestroyメソッドの中の「mButtonInputDriver.close();」（tryごと）


##(4) 実行確認
ビルドして実行すると、5秒おきに写真を撮るようになりました。

#3. アプリが何度も立ち上がる問題
ラズパイはそのまま電源を切ると良くないそうなので、必ず
`$adb reboot -p`
とコマンドを打ち込んでから電源を切ります。しかし、Doorbellもそうでしたが、CatFansアプリをそのままにしてラズパイの電源を切ると、次に電源を入れたときに必ずCatFansが立ち上がってきます。ですから、rebootする前に、アプリはuninstallした方がいいと思います。そのためには、
`$adb uninstall xxxxx.catfans`
のように入力します。
なお、スマホをPCに繋いだままこのコマンドを入力すると、「error: more than one device and emulator」のようにメッセージを出力し、アンインストールすることができません。これは、 -s オプションを付けて以下のようにコマンド入力するといいようです。
`$adb -s <ipアドレス> uninstall xxxxx.catfans`

まあ、スマホをPCから外しておけばいいだけなのですが、何かの影響で「more than one device and emulator」が出た場合には、-sオプションを付けてみてください。


 
第7回に続きます。