GitHubに公開したAndroidアプリ「DecoyCamera」について(技術解説)

DecoyCameraがAmazon Kindle Fire7およびFire10にてうまく動作しない場合があります。
搭載カメラのうちメインカメラ(Back)ではシャッターが切れない。フロントカメラでは普通に動作する。というようなものです。

そこで、Kindle Fire 7についてカメラのサポート状況を調べてみたところ、意外(?)なことが判明しました。

Kindle Fire 7では、比較的新しいAndroidOS搭載スマホと比較して、メインカメラ(Back)とフロントカメラの動作が若干違うということ。

メインカメラ(Back)がAF(オートフォーカス)に非対応

DecoyCameraアプリでは、比較的新しいスマホをターゲットにしており、メインカメラ(Back)はAFのみに対応している想定で実装しています。Kindle Fire 7の場合、「AFに非対応」なので、うまく動作しないんだなということが判りました。

フロントカメラはAFに非対応

DecoyCameraアプリでは、フロントカメラはAFに対応していない想定(MF(マニュアルフォーカス)のみに対応している)で実装しています※1。Kindle Fire 7の場合も、「AFに非対応(MFに対応)」と、比較的新しいスマホと同じなので、うまく動作していたということ。

※1:ベースにしたサンプルコードでは元々フロントカメラに対応しておらず、メインカメラ(Back)のみに対応した作りになっていました。DecoyCameraではフロントカメラに対応できるように、レンズの切り替えやMF対応を追加で実装しています。

Kindle Fire 7(9th)のCameraサポートその他について

以下、Camera2 Probe App(GooglePlayでリリース)を使ってKindle Fire 7のカメラのサポート状況について調べてみた結果(一部を抜粋)。

Model:KFMUWI
Manufacturer:Amazon
Build:7.1.2
SDK:25
------------------------------------------
Camera ID: 0
Camera Facing: Back
SupportLevel:LEGACY
Hardware Support Level:LEGACY
Manual exposure:0
Auto exposure:1
Auto exposure, always flash:0
Auto exposure, auto flash:0
Auto exposure, auto flash, red eye reduction:0
AE Lock:1
Manual focus:1
Auto focus:0
Auto focus macro:0
Auto focus continuous picture:0
Auto focus continuous video:0
Auto focus EDOF:0
White balance off:0
Automatic white balance:1

Auto focusが0(非サポート)になっているのが判ります。

関連する記事・ページ

GitHubに公開したAndroidアプリ「DecoyCamera」について(概要)
GitHubに公開したAndroidアプリ「DecoyCamera」について(使い方)
GitHubに公開したAndroidアプリ「DecoyCamera」について(技術解説)
GitHubに公開したAndroidアプリ「BleSwitch」について(概要)
GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)
GitHubに公開したAndroidアプリ「BleSwitch」について(技術解説)

お世話になったリンク

android-Camera2Basic

以上です。

LINE通知の直接トリガーとIFTTT経由のトリガーについて(その2)

自宅PCやサーバのHDD容量を監視して、逼迫してきたら、LINE通知に24H自動通知しています。

処理の流れとしては、

  • WIndowsタスクで一定期間で監視スクリプトを実行
    • 監視スクリプトで要通知となればLINE通知にPOSTする
    • そうでなければなにもしない(スルー)

これを24時間365日行っています。

ここでは、上記の「LINE通知にPOSTする」部分について、その方法と注意点について紹介しようと思います。

「 WIndowsタスクで一定期間で監視スクリプトを実行」部分については、本ブログの関連ページを参照してください。

かなり説明を端折ってますので、初心者の方はネットでいろいろ調べてみてください。

紹介内容とポイント

  • ①LINE通知への通知方法。少なくとも2種類ある。それぞれ長所短所があるので用途により使い分けるとよい
  • ②LINE通知に直接通知を投げる
  • ③LINE通知にIFTTT経由で通知を投げる
  • ④まとめ

①②については、「LINE通知の直接トリガーとIFTTT経由のトリガーについて」を参照してください。

③LINE通知にIFTTT経由で通知を投げる

監視対象機器(ここでは自宅PCとします)から「IFTTT」サービス経由で「LINE Notify」(LINE通知)サービスにアクセスします。やり方は、ひとことでいうと、IFTTTサービスに登録してMyAppletを作成するだけです。それだけで普段使っているLINEに通知が来ます。

たとえば、こんな感じです。

clip-20191022112528.png
※背景画像は東京市ヶ谷にあるポケストップ

ひとつ目の通知が直接通知。二つ目の通知はIFTTT経由通知。同時刻にPOSTしていますが、到着に28分間のタイムラグがありました。IFTTT経由通知の場合は処理が遅いのではなく、ある時点でまとめて処理しているだと推察します。

powershellのコード例

以下PowerShellのコード例を示します。ここでは、LINE通知をする監視対象機器を自宅PC(Windows)としているのと、監視処理を同じくPowershellで書いてWindowsタスクから起動しています。

MacOSやLINUXサーバの場合は、「curl」コマンド等を使って同様に実装可能と思います。

IFTTT_trig.ps1

Add-Type -AssemblyName System.Web

Set-Variable -Name 'TOKEN_IFTTT' -Value <IFTTTのトークン文字列>
echo ("※IFTTTへMAKERイベント発火 at " + $Now)

$oXmlHttp = New-Object -Com Msxml2.XMLHTTP.3.0
$URL = "https://maker.ifttt.com/trigger/test/with/key/$TOKEN_IFTTT"

#コマンドライン引数(パラメータ)の取得
If ($Args.Length -eq 1){
    $a1 = [SYstem.Web.HttpUtility]::UrlEncode($Args[0])
    $URL = $URL + "?value1=" + $a1
}else{
    echo "Error:引数が多すぎます"
    exit
}

$oXmlHttp.Open("GET", $URL, $false)
$oXmlHttp.Send()
If ($oXmlHttp.Status -eq 200){
    echo [SYstem.Web.HttpUtility]::UrlDecode($URL)
}Else{
    echo "Error returnCode:" + $oXmlHttp.Status
}

※ここではIFTTTのMyAppletに設定するトリガーコマンドを「test」としています。

下記コマンドをWindowsのコマンドプロンプトで実行します

IFTTT_trig.ps1 "ディスク逼迫 at MyPC(残量 649)"

※通知内容の変更を容易にするため、上記スクリプトに引数をひとつ渡すようにしています。

※24H監視する場合はWindowsタスクへの登録が必要です。

④まとめ

自宅PCやサーバのHDD容量を監視して、逼迫してきたら、LINE通知に24H自動通知しています。

ここでは、「LINE通知に24H自動通知」について、その方法と注意点について紹介しました。

関連する記事・ページ

LINE通知の直接トリガーとIFTTT経由のトリガーについて
LINE通知の直接トリガーとIFTTT経由のトリガーについて(その2)
自宅PCをスマホでリモート管理(タスク管理編)
PCをリモート管理する1手法
【コードサンプル】Windowsタスクへの登録例
【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script
【コードサンプル】1時間タスクのScript例
【コードサンプル】24時間タスクのScript例
【コードサンプル】hbJob.bat – Windows Bat Script
【コードサンプル】プロセスモニタのScript例
【コードサンプル】IFTTT経由でLINE通知するScript例
【コードサンプル】ネット転送量モニタ

お世話になったリンク

LINE Notifyでたのでちょっと試してみる。ついでにGithub Enterpriseのwebhookを通知するやつを作ったぞ!!

※東京市ヶ谷のポケストップ「ビーナス」
clip-20191023073518.png

以上です。

LINE通知の直接トリガーとIFTTT経由のトリガーについて

自宅PCやサーバのHDD容量を監視して、逼迫してきたら、LINE通知に24H自動通知しています。

処理の流れとしては、

  • WIndowsタスクで一定期間で監視スクリプトを実行
    • 監視スクリプトで要通知となればLINE通知にPOSTする
    • そうでなければなにもしない(スルー)

これを24時間365日行っています。

ここでは、上記の「LINE通知にPOSTする」部分について、その方法と注意点について紹介しようと思います。

「 WIndowsタスクで一定期間で監視スクリプトを実行」部分については、本ブログの関連ページを参照してください。

かなり説明を端折ってますので、初心者の方はネットでいろいろ調べてみてください。

紹介内容とポイント

  • ①LINE通知への通知方法。少なくとも2種類ある。それぞれ長所短所があるので用途により使い分けるとよい
  • ②LINE通知に直接通知を投げる
  • ③LINE通知にIFTTT経由で通知を投げる
  • ④まとめ

③④については、「LINE通知の直接トリガーとIFTTT経由のトリガーについて(その2)」を参照してください。

①LINE通知への通知方法

LINE通知に至る方法には、他にもいろいろ紹介されているかも知れませんし、自分で独自にそうしたサービスを作ることも可能ですが、ここでは比較的簡単に導入しやすいと思われる方法を紹介します。

  • 監視対象機器からLINE通知に、直接、通知を投げる
  • 監視対象機器からLINE通知に、IFTTT経由で、通知を投げる

特に監視対象機器などなくて、単にTwitter等のネットサービスからLINE通知に通知したい場合は、IFTTT経由の方法を参照してください(後述するURLにPOSTするスクリプトも不要です)。

※ここの紹介では方法の比較がひとつのポイントですので、一方の方法のみであれば他ブログのページの方が導入しやすいかも知れません。

直接通知の特長

  • ほぼリアルタイムで通知が来る。他サービスを経由しないので、ほぼリアルタイムに通知できます。応用例を思いつきませんが、監視対象からの通知にすばやく反応したい場合有用かもしれません。
  • LINE通知専用のアクセストークンを取得して使用しないと通知できないので、安全

IFTTT経由通知の特長

  • 特別な知識やノウハウが必要ありません。監視対象機器からの通知を処理する場合でも、リアルタイム性を求めないならこちらで十分だと思われます。ただし結構タイムラグがあります(下記例の場合28分)。
  • LINE通知のアクセストークンを取得する必要がありません。ただしIFTTTのトークンは必要です。

②LINE通知に直接通知を投げる

監視対象機器(ここでは自宅PCとします)から「LINE Notify」(LINE通知)サービスにアクセスします。やり方は、ひとことでいうと、LINE通知専用アクセストークンを入手して、それを使ってURLにPOSTするだけです。それだけで普段使っているLINEに通知が来ます。

たとえば、こんな感じです。

clip-20191022112528.png
※背景画像は東京市ヶ谷にあるポケストップ

ひとつ目の通知が直接通知。二つ目の通知はIFTTT経由通知。同時刻にPOSTしていますが、到着に28分間のタイムラグがありました。IFTTT経由通知の場合は処理が遅いのではなく、ある時点でまとめて処理しているだと推察します。

powershellのコード例

以下PowerShellのコード例を示します。ここでは、LINE通知をする監視対象機器を自宅PC(Windows)としているのと、監視処理を同じくPowershellで書いてWindowsタスクから起動しています。

MacOSやLINUXサーバの場合は、「curl」コマンド等を使って同様に実装可能と思います。

LINE_trig.ps1

Add-Type -AssemblyName System.Web

Set-Variable -Name 'TOKEN_LINE' -Value <アクセストークンの文字列>
echo ("※LINEへ通知イベント発火 at " + $Now)

$oXmlHttp = New-Object -Com Msxml2.XMLHTTP.3.0
$URL = "https://notify-api.line.me/api/notify"

#コマンドライン引数(パラメータ)の取得
If ($Args.Length -eq 1){
    $a1 = [SYstem.Web.HttpUtility]::UrlEncode($Args[0])
    $a1 = "message=" + $a1
}else{
    echo "Error:引数が多すぎます"
    exit
}

$oXmlHttp.Open("POST", $URL, $false)
$oXmlHttp.setRequestHeader("Authorization","Bearer $TOKEN_LINE")
$oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$oXmlHttp.Send($a1)
If ($oXmlHttp.Status -eq 200){
    echo "正常に送信できました"
    echo [SYstem.Web.HttpUtility]::UrlDecode($URL) 
}Else{
    $responseText = $oXmlHttp.responseText()
    echo "Error returnCode: $responseText"
}

下記コマンドをWindowsのコマンドプロンプトで実行します

LINE_trig.ps1 "ディスク逼迫 at MyPC(残量 649)"

※通知内容の変更を容易にするため、上記スクリプトに引数をひとつ渡すようにしています。

※24H監視する場合はWindowsタスクへの登録が必要です。

R.参考

関連する記事・ページ

LINE通知の直接トリガーとIFTTT経由のトリガーについて
LINE通知の直接トリガーとIFTTT経由のトリガーについて(その2)
自宅PCをスマホでリモート管理(タスク管理編)
PCをリモート管理する1手法
【コードサンプル】Windowsタスクへの登録例
【コードサンプル】heartbeat.ps1 – 心音確認 PowerShell Script
【コードサンプル】1時間タスクのScript例
【コードサンプル】24時間タスクのScript例
【コードサンプル】hbJob.bat – Windows Bat Script
【コードサンプル】プロセスモニタのScript例
【コードサンプル】IFTTT経由でLINE通知するScript例
【コードサンプル】ネット転送量モニタ

お世話になったリンク

LINE Notifyでたのでちょっと試してみる。ついでにGithub Enterpriseのwebhookを通知するやつを作ったぞ!!

※東京市ヶ谷のポケストップ「ビーナス」
clip-20191023073518.png

以上です。

GitHubに公開したAndroidアプリ「DecoyCamera」について(使い方)

使い方

設定

現バージョンでは設定メニュはありません。

機能

本アプリはカメラアプリです。「Decoy」という名称でわかるかも知れませんが、周りにスマホがいっぱいある中で、周りに気づかれずに、状況を画像として記録することができます。

全体の流れ

ステップ1: アプリを起動する

①スマホアプリ起動前の画面例
clip-20191006170148.png
②スマホアプリ起動後の画面例。極小ファインダと2つのボタンが見える。ナビゲーションが白色
clip-20191006170458.png

アプリを起動しても、一見、何事もなかったような画面です。起動時のスマホ画面がほとんどそのまま残ります。ただし、見えているアイコンなどにタッチしてもなにも起こりません。「DecoyCamera」の透明な画面が全体を覆っているからです。

ステップ2: 極小ファインダーで画像を確認し、シャッターボタンをタッチして、撮影する

撮影に成功すると、保存する画像ファイル名が表示されます。画像ファイル名は撮影時刻をもとに自動生成したものになります。

「FR」ボタンをタッチするとメインカメラからフロントカメラに切り替わります。もう一度タッチするとメインカメラに戻ります。

Androidの機種による動作の違い

  • Amazon-Kindle-Fire-7:メインカメラでは撮影できません。フロントカメラに切り替えると撮影できます。シャッター音は鳴りません(FireOS6だから?)。
  • Amazon-Kindle-Fire- HD-10:メインカメラでは撮影できません。フロントカメラに切り替えると撮影できます。シャッター音が鳴ります(FireOS5だから?)。
  • GalraxyJ6+:フル動作します。シャッター音は鳴りません(海外向けスマホだから?)。
  • OPPO R11S:フル動作します。シャッター音が鳴ります(日本向けスマホだから?)。

ステップ3: 撮影した画像を確認する

スマホのファイラー(ファイル管理アプリ)を起動して、
内部ストレージ(内部共有ストレージ)の下記フォルダ(ディレクトリ)を確認します。

(内部ストレージ)/android/data/com.krasavkana.android.decoycamera/files

ステップ2で保存したファイル名のファイルが確認できるはずです。

ステップ4: アプリを終了する

「BLEスイッチ」との連携

GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)

を参照してください。

リリース用APKファイル

リリース用にビルドした署名付きAPKファイルを本ブログ配下に置いています。

androidアプリ「BleSwitch」リリース用APKファイル
androidアプリ「DecoyCamera」リリース用APKファイル

GitHubの公開コードをローカル開発環境(AndroidStudio3.x)にクローンしてきてビルドしても得られるものですが、そうした環境をお持ちでない方のために用意しました。

どういう動作になるのか。興味のある方はいろいろ試してみてください。

関連する記事・ページ

GitHubに公開したAndroidアプリ「DecoyCamera」について(概要)
GitHubに公開したAndroidアプリ「DecoyCamera」について(使い方)
GitHubに公開したAndroidアプリ「DecoyCamera」について(技術解説)
GitHubに公開したAndroidアプリ「BleSwitch」について(概要)
GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)
GitHubに公開したAndroidアプリ「BleSwitch」について(技術解説)

お世話になったリンク

android-Camera2Basic

以上です。

GitHubに公開したAndroidアプリ「DecoyCamera」について(概要)

概要

本アプリは、カメラアプリです。Camera2APIという最新のAPIを導入しています。

ただし、現時点では、旧来のCameraAPIと同じ使い方をしています。例えば、フェース認識等の先進技術は使っていません。

「DecoyCamera」というアプリ名

「DecoyCamera」というアプリ名にしていますが、これには理由があります。

「Decoy」とは、木製のカモ(人形)のことで、狩猟等で使います。「Decoy」があまりに精巧にできているので、本物の獲物(カモ)が寄ってきてくれるのです。狩猟者が設置した「Decoy」のそばに来た獲物は十分な射程距離に入っているので助かります。

日本語では「おとり」になりますね。今では「おとり捜査」(Decoy Investigate)の意味にも使われています。

「DecoyCamera」は、「Decoy」にちなんで、たくさんの(カメラ機能付き)スマホに紛れているスマホアプリです。後述しますが、狩猟者の代わりに撮影者が離れた場所から撮影タイミングを狙うこともできます。

今年、車載カメラ(ドライブレコーダー)が売れました

現代人は、今ではいつでもどこでもスマホに囲まれて生活しています。これまでカメラのない空間はバスルーム位でしたが、そこにスマホを持ったひとがいれば、それも例外ではなくなりつつあります。

2019年になって、車につける車載カメラ(ドライブレコーダーともいいます)が大変な売れ行きになっているそうです。

日本では滅多にないことですが、非常に稀に「乱暴運転」や「事故」に遭遇します。もちろん、自身の車が事故を起こしたり、巻き込まれたりすることもあります。

そういった場合に、車載カメラ(ドライブレコーダー)できちんと状況を記録できていると、とても助かります(逆に自分に不利になることもありますが)

テレビ等で「乱暴運転」の非道さが連日報道された結果、その状況を記録して証拠提示もできる非常に役立つものとして車載カメラ(ドライブレコーダー)が注目されました。

「DecoyCamera」の役割

車載カメラ(ドライブレコーダー)の街中版

「DecoyCamera」は、周りに気づかれずに、状況を画像として記録することができます。

車載カメラの場合は、エンジン始動からエンジン停止まで、自動で動作して状況を逐一記録していってくれます。

さすがに、スマホの電源を入れてから電源を落とすまで、内蔵カメラを起動して逐一記録することはできませんし、その必要もありません。運転中と比べてそんなに突然に証拠となる画像が必要になる場面はそうそうないからです。

不審物や不審者や不信な状況について、あからさまにカメラを向けることなく、その状況を撮影することが「DecoyCamera」でできます。

香港のデモに遭遇したら

画像処理によりフェース認識技術は現在中国が世界一だとか。基本技術は日本発のようですが、画像取得に使うカメラは街の到るところにあってその数も半端ないとか。

香港のデモの参加者は皆一様にマスクをしています。マスクをしていればフェース認識できないか、その能力が発揮できなくなるからでしょうね。

日本人が旅行者としてそうしたデモに遭遇したとすると、何が起こるか分かりません。デモのそばにいる人たちを「十把一絡げ」にして拘束するかも知れませんよね。

「目には目を、歯には歯を」で、当局の行動を「DecoyCamera」等のスマホアプリを使って逐一証拠として残しておきましょう。

中国でフェース認識に使われるカメラの数がどれだけ膨大であっても、世界の人たちが使っているスマホの数に比べれば、もののかずにもなりませんからね。

スパイカメラとは一味違う

世の中には、探偵などのプロが使うスパイカメラというものがあります。そうしたものはほぼ全てカモフラージュしたカメラです。つまり一見してとてもカメラには見えないもの。ペン、ACアダプター、壁掛け、腕時計、スーツのボタン、ぬいぐるみの眼球、等々。米国のドラマ「リベンジ」でもそういう小道具が使われていましたね。

「DecoyCamera」はそうしたものと一味も二味も違います。

  • スパイカメラはスマホ搭載のカメラに比べて性能が数段落ちます。「DecoyCamera」の場合、最新スマホにインストールするだけです。(なんて言っても、開発環境を持っていないのでiOSには対応していません)
  • スパイカメラは専用品で、証拠取得以外の使い道がありません
  • スパイカメラは専用品すぎて、使うひとにソーシャルエンジニアリング能力が必要です。逆にいうとプロが使ってこその仕様です。「DecoyCamera」の場合、いつでもどこでもスマホをいじれる時間と場所であれば、だれでも問題なく使いこなせます。ただし、日本向けスマホの場合シャッター音が鳴る場合があるので注意してください(*1)
  • スパイカメラはカスタマイズできません。「DecoyCamera」の場合、公開コードを改変すれば無限にカスタマイズ可能です
  • 「DecoyCamera」の場合、「BLEスイッチ」と連動して離れた場所からアプリを起動することができます

*1:「DecoyCamera」が使っているCamera2APIには単独では音声を鳴らす機能がありません。日本向けスマホの場合などで、自動でシャッター音が鳴る仕組みになっているようです。海外向けスマホにインストールした場合、シャッター音は鳴りません。実は、公開コードにおいても、オプションとしてシャッター音を実装しようとしましたが、うまくいきませんでした。

公開コードの改変について

本アプリのコードをGitHubにて公開しています。

「DecoyCamera」公開コード

開発環境はAndroidStudioで言語はJavaです。昔と違ってプログラミングの勉強が非常にやりやすくなっています。

元々それなりに動作するものを使って、いろいろ試してみることが一番勉強になると、管理人は考えています。

公開コードを取得してちょっと修正ながら、より素晴らしい、高機能な「Decoy」なカメラにしてみてください。

関連する記事・ページ

GitHubに公開したAndroidアプリ「DecoyCamera」について(概要)
GitHubに公開したAndroidアプリ「DecoyCamera」について(使い方)
GitHubに公開したAndroidアプリ「DecoyCamera」について(技術解説)
GitHubに公開したAndroidアプリ「BleSwitch」について(概要)
GitHubに公開したAndroidアプリ「BleSwitch」について(使い方)
GitHubに公開したAndroidアプリ「BleSwitch」について(技術解説)

お世話になったリンク

Android 5.0におけるBLE について – 受信編 –
THETA プラグインで 市販の BLE ボタンをリモコンにしてみた
iBeaconとは

以上です。