Android」タグアーカイブ

【Android】Cloud Visionのサンプルを動かす

Google Cloud Visionのアンドロイド用サンプルプロジェクトを動かしてみたので手順を紹介します。

APIキーの取得

Cloud Vision APIの使い方まとめ (サンプルコード付き)

こちらのサイトを参考にAPIキーを作成します。

APIキーの種類一覧にAndroidキーがありますが気にせずブラウキーを作成してください。

最初Androidキーを発行して試したのですが、以下の様なリクエストが返されうまく実行できませんでした。

キーをブラウザキーに書き換えたらを問題なく動作。せっかくAndroidキーの取得方法をキャプチャ撮りながら記したのに全部無駄です(ぐちぐち

プロジェクトのインポート

次はAndroid Studioにサンプルプロジェクトをインポートします。

https://github.com/GoogleCloudPlatform/cloud-vision
グーグルのティムさんが作ってくれたサンプルです。リンク先で「Download ZIP」をクリックしありがたく頂戴しましょう。

ダウンロードが終わったらフォルダを解凍。フォルダ内にはアンドロイドだけでなくiOSやpython用のサンプルも有りますがそいつらは無視して

cloud-vision-master/android/CloudVision を

C:\Users\ユーザ名\AndroidStudioProjects

に移動。その後Android Studioを開き、スタート画面中の「Import Project」をクリック。

「CloudVision」を選択すればプロジェクトのインポート完了です。

最後に「MainActivity.java」
private static final String CLOUD_VISION_API_KEY = "YOUR_API_KEY";
のYOUR_API_KEYを取得したAPIキーに書き換えてください。

動かしてみる

準備が完了したので実際にアプリを動かしてみます。その際、実行環境のAPIレベルが22以上じゃないと動作しないので注意してください。

アプリ起動時の画面は以下のとおり。非常にシンプルです。

amarecco0052

ピンク色のボタンを押し、端末内の画像を選択すれば分類結果が表示されます。

amarecco0054

脅威の的中率。ちなみにkoratとはロシアンブルーにそっくりな猫の種類らしいです。

amarecco0053

沢山の猫の種類が候補に上がっています。この子は雑種なので当たりとも外れとも言えない。

amarecco0056

今度はロシアンブルーと雑種の組み合わせ。やはり雑種の場合は種類を絞り込めないようです。

どの画像でも猫が写っていることを判別できました。さすがGoogle。ただ品種の判別に関しては雑種に対して1.000の純血種のスコアがついてしまうのはどうなのかと思ったり。あとは分類候補に大別と小別が混在しているので何かに応用する際には結果の取捨選択が必要そう。

とはいれこれだけの精度で画像分類できるCloud Visionはやはりすごいです。インスタグラムの投稿をAPIで大量取得してCloud Visionにかければ流行を機械的に分析できたりしないかな。夢が広がりんぐ。

ひと月あたりの利用枚数が1000枚までなら料金は発生しませんので興味のある方は是非試してみてください。未来感ハンパねぇですよ。

【Android】HTTP通信がSPモードフィルタに引っかかる

以前紹介したOKHttpを用いたサーバとのHTTP通信ですが、普段使いの端末ではやたら長いHTMLタグの羅列がレスポンスとして返ってきます。

こんな感じ。

Screenshot_2016-02-25-02-45-33

文字列が長過ぎて見切れてしまっているのでAndroid Stutio上のログを確認。すると

「アクセス制限エラー http://www.xxxにアクセスできません」

の見慣れた文字が。

どうやら未成年Docomoユーザならお馴染みのSPモードフィルタによってサーバとの接続が制限されているようです。

フィルタリングサービスは携帯の契約時に加入させられ、その後成人しても解除せずにずるずると使い続けています。まさか自作で立てたサーバが制限対象になるとは思いませんでした。

他の開発者さんはどうやって対策をしているのでしょう。どこかに申請すればフィルタリング対象から外してもらえるとか?ググってもしっくりくる情報が得られません。

とにかく、アプリ開発時にHTTP通信を行う際にはフィルタリングに引っかからないように手を打つ必要があるようです。せっかくアプリをダウンロードしてもらっても使えないんじゃ意味無いですからね。

【Android】プログレスダイアログ(処理待ちのぐるぐる)を表示する

以前こちらの記事で端末内のデータをサーバに送信するためのコードを書きましたが、処理を開始してから結果が返ってくるまで若干時間がかかってしまいます。ボタンを押しても画面が白いままでは味気ないので処理中にプログレスダイアログを表示することにします。

参考にさせていただいたサイトはこちら

技術脳塗 非同期(スレッド)処理中にプログレスダイアログを表示する (シンプル)
https://sites.google.com/site/technoute/android/thread/thread_progress

上記サイト中の青文字の部分を自分のプログラムにコピペしただけで動きました。Nexus 5のエミュレータ上ではこのように表示されます。
amarecco0046

 

蛇足かもしれませんがコードも載せておきます。参考サイト中のコードはとてもシンプルでわかりやすいのですが、そこから更にプログレスダイアログ以外の部分を削げ落としております。とりあえず動かしたい人向けです。

【PHP】Android上でPHPスクリプトの実行に手間取った話。

開発中のアンドロイドアプリにてサーバにアクセスし、phpスクリプトを実行して結果を表示する機能を実装しようと試みました。

スクリプト内では外部コマンドを実行する関数(shell_exec)を使ってpythonのスクリプトを動かしています。このphp、ターミナル上では問題なく実行できるのですが、アンドロイドでは上手く行かず端末の画面は真っ白のままです。

原因を探るためにshell_execの部分に「2>&1」オプションを追加しました。

echo shell_exec( 'python ファイル名.py 2>&1' );

コマンド実行時にエラーが発生した際、通常はnullが返ってくるのですが「2>&1」オプションをつけるとエラーメッセージが返ってきます。

オプション追加後アンドロイドから実行すると画面には「ImportError: No module named xxx」と表示されるようになりました。どうやらモジュールのインポートに失敗しているようです。

恐らくですが、アンドロイド端末からの実行の際にはPYTHONPATHの設定が適用されないのだと思います。

そこでpythonスクリプトに以下の文を追加しました。

import sys
sys.path.append("/xxx/xxx")

/xxx/xxxにはエラーメッセージ中に書かれていたモジュールが格納されているディレクトリの絶対パスが入ります。これを記述することでライブラリを読み込むディレクトリのパスをpythonスクリプト内から指定できます。

これでようやくアンドロイドアプリでphpスクリプトの実行ができるようになりました。