しばらく間があいてしまいました。
Androidプログラムは最近ほとんどしていないんですが、時々ADTの更新(正式にはSDKの更新)はしています。あいかわrずADT本体とのバージョンミスマッチの問題に悩まされます。(ほっといても大抵は動くんですが、warningが気持ち悪い)
少し前に専用の開発IDEとしてAndroidStudioがreleaseされています。見た目、eclipseをやきなおしただけなんじゃない?っていう感じが強いんですが、こっちの方が更新されているようなんで、GoogleとしてはADTよりこっちに力を入れている感じがします。
なので、ちょっと試しに使ってみます。(まだβ0.8ですが、SDKと本体の更新がスムーズにいくようなら、こっちに乗り換えることも考えます)
紹介サイトを見ながら、まずはMacにインストールしてみます。(調子がよければ、Windows/Linuxもこちらに切り替えます)インストール自体は問題なく進みました。そしてサンプルアプリ(よくあるHelloworldです)も問題なく動きます。
ここで実際の実機(今回はgalaxy S2、Android4.0.3で更新は止まっています)での実機デバッグを試してみます。
AVDでシミュレーションするとき、intel版の方が速いという評判でした。実際速いんことは速いんですが、やはり実機にはかないません。(このあたりJavaの限界か)ということで、S2をつないでみると・・・、簡単に動きました。便利なのはメイン画面上でも実機がつながっていることがわかることです。(以下に画面の左下一部を示します)
またADTに比べて、ファイル更新してもすぐ反応して実機に反映してくれる気がします。(eclipse/ADTの時は中々実機アプリに変更が反映されず、よく実機のアプリを手動で削除していました)後、Gitも(Githubももちろん)使えるようですが、ちょっと設定しないといけないようです。
でも、これ昔のADTでGithubに登録したやつはそのままじゃだめだよな〜(ファイル構成が、ADTと似ていてファイル名が異なるといういやらしい作りになっています)
2、3ヶ月ADTとAndroidStudioの様子を見て、Googleがどちらを主力にしたいか様子を見てから考えます。
2014年7月25日金曜日
2014年3月13日木曜日
Androidアプリ開発:ADT eclipseの更新 新規プロジェクトの作成が???
この間のAndroid SDKの更新からActionBar用と思われるライブラリプロジェクトが、新規のAndroidプロジェクト作成時に作られてしまうという状態になってしまいましたが、それ以外にもプロジェクト内にデフォルトでsupportライブラリが作成されるようになってしまったようです。(別に害はないんですが気持ち悪い)
1)作成時
ライブラリが作られています。(作成時に、テーマをnoneにしたんですが、styles.xmlにはActionBarが入ってしまっている様子)
2)読み込み時
上記をいったんgitに登録、それを再度読み込んでプロジェクトを作成してみますと以下になります。
ライブラリは特に作成されませんし、普通に動きます。(もちろんこのアプリは簡単なサンプルで、ActionBarは使っていません。)
何かバグっぽい気がしますが、とりあえず問題はおきません。どうも新規プロジェクト作成時のテーマ選択がうまく機能していない気がします。(機能てんこ盛りの状態でプロジェクトを作成してしまう感じ)
1)作成時
ライブラリが作られています。(作成時に、テーマをnoneにしたんですが、styles.xmlにはActionBarが入ってしまっている様子)
2)読み込み時
上記をいったんgitに登録、それを再度読み込んでプロジェクトを作成してみますと以下になります。
ライブラリは特に作成されませんし、普通に動きます。(もちろんこのアプリは簡単なサンプルで、ActionBarは使っていません。)
何かバグっぽい気がしますが、とりあえず問題はおきません。どうも新規プロジェクト作成時のテーマ選択がうまく機能していない気がします。(機能てんこ盛りの状態でプロジェクトを作成してしまう感じ)
2014年3月8日土曜日
Androidアプリ開発:ADT eclipseの更新-appcompat_v7プロジェクトが勝手に作られる!?
ネットでちょっと動かしてみたいアプリのソースがあったのでADT(eclipse)をMacで起動、念のためSDK Managerで更新ライブラリを確認してみたら、新しいのがでてました。いやな予感がしたのですが、念のため更新。するとSDK manager本体も更新しろといってきます。これはeclipseの方から行いますが、その後どうも動きがおかしくなり新規Andoidプロジェクトがうまく作れなくなりました。
色々やっていたので何が原因で、何が起きたのかはっきりしませんが家の中にある他のMac、およびWindows7のADTも更新してみて動作を比較しながらやり、どうにか3台の環境で元々動かしてみようとしたAndroidアプリのソースを動かすことができるようになりました。(SDK Manager本体の更新にAndroid Developper ToolsサイトのURLが"http"ではだめで、また"https"に戻したり・・・、いったいどちらが正解なんだろう?時々、片方ではエラーがでて、片方で更新がうまくいったりします。)
ただ、なんか今度の更新でADTで新規Androidプロジェクトを作成すると、"appcompat_v7"というsrcのないプロジェクトが勝手に作成されます。過去に作成したAndroidアプリを再実行するのには特に必要ありませんが、今回から新規に作成したAndroidプロジェクトでは環境設定でここにある"appcompat_v7.jar"というファイルを参照しているようで、自分が作成した覚えがないからといって削除してしまうとエラーになります。調べてみても、海外のQ&Aサイトで何件か質問がここ最近でていましが、特にこれはという回答が見つかりませんでした。googleのサイトを調べないとだめかな。
また、今回の更新でエラーが出るようになったというのもありましたが、Android SDK Manager/ExtraからAndroid Support Repository、Android Support Libraryをインストールすれば消えたという報告がありました。自分のエラーは他にも原因があり(.classpathの内容にも問題があった)、よくわかりませんが処置してみたら動くようになりました。でも結局、"appcompat_v7"が何者なのかはわからず、、、名前からするとARM v7関係なのかな。ということはintel系のアプリを作成すると別のものができる?→これ違いました、追記します
PS
昨年の夏にAction Barという新しいUIが実装されて、そのライブラリが"appcompat_v7.jar"らしいです。ついでにv7というのはSupport v7のことで、Android SDK Manager/ExtraからAndroid Support Libraryでインストールされるそうです。(だからこれインストールしとかないと実行時にエラーになったのか)だからってPackage Explorerの見えるところにわざわざおかなくてもいいのに。。。昨年の時は手動でプロジェクトを作成しないといけなかったようですが、それを自動的に作成するようにしたみたいです。
ところでこのSupportライブラリはAndroid2.3とか古いバージョンでもこの新しいUIを使えるようにしているということなので、ちょっと考えました。このUIを使う気がないなら、Android Support Libraryを外して、さらにAndroidプロジェクトを作成するときに最低バージョン(通常は2.3にしていますが)を4.0以上にしてやれば、この"appcompat_v7"という空のプロジェクトは作成されなくなります。(正確にはテーマも変えるべきなんですが。昔は"Theme.Ligt"とか"Theme.Black"だったのが、ActionBarという名称が今は追加されてくるはずです。個人的にAndroid4.0以上の端末しか持ってなければこの方がきれいなんですが、もうちょっと実装考えてくれないかな~Googleさん。)
更に調べてみましたが、このappcompatプロジェクトがライブラリプロジェクトとして作成したAndroidアプリのプロジェクトからはリンクする設定になっていました。
(だからPackage Explorer内にプロジェクトフォルダ作っちゃうんだ...)ただ困ったことに、今後新しいアプリのプロジェクトを作成する度に新しいもの(appcompat_v7_2, appcompat_v7_3等)と新しいライブラリプロジェクトを作成してくれちゃう状態になってました。まあ新しいappcompat_v7_*は削除して、新しいプロジェクトの上記リンク設定を最初に作成されたものに設定しなおしてしまえばいいんですが、ちょっとこれはたまりません。それにこのライブラリ自体が更新されたらソースの管理はどうなるんだろう?なんか悩ましい状況になっている気がします。
PS
昨年の夏にAction Barという新しいUIが実装されて、そのライブラリが"appcompat_v7.jar"らしいです。ついでにv7というのはSupport v7のことで、Android SDK Manager/ExtraからAndroid Support Libraryでインストールされるそうです。(だからこれインストールしとかないと実行時にエラーになったのか)だからってPackage Explorerの見えるところにわざわざおかなくてもいいのに。。。昨年の時は手動でプロジェクトを作成しないといけなかったようですが、それを自動的に作成するようにしたみたいです。
ところでこのSupportライブラリはAndroid2.3とか古いバージョンでもこの新しいUIを使えるようにしているということなので、ちょっと考えました。このUIを使う気がないなら、Android Support Libraryを外して、さらにAndroidプロジェクトを作成するときに最低バージョン(通常は2.3にしていますが)を4.0以上にしてやれば、この"appcompat_v7"という空のプロジェクトは作成されなくなります。(正確にはテーマも変えるべきなんですが。昔は"Theme.Ligt"とか"Theme.Black"だったのが、ActionBarという名称が今は追加されてくるはずです。個人的にAndroid4.0以上の端末しか持ってなければこの方がきれいなんですが、もうちょっと実装考えてくれないかな~Googleさん。)
更に調べてみましたが、このappcompatプロジェクトがライブラリプロジェクトとして作成したAndroidアプリのプロジェクトからはリンクする設定になっていました。
(だからPackage Explorer内にプロジェクトフォルダ作っちゃうんだ...)ただ困ったことに、今後新しいアプリのプロジェクトを作成する度に新しいもの(appcompat_v7_2, appcompat_v7_3等)と新しいライブラリプロジェクトを作成してくれちゃう状態になってました。まあ新しいappcompat_v7_*は削除して、新しいプロジェクトの上記リンク設定を最初に作成されたものに設定しなおしてしまえばいいんですが、ちょっとこれはたまりません。それにこのライブラリ自体が更新されたらソースの管理はどうなるんだろう?なんか悩ましい状況になっている気がします。
2014年1月17日金曜日
Androidの温度センサは搭載されているのか?
最近、寒いせいなのかGalaxy S2のバッテリーの消耗が早くなった気がしています。2年以上たってますから古いといえば古いんですが、この厳しい寒期になってからそれまで3日くらいは(少なくとも2日以上)もっていたバッテリーが2日(48H)もちません。(夜は寒い居間に置きっぱなし)
ふと思ったのが、Android API内のSensorに温度センサがあったので、それでデータが取得できないかということです。(温度によって、バッテリーのもちに差がでるのかどうか確認してみたい)温度センサのリソースの取得APIは以下になります。
(注:Android4.0からは更に湿度センサも追加され、温度センサを取得するには TYPE_TEMPERATURE → TYPE_AMBIENT_TEMPERATURE になります。)
サンプルプログラムで確認してみると、値が「0」固定で変わりません?Debugしてみると、上記APIで返されるセンサの個数が「0」でした。(センサが搭載されていない?)
試しにもう一つ持っているAndroid端末の(初代)Nexus7で動かしてみても、やはり「0」、温度センサは持っていないようです。
そういえば、某誌によく掲載される分解記事でも地磁気センサとかジャイロとかにどこ製のチップが使われているとか登場してきてても、特に温度センサについての記述を見た記憶がありません。確かに携帯に温度センサまで付けても用途は思いつかないのですが、それじゃなんでAPIが存在しているんでしょう?(しかも湿度センサのAPIまで追加して)
おそらくAndroidを携帯以外に、家庭内の機器制御にも利用することを考えているんでしょうかね?
ふと思ったのが、Android API内のSensorに温度センサがあったので、それでデータが取得できないかということです。(温度によって、バッテリーのもちに差がでるのかどうか確認してみたい)温度センサのリソースの取得APIは以下になります。
List sensors = sensorManager.getSensorList(Sensor.TYPE_TEMPERATURE);
(注:Android4.0からは更に湿度センサも追加され、温度センサを取得するには TYPE_TEMPERATURE → TYPE_AMBIENT_TEMPERATURE になります。)
サンプルプログラムで確認してみると、値が「0」固定で変わりません?Debugしてみると、上記APIで返されるセンサの個数が「0」でした。(センサが搭載されていない?)
試しにもう一つ持っているAndroid端末の(初代)Nexus7で動かしてみても、やはり「0」、温度センサは持っていないようです。
そういえば、某誌によく掲載される分解記事でも地磁気センサとかジャイロとかにどこ製のチップが使われているとか登場してきてても、特に温度センサについての記述を見た記憶がありません。確かに携帯に温度センサまで付けても用途は思いつかないのですが、それじゃなんでAPIが存在しているんでしょう?(しかも湿度センサのAPIまで追加して)
おそらくAndroidを携帯以外に、家庭内の機器制御にも利用することを考えているんでしょうかね?
2013年11月3日日曜日
Androidアプリ開発:Blenderで作成したモデルをopenGL ESで表示したい
Androidのアプリで3Dモデルデータを表示するサンプルプログラムがあります。表示用のサンプルデータも添付していて、それを表示する分には問題ないんですが、自分でモデルを作成したくなりました。
とりあえず簡単に手に入るモデラーとしてBlender(2.69)で簡単な立方体を作成して、表面に色をつけてみました。ところがどうしても表示できません。モデルデータはWavefrontのobj形式です。添付されていたobjファイルはBlenderで作成したものではなく、若干キーワードに相違はありましたが、プログラム内でデータ読み込みをしている部分を調べた限りでは問題なさそうに見えます。
結局、2,3日かかりましたがBlenderでobjファイル形式でExportするときはこのアプリでは以下の注意が必要でした。
1.法線ベクトルを出力する
デフォルトでは法線ベクトルの出力がoffになっています。"Include Normals"にチェックを入れてやりましょう。(→これでobjファイルに、vn成分が出力されるようになります。)
2.面の定義が終了したことを示すための別の行を入れる
これはたまたま参考にしたサンプルプログラムの仕様でしたが、これを見つけるのが一番時間がかかりました。objファイルには面の定義のf行(頂点番号/テクスチャ座標の番号/法線の番号)が一つのオブジェクトで連続して出力されていますが、データの最終行を示すマークがありません。サンプルプログラムでは、何か別の行を読み込んだときにf行が終了したと判断して、自分のobjectデータに登録していました。
Blenderでobj形式で出力してやると、最後の行がf行で終了していました。つまり、サンプルプログラムが最後のobjectの塊を認識できないことになります。(1個しか定義してなければ、0個になります。)ここは仕方なく、手作業で1行害のなさそうな”usemtl default”を最終行に追加しておきました。(複数のobjectが定義してあれば、次のobjectの定義の始まりで通常は認識できるんですが。。。)
3.面は三角形で出力する
上記まででサンプルプログラムに自分がBlenderで作成した立方体が表示されるようになりましたが、各面が三角形で表示されます。Blenderの出力を見ると四角形でf行を出力していました。OpenGLは面の定義が基本三角形のはずで、BlenderのExport時のデフォルトが四角形になっていました。これを三角形にしてやります。("Triangulate Faces"にチェックを入れてやります。)
これで無事立方体が表示されました。
参考までに、2つチェックしたExportの設定画面をのせておきます。
とりあえず簡単に手に入るモデラーとしてBlender(2.69)で簡単な立方体を作成して、表面に色をつけてみました。ところがどうしても表示できません。モデルデータはWavefrontのobj形式です。添付されていたobjファイルはBlenderで作成したものではなく、若干キーワードに相違はありましたが、プログラム内でデータ読み込みをしている部分を調べた限りでは問題なさそうに見えます。
結局、2,3日かかりましたがBlenderでobjファイル形式でExportするときはこのアプリでは以下の注意が必要でした。
1.法線ベクトルを出力する
デフォルトでは法線ベクトルの出力がoffになっています。"Include Normals"にチェックを入れてやりましょう。(→これでobjファイルに、vn成分が出力されるようになります。)
2.面の定義が終了したことを示すための別の行を入れる
これはたまたま参考にしたサンプルプログラムの仕様でしたが、これを見つけるのが一番時間がかかりました。objファイルには面の定義のf行(頂点番号/テクスチャ座標の番号/法線の番号)が一つのオブジェクトで連続して出力されていますが、データの最終行を示すマークがありません。サンプルプログラムでは、何か別の行を読み込んだときにf行が終了したと判断して、自分のobjectデータに登録していました。
Blenderでobj形式で出力してやると、最後の行がf行で終了していました。つまり、サンプルプログラムが最後のobjectの塊を認識できないことになります。(1個しか定義してなければ、0個になります。)ここは仕方なく、手作業で1行害のなさそうな”usemtl default”を最終行に追加しておきました。(複数のobjectが定義してあれば、次のobjectの定義の始まりで通常は認識できるんですが。。。)
3.面は三角形で出力する
上記まででサンプルプログラムに自分がBlenderで作成した立方体が表示されるようになりましたが、各面が三角形で表示されます。Blenderの出力を見ると四角形でf行を出力していました。OpenGLは面の定義が基本三角形のはずで、BlenderのExport時のデフォルトが四角形になっていました。これを三角形にしてやります。("Triangulate Faces"にチェックを入れてやります。)
これで無事立方体が表示されました。
参考までに、2つチェックしたExportの設定画面をのせておきます。
objファイルは色の定義に*.mtlファイルが別途必要になります。ちょっと面倒なので、今度はcollada形式を調べてみようかと思います。
2013年10月14日月曜日
Android開発環境:ADT ver.22への更新
6月くらいにまたADTが、21→22に上がっていたようです。(しばらくさわってなかった(-_-;))
それでやっぱりまたうまくいきません。(いい加減にしてくれ!)
1.googleのURLをhttpsにしてみる。
Android Development ToolsのURLですが、http://dl-ssl.google.com/android/eclipseになっていますが、先頭をhttpsに変えてみる。
ただ、これいくつかのサイトを見てみるとどっちがいいのか時々によって変わるようです。どこかにアナウンスがあるのかもしれませんが、自分は見つけれませんでした。(今回は、結局httpの方で更新しました)
通常だと、SDK managerを単独で起動したりして先にSDKを更新しておき、後でeclipse側でcheck for updateしてやること、とどこでも書いてあるんですが、相変わらず「更新するものはない」といってきます。(でも、eclipse起動時にはADTが古いといって怒ってきます)
2.手動でinstall new software→available softwareにて更新してやる。
試しに手動でADTのURLに対して可能なソフトを調べてみると、ver.22があるといってきます。喜んでこれをインストールしようとすると、、、Macでは固まってしまいました。
しばらくぐぐってみたら、どうもver.22から新しい”Build-tool”というものがADT内に現れたらしく、これがないと色々悲惨なことになるようです。そこでSDK managerでとりあえずインストールしてみました。
(なんか3つくらいのバージョンが並行して表示されます。よくわからないので、とりあえず3つともインストールしてみました。→googleから9/17版の最新ADTをDLして動かしてみたら、最新のBuild-tool 18.1だけでした。試しに古い2つを削除してみましたが、問題なさそうです。ただ設定を変えることになるので、workspaceの再ビルドがかかります。しばらくeclipseをそっとしておく必要があります。)
3.手動でavailable softwareでADTのver.22をインストール。
今度は先に進行しました。(固まりません) 最初はMacで試してみましたが、次にWindowsの方もやってみるとADTはver.22になったようです。
ただ、ちょっと気になる状態になってしまいました。
- eclipseが、Indigo(3.8)→Juno(4.2)になった。(まあ、大丈夫かな?)
- ADTのeclipse起動時のダイアログにADTのバージョンが表示されるが、相変わらずver.21のまま。(でも起動してから、古いとは文句をいってこなくなった。ちょっと気にはなります。)
- 「ADTについて」でADT関連のパッケージを調べてみると、なんかver.21が残っている?というかver.22になってから名称が微妙に変わった?(Android Developer Toolsから、Android Development Tools ?)そのせいか、2種類表示されてくる様子。→9/17版では、”Android Development Tools”というのはありませんでした。更にgoogleのAndroid Developerのサイトを見ると、ページにより"Developer Tools", "Development Tools"と両方ありました。google自体、混同してる?
また気になることに、10/15にOracleがJavaの脆弱性に対応するため大規模なJavaの更新をするとの予告がでています。これで問題ないか、簡単なアプリでも作ってみないとわかりません。→既存のHelloAndroidで、一部テキストだけ変更して再ビルド、実行してみましたが、問題なさそうです。
2013年4月30日火曜日
Android開発環境:ADTの更新にまた苦しみました(>_<)
4月くらいからEclipseで「ADTが21.1になりました」と言ってくるんですが、どうしてもEclipse本体は21.0のままで、21.1を認識してくれません。
毎度のことですが、もう諦めました。GoogleからADT-bundleの最新版DLしてきて入れなおします。(Eclipse自体は特にインストーラも必要なく、フォルダごと変えるだけなので楽です。)しかしこの不安定な更新状況、なんとかならんかね。全然、状態が変わりません。いくら簡単にまるごと入れ替えできるといっても。。。
どうも調べてみると、ADTのSDK-toolsはこういうときEclipseから起動するんじゃなくて単体でSDK-Managerを起動して更新し、その後Eclipseを起動し、SDKの更新を認識させるといいようです。
しかしGoogleもAndroidアプリの開発者増やしたいなら、もう少しtoolの使い勝手を改善してほしい!
毎度のことですが、もう諦めました。GoogleからADT-bundleの最新版DLしてきて入れなおします。(Eclipse自体は特にインストーラも必要なく、フォルダごと変えるだけなので楽です。)しかしこの不安定な更新状況、なんとかならんかね。全然、状態が変わりません。いくら簡単にまるごと入れ替えできるといっても。。。
どうも調べてみると、ADTのSDK-toolsはこういうときEclipseから起動するんじゃなくて単体でSDK-Managerを起動して更新し、その後Eclipseを起動し、SDKの更新を認識させるといいようです。
しかしGoogleもAndroidアプリの開発者増やしたいなら、もう少しtoolの使い勝手を改善してほしい!
2013年1月5日土曜日
Androidプログラム開発-ファイル入出力
プログラムを移植するのに、あと一つ乗り越えないといけない壁があります。「ファイル入出力」です。
計算結果をログとしてstorageに出力したいですし、各種設定データをファイルとして読み込む必要があります。またそれらは、Android端末をUSB接続したときに簡単にアクセスできる場所がいいです。
試しに従来のJavaプログラムで作成した簡単なログ書き込みのプログラムを移植してみようとしたら、「そんなクラスはない!」と怒られてしまいました。Android用のiostreamじゃなきゃだめだということが確認できたので(事前に予測はしてました)、ググってみるとどうしてもファイルエクスプローラのアプリ紹介のページにいってしまいます。キーワードを考えて、やっと見つけました。
ファイル出力の方ではFileOutputStreamを使い以下の様なメソッドだとか。
outputStreamObj=context.openFileOutput( )
ところでこのcontextなるインスタンスは何者?ページをよく読むと、Androidプログラムの本体のインスタンスらしく、これを使うと/data/data/(パッケージ名)以下のパスしか指定できないとか。ここ普通のファイルエクスプローラではPermissionがありませんといって、見ることすらできません。(jail breakして、root化すればいけますが、そもそもUSB接続して簡単に参照したいのでそれでは困ります。)
さらに調べると、普通のjava.ioパッケージでもできるとの情報がありました。これならフルパスでファイルを指定できますが、ことごとくPermission denyで怒られます。セキュリティがガチガチですね。
USB接続して簡単にアクセス、というのが目標なので/sdcard以下にファイルを作ろうとしたんですが、そもそもeclipseに”/sdcard”のパスを直接コードするんじゃありません、と注意される始末。調べてみると、以下のメソッドを使いAndroid端末に合わせたパスを取得しろとのこと。
String str = Environment.getExternalStorageDirectory().getPath();
writeFile(str+"/Documents/log.csv","abcdefg","UTF-8");
Environment自体はstaticで定義されていますから、当該パッケージをimportするだけでそのまま使えます。上記ではとりあえずDocuments以下にファイルを作成してみました。
さてこれでいいだろうと思ったら、まだPermissionがないと怒られます。再度、ググった結果当該パッケージのManifest.xmlに以下の記述が必要なのだとか。(デフォルトではファイルアクセス禁止のプログラムしか作れないんですか Orz)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Manifest.xmlのどこに記述したらいいのかわからなかったので、そこはeclipseのUIにおまかせしました。(結果見ると、自前でタグ定義しているんでどこでもよさそうです。)
これでやっと準備ができたと思います。(移植しようと考えてるJavaプログラムのファイル入出力のモジュールをAndroid用に修正しないといけません)
追記:
ところで実際にAndroid端末(Nexus7を使ってます)をUSBでPCと接続し、先ほどプログラムで作成したファイルを見てみようとしたんですが、なんと見えません!Nexus7のファイルエクスプローラ・アプリでは確かにファイルが存在しいるんですが、PCではファイルが表示されません。同じディレクトリにある別のファイルはNexus7でもPCでも見えるんですが。。。
またまたググって、しかし今回はどんなキーワードで検索したらいいのか思いつきません。結構時間がかかりましたが、原因と思えるものが見つかりました。
・MTP(メディアデバイス)
Nexus7の設定みているとUSBストレージという名称じゃない別の名称のMTPで接続というのがあります。これは従来のUSBストレージだとUSBスティックのようにFATでファイルシステムを作り、それをPCから参照します。これって考えると結構危険です。Nexus7側のアプリが開いているファイルでもPCから修正できちゃうことになりますから。なのでMTPは一種のネットワークドライブのようにPCからは見せて、ファイルシステムとして認識しなくてもいいようにします。(Android3.1からこの機能がついたようです)
端末によっては従来のUSBストレージによる接続も残しているようですが、Nexus7では見当たりませんでした。(まあAndroidを主導しているGoogleとしては、新しい方式にして欲しいだろうし)
・マルチアカウント
最新のAndroid4.2.1からでしたか、マルチユーザーの機能が付加されました。当然、ファイルシステムだってその影響がでます。具体的には外部ドライブだろうが、各ユーザーが使えるエリアはユーザーアカウント毎に用意されています。具体的にいうと以下のような感じになるそうです。
/sdcard/0/Documents等
数字のところがユーザーに割り振られた番号で(UIDのようなものです)、各ユーザーごとに番号が振られます。つまりNexus7に異なるユーザーで使っていると、他人のユーザーの外部ストレージは見えません。(セキュリティ上のためもあります)更にいやらしいことに、上記の数字よりTopの"/sdcard"というのもAndroidの実装まかせで固定していないんだそうです。(いやこれは強制しようよ、Googleさん)それを回避して一つのアプリで複数の機種に対応するため、/sdcard/0までを取得するメソッド(getExternalStorageDirectory())が用意されたそうです。
さてここまで調べて、ファイルが見えなかった理由の推測ですが、Android4.0になってからでしたっけ、明示的なタスク管理のタスクマネージャーがなくなりました。そのため、試験的に作成したプログラムが停止していると思っても、実は裏でファイルハンドルをつかんで離さないから、PC側からは見えないんではなかろうかと。確実に確認するためにNexus7を再起動して、PCに接続すると無事プログラムが作成したファイルを見ることができました。(設定→アプリケーションで選択して強制終了してもいいと思います)
計算結果をログとしてstorageに出力したいですし、各種設定データをファイルとして読み込む必要があります。またそれらは、Android端末をUSB接続したときに簡単にアクセスできる場所がいいです。
試しに従来のJavaプログラムで作成した簡単なログ書き込みのプログラムを移植してみようとしたら、「そんなクラスはない!」と怒られてしまいました。Android用のiostreamじゃなきゃだめだということが確認できたので(事前に予測はしてました)、ググってみるとどうしてもファイルエクスプローラのアプリ紹介のページにいってしまいます。キーワードを考えて、やっと見つけました。
ファイル出力の方ではFileOutputStreamを使い以下の様なメソッドだとか。
outputStreamObj=context.openFileOutput( )
ところでこのcontextなるインスタンスは何者?ページをよく読むと、Androidプログラムの本体のインスタンスらしく、これを使うと/data/data/(パッケージ名)以下のパスしか指定できないとか。ここ普通のファイルエクスプローラではPermissionがありませんといって、見ることすらできません。(jail breakして、root化すればいけますが、そもそもUSB接続して簡単に参照したいのでそれでは困ります。)
さらに調べると、普通のjava.ioパッケージでもできるとの情報がありました。これならフルパスでファイルを指定できますが、ことごとくPermission denyで怒られます。セキュリティがガチガチですね。
USB接続して簡単にアクセス、というのが目標なので/sdcard以下にファイルを作ろうとしたんですが、そもそもeclipseに”/sdcard”のパスを直接コードするんじゃありません、と注意される始末。調べてみると、以下のメソッドを使いAndroid端末に合わせたパスを取得しろとのこと。
String str = Environment.getExternalStorageDirectory().getPath();
writeFile(str+"/Documents/log.csv","abcdefg","UTF-8");
Environment自体はstaticで定義されていますから、当該パッケージをimportするだけでそのまま使えます。上記ではとりあえずDocuments以下にファイルを作成してみました。
さてこれでいいだろうと思ったら、まだPermissionがないと怒られます。再度、ググった結果当該パッケージのManifest.xmlに以下の記述が必要なのだとか。(デフォルトではファイルアクセス禁止のプログラムしか作れないんですか Orz)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Manifest.xmlのどこに記述したらいいのかわからなかったので、そこはeclipseのUIにおまかせしました。(結果見ると、自前でタグ定義しているんでどこでもよさそうです。)
これでやっと準備ができたと思います。(移植しようと考えてるJavaプログラムのファイル入出力のモジュールをAndroid用に修正しないといけません)
追記:
ところで実際にAndroid端末(Nexus7を使ってます)をUSBでPCと接続し、先ほどプログラムで作成したファイルを見てみようとしたんですが、なんと見えません!Nexus7のファイルエクスプローラ・アプリでは確かにファイルが存在しいるんですが、PCではファイルが表示されません。同じディレクトリにある別のファイルはNexus7でもPCでも見えるんですが。。。
またまたググって、しかし今回はどんなキーワードで検索したらいいのか思いつきません。結構時間がかかりましたが、原因と思えるものが見つかりました。
・MTP(メディアデバイス)
Nexus7の設定みているとUSBストレージという名称じゃない別の名称のMTPで接続というのがあります。これは従来のUSBストレージだとUSBスティックのようにFATでファイルシステムを作り、それをPCから参照します。これって考えると結構危険です。Nexus7側のアプリが開いているファイルでもPCから修正できちゃうことになりますから。なのでMTPは一種のネットワークドライブのようにPCからは見せて、ファイルシステムとして認識しなくてもいいようにします。(Android3.1からこの機能がついたようです)
端末によっては従来のUSBストレージによる接続も残しているようですが、Nexus7では見当たりませんでした。(まあAndroidを主導しているGoogleとしては、新しい方式にして欲しいだろうし)
・マルチアカウント
最新のAndroid4.2.1からでしたか、マルチユーザーの機能が付加されました。当然、ファイルシステムだってその影響がでます。具体的には外部ドライブだろうが、各ユーザーが使えるエリアはユーザーアカウント毎に用意されています。具体的にいうと以下のような感じになるそうです。
/sdcard/0/Documents等
数字のところがユーザーに割り振られた番号で(UIDのようなものです)、各ユーザーごとに番号が振られます。つまりNexus7に異なるユーザーで使っていると、他人のユーザーの外部ストレージは見えません。(セキュリティ上のためもあります)更にいやらしいことに、上記の数字よりTopの"/sdcard"というのもAndroidの実装まかせで固定していないんだそうです。(いやこれは強制しようよ、Googleさん)それを回避して一つのアプリで複数の機種に対応するため、/sdcard/0までを取得するメソッド(getExternalStorageDirectory())が用意されたそうです。
さてここまで調べて、ファイルが見えなかった理由の推測ですが、Android4.0になってからでしたっけ、明示的なタスク管理のタスクマネージャーがなくなりました。そのため、試験的に作成したプログラムが停止していると思っても、実は裏でファイルハンドルをつかんで離さないから、PC側からは見えないんではなかろうかと。確実に確認するためにNexus7を再起動して、PCに接続すると無事プログラムが作成したファイルを見ることができました。(設定→アプリケーションで選択して強制終了してもいいと思います)
2013年1月4日金曜日
Androidプログラム開発-数値の入力
久しぶりに、Androidのプログラム開発(あえてアプリとはいいません。個人的に楽しむのが主目的なんで)をしてみました。
Javaで少し計算プログラムを作ってたんですが、それをAndroidに移植したくなりました。Javaプログラムの時はGUIも作ってみたんですが、計算諸元の設定は基本ファイルか、プログラムに直にコーディングで済ませてしまっていましたが、さすがにAndroidプログラムではそれはまずかろうと、GUI作って、その入力部分の作成からです。
Android開発環境ができていれば、GUI部分の開発(?)は簡単です。
(ラベルのところはあえて消してあります。ご容赦を_(._.)_)
ところで、このプログラムはAndroid4.0.3以降(API15)でプロジェクトの作成をしたんですが、昔はあった記憶のあるラベルwidgetがありません。しかたないので、Text widgetを貼り付け、初期の文字列を設定します。(activity_main.xmlに直に文字列書くと、eclipseがwarning出してくるので、面倒くさいんですが、文字列定義はstring.xmlを使うようにしました。多国語対応が簡単にできるようになんでしょうが、どうせ日本語しか作るきはないので無視してもいいんですが。)
1.ラベル相当が作れない
Textでラベルを作ろうと思っても、デフォルトは編集可能です。これをなんとか編集不可にしないといけません。調べてみると、当該widgetのandroid:editableという属性を"false"にすればいいらしいんですが、非推奨ということでeclipseではwarningがでてきます。それじゃどうしたらいいかというと、android:inputTypeで設定しろとのことですが、入力不可の"none"にしても(画面上では)編集はできてしまいます。どうしてもいい方法が見つからず、あきらめてandroid:editable属性をactivity_main.xmlで定義しました。(ただこの方法だと非推奨なので、warningはでます。)
2.(数値の)入力
これが一番苦しみました。widget自体はEditTextで作成すればいいんですが、ここで(符号付)数値のみの入力に制限しようとしますが、なかなかうまくいきません。関連したのは以下です。
number:数値入力する場合に指定します
numberSigned:符号付数値を入力する場合に指定します
numberDecimal:少数入力する場合に指定します
色々試してみましたが、numberSigned|numberDecimalがよさげです。(numberだと小数点が入力できません)
続いてこれの読み取りですが、結局以下のような感じになります。
double ldlat;
EditText latText=(EditText)findViewById(R.id.editLat);
EditText latText=(EditText)findViewById(R.id.editLat);
String input=latText.getText().toString();
ldlat = Double.parseDouble(input);
文字列で入力された数値をdouble型に入れたいんですが、結構面倒でした。int型等それぞれparse関数があります。方法を見つけるのに時間がかかったのが、EditTextからgetしてくるとき、どうやってString型にするかでした。それさえわかれば、あとは簡単でした。
本来の作業はこれからですが、入力さえ解決してしまえば後は単純作業です。(問題になるとしたら、Android端末側のCPUパワーやメモリ等のリソースからくる制限でしょうね)
2012年12月23日日曜日
Nexus7のアプリ開発
Nexus7のアプリ開発用に、eclipseの環境を整備していましたがその後何にもしてませんでした。せめてHelloAndroidくらい動作を確認しようと思い立ち、まずNexus7の設定を見るも、「開発者向けオプション」が見当たらない(;°ロ°) 何これ?こんなんで大丈夫なのかと思ってUSB接続してみるも、やはりデバイスが認識されていません。だいたい、USB接続するとどうしてもドライブと認識されてしまっているから、これじゃダメでしょ。ググってみて、調べて見つけました、なんというかGoogleの遊び心なのか、これくらい自分で調べれる人じゃなきゃこんなオプションを有効にしちゃだめよ、という意味なのか。昔のMicrosoftにもあった、隠し技で開発者向けオプションがでるようになり、USBデバッグモードをOnにできました。
さあこれでいいだろうと思っても、USB接続するとやはりドライブとして認識してしまい、あいかわらずeclipseからデバイスとして表示されません。再度、ググってみるとドライブとして認識するときMTPという通常のドライブ、それとPTPはカメラデバイスとして認識するようで、PTPにしないとだめなようです。ただ、それでもUSB接続するとやはりドライブとして認識されてしまいますが、今度はドライバがエラーが表示されるようになりました。
さらにググって、ASUS(Nexus7の製造メーカね)のNexus7のページをみると、USBドライバをDLできます。これをDLして、Windowsのデバイスマネージャから(ってことはMacはまた難しいかな、なんかこの展開、Galaxy S2のときと同じだな)ドライバの更新を行い、ドライバのエラーがでなくなり、無事eclipseのデバイスで認識できるようになり、HelloAndroidを実行できました。
それぞれの詳細な方法は割愛しますが、なんともあいかわらずハードルが高い・・・
PS.
ところでMac BookでのAndroid開発ですが、あいかわらずGoogle USB Deviceは非対応です。でもGoogleのHPを見てみると、MacやLinuxは自前のDevice driverでいいとのこと(でも前は、2.3の最初のときだけはよかったけど、その後の更新でダメになったけど。。。)。まあ試してみるかとやってみたら、1回目は何か問題がでてきましたが、Nexus7を一度抜いて、eclipseを再起動したらあっさりうまくいきました。安定してくれるといいけど。。。(ちなみに、そのHPにAndroid4.2からのUSBデバッグモードをOnにする隠し技が記載されてました)
PS(その2)
結局、今はWindows、Macとも安定してNexus7上にてデバッグできています。MTPも特にそのままで何も問題が起きません。当初悩んだのがなんだったのか、という状態です。しかし、実機デバッグが安定してできると快適です。なにせPC上のemulatorが起動は遅いわ、動作も遅いわでひどい状態ですから。AndroidをPC上で直接動かしちゃえというプロジェクトも進行しているそうです。
さあこれでいいだろうと思っても、USB接続するとやはりドライブとして認識してしまい、あいかわらずeclipseからデバイスとして表示されません。再度、ググってみるとドライブとして認識するときMTPという通常のドライブ、それとPTPはカメラデバイスとして認識するようで、PTPにしないとだめなようです。ただ、それでもUSB接続するとやはりドライブとして認識されてしまいますが、今度はドライバがエラーが表示されるようになりました。
さらにググって、ASUS(Nexus7の製造メーカね)のNexus7のページをみると、USBドライバをDLできます。これをDLして、Windowsのデバイスマネージャから(ってことはMacはまた難しいかな、なんかこの展開、Galaxy S2のときと同じだな)ドライバの更新を行い、ドライバのエラーがでなくなり、無事eclipseのデバイスで認識できるようになり、HelloAndroidを実行できました。
それぞれの詳細な方法は割愛しますが、なんともあいかわらずハードルが高い・・・
PS.
ところでMac BookでのAndroid開発ですが、あいかわらずGoogle USB Deviceは非対応です。でもGoogleのHPを見てみると、MacやLinuxは自前のDevice driverでいいとのこと(でも前は、2.3の最初のときだけはよかったけど、その後の更新でダメになったけど。。。)。まあ試してみるかとやってみたら、1回目は何か問題がでてきましたが、Nexus7を一度抜いて、eclipseを再起動したらあっさりうまくいきました。安定してくれるといいけど。。。(ちなみに、そのHPにAndroid4.2からのUSBデバッグモードをOnにする隠し技が記載されてました)
PS(その2)
結局、今はWindows、Macとも安定してNexus7上にてデバッグできています。MTPも特にそのままで何も問題が起きません。当初悩んだのがなんだったのか、という状態です。しかし、実機デバッグが安定してできると快適です。なにせPC上のemulatorが起動は遅いわ、動作も遅いわでひどい状態ですから。AndroidをPC上で直接動かしちゃえというプロジェクトも進行しているそうです。
2011年11月4日金曜日
Androidの開発:R.javaが生成されない!?
まだまだサンプルみながら、動作を確認している段階ですが、ある時から気づいたのがなんかlayout以下に自動生成されていたR.javaが生成されなくなっていました。そのため、ビルドしてもエラー、訳がわかりません。(最初の頃は勝手に生成されていた)
色々、調べてると結構悩んでいる人が多いらしくヒットはするんですが、どうも状況が違う。(res以下で、大文字まじっていると問題がでるとか色々ありました)ただどれも共通しているのが、ビルド時にwarningがでてるらしい。でも今悩んでいるのは、最初のプロジェクト生成時に、R.javaができないこと。(こんな感じで、gen以下に何も生成されません)
色々見ていると、そもそもR.javaはレイアウトの変更によっても自動的に更新が本来はかかるらしい。そこで思いついたのが、自分が自動ビルドのオプションはずして、手動にしたこと。そこで、プロジェクト生成して、R.javaはないけどかまわずそのままビルドしてみたら、勝手に生成してくれました。(ビルドしたところ、無事R.javaを生成してくれました)
ただ、この前悩んでたときは、プロジェクト生成後、ビルドするまえに色々ソースの修正してたら最初のビルドでR.javaを生成してくれませんでした。もしかしたらwarning出てたのかもしれません。よく注意していないと。
色々、調べてると結構悩んでいる人が多いらしくヒットはするんですが、どうも状況が違う。(res以下で、大文字まじっていると問題がでるとか色々ありました)ただどれも共通しているのが、ビルド時にwarningがでてるらしい。でも今悩んでいるのは、最初のプロジェクト生成時に、R.javaができないこと。(こんな感じで、gen以下に何も生成されません)
色々見ていると、そもそもR.javaはレイアウトの変更によっても自動的に更新が本来はかかるらしい。そこで思いついたのが、自分が自動ビルドのオプションはずして、手動にしたこと。そこで、プロジェクト生成して、R.javaはないけどかまわずそのままビルドしてみたら、勝手に生成してくれました。(ビルドしたところ、無事R.javaを生成してくれました)
ただ、この前悩んでたときは、プロジェクト生成後、ビルドするまえに色々ソースの修正してたら最初のビルドでR.javaを生成してくれませんでした。もしかしたらwarning出てたのかもしれません。よく注意していないと。
登録:
投稿 (Atom)