【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スクリプトの実行ができるようになりました。

【Android】OKHttpで画像ファイルをPOSTする

OKHttpを使ってjpegファイルをサーバにアップロード出来るようになったのでコードを載せておきます。

コメントが付いている部分だけ変更すればとりあえず動くはずです。コメント無いところはおまじないです。

サーバ側のPHP
ファイルを受け取ったら自身と同じディレクトリに保存する。

【Android】HTTP Clientが使えなくなっている

Android端末からサーバにファイルを送る方法をネットで調べていると「HTTP Clinentを使えばできるよ!」的な記述が散見できます。あるサイトに習ってHTTP ClientをAndroid Studioに導入し、いざコードを打ち込んでみるとクラス名のところに打ち消し線が表示されビルドに失敗。

理由がわからず別バージョンを試してみたり他のサイトを参考にしたりしましたが徒労に終わり、半ば諦めつつネットを巡回していると「HTTP ClientはAndroid 6.0のリリースに伴い削除されました」との記載が!今までの時間はなんだったんだと落胆しながらも読み進めると、代わりにHTTPUrlConnectionやVolley、OKHttpといったクライアントを使えばHTTP Clientと同じようなことが出来ることがわかりました。

それぞれのコードを眺め、一番すっきりしているOKHttpを使おうと決めたのですが、これまたうまくいきません。Gitに公開されている公式のサンプルコードを参考にコードを書いて実行したところ、指定したURLへの接続はできていますが、ファイルのアップロードはできず途方に暮れています。

本当は解決してから記事にしたかったのですが、長いことハマっているので息抜きも兼ねて現状をまとめてみました。何かするたびに躓いていて先は長いです。

【Android Studio】エミュレータで仮想SDカードが使えなくてハマった

端末内の画像ファイルを使ってどうこうする処理を書き、その動作確認のためにエミュレータ内に画像ファイルを用意しようと試みたのですがここでどハマりしました。

pc上のファイルを転送するのは何やらめんどくさそうなので端末のカメラで写真を撮影してテストに使おうと思い、アプリを起動すると英語で「SDカードが刺さってないので保存できません」的なメッセージが。いくらシャッターボタンをクリックしても反応してくれません。

AVD Managerの各種設定を眺めてもSD関連の項目は見つからず、グーグルで検索してもヒットするのはEclipse関連のサイトばかり。どうしたらいいかわからず途方に暮れていましたが、「これだけクリティカルな問題なのに解説サイトが無いということは自分の環境に問題にあるのでは?」とふと思いHelp>checkUpdateでAndroid Studioをアップデート。 これだけではまだ不十分で、

C:\Users\ユーザネーム\AppData\Local\Android\sdk\SDK Manager.exe

を起動して「Install 〇Package」 をクリックし、その他必要な部品たちもアップデートしてあげる必要があります。

すべてのアップデートが終了後Android Studioを再起動し、Android Virtual Device Managerを立ち上げて新たなADVを作ります。設定を進めていくとそこにはSDCardの文字が!最新バージョンのAndrdoid StudioではADV作成時の設定がデフォルトのままでも仮想SDカードが使えるようです。

その代わりカメラ機能を使うには初期設定時の「Android Virtual Device」と表示されている画面で「Show Advanced Setting」をクリックして「Camera」の項目を「None」から「Emulated」に変更しなければなりません。

上記の設定を終えてエミュレータを起動しカメラアプリのシャッターを押すと軽快なシャッター音が鳴り響きました。この音が聞きたかった!

これでようやくエミュレータを使ってテストができるようになりました。