ラベル Android の投稿を表示しています。 すべての投稿を表示
ラベル Android の投稿を表示しています。 すべての投稿を表示

2013年5月17日金曜日

[Android] Android Studio のインストール

Googlo I/O 2013 でAndroidの新しい開発環境「Android Studio」が発表されました。
ニュース - Google I/O 2013で音楽配信サービスや開発ツール「Android Studio」など発表:ITpro

プレビュー版ではありますが、すでにダウンロードが可能とのことです。さっそくダウンロードしてみます。
Getting Started with Android Studio | Android Developers





ダウンロード、インストールは迷うことはないですね。
(起動のときにMacの制限で「開発元が〜」云々とダイアログが出る場合がありますが、2本指クリック(右クリック)から「開く」を選択すれば開けます)



まだ全然使っていなくて感想らしい感想は言えないのですが、補完が軽快でとても良い感じでした。ショートカットがEclipseとは違う点は慣れなければいけませんが、慣れたらEclipseより効率よく開発ができそうです。

Vim化するプラグインもあるようですし、少しずつ慣れていって移行を検討しようと思います。
JetBrains Plugin Repository :: IdeaVim

それにしても、発表されて1日も経っていないのに、Android Studio関連の記事が結構見つかりますね。皆さん新しい開発環境に期待しているということなのしょうか。もちろん、僕も期待しています。がんばれ、中の人たち。

2013年5月8日水曜日

[Android] 高速エミュレータ

今さらですが、Androidのエミュレータを高速化してみました。
最初に職場のMacで試してみたところ、思っていた以上に高速だったので自宅のMacにも適用した次第です。
今まで使っていなかったのはすごく損した気分です。本当に速いです。

いろいろと手順がかかれたサイトがたくさんあるので、設定手順は割愛します。
「<SDKのインストールディレクトリ>/extras/intel/Hardware_Accelerated_Execution_Manager/IntelHAXM.dmg」を開いて、その中のものをインストールするのがキモみたいですね。

以下は参考にさせていただいたサイトです。

* 噂の爆速エミュレーター(android)を試してみたがマジで早かった件。 | ウェブ制作日記
* しずくくんのAndroidでゲームプログラミングしてみたいなblog : MacでAndroidエミュレータを高速化

2013年4月25日木曜日

[Android] 続・データ通信接続状態の監視

昨日の調べ物の続き。
やはりREAD_PHONE_STATEはいただけない。
ということで、ConnectivityManagerを使って監視ができないか調査しました。

ConnectivityManager | Android Developers
http://developer.android.com/reference/android/net/ConnectivityManager.html

TelephonyManagerのように、定期的にイベントを返してくれるメソッドは無さそうな感じなので、自分でポーリングしてみることに。
5秒に1回ConnectivityManagerのgetAllNetworkInfo()を呼んでみました。うん、取れますね。

実際に機能として組み込む際はこんなに情報要らないのでgetActiveNetworkInfo()でも良さそうな気がします。
ConnectivityManagerならパーミッションも「ACCESS_NETWORK_STATE」で済みますしね。

↓サンプルはこちらです
https://www.box.com/s/5g9mi6w82k6u88k07ars

2013年4月24日水曜日

[Android] データ通信接続状態の監視

 同僚から「ネットワークの接続状態が変化したことを知る方法を知らないか」と聞かれたので、このあたりのクラスが使えるんじゃないか、ということでConnectivityManagerを伝えました。

ConnectivityManager | Android Developers
http://developer.android.com/reference/android/net/ConnectivityManager.html

自分としては試したことのないクラスだったので、勉強がてら調べて見ることにしました。すると、ConnectivityManagerではなくて、TelephonyManagerで状態変化の監視ができるらしいことがわかりました。

TelephonyManager | Android Developers
http://developer.android.com/reference/android/telephony/TelephonyManager.html

listen()というメソッドを使うことで、いろいろな状況の変化をイベントとして受け取れるようになります。とりあえず、同僚の求めているものとしては十分そう。ManifestにREAD_PHONE_STATEのパーミッションを書かないといけないのが、ちょっとあれですが。

↓サンプルコードはこちらです。
https://www.box.com/s/4ppsdxj33nhehu69hlk9

2013年4月12日金曜日

[Android] フォントを変更してみた

以下のサイトを参考にさせていただいて、Androidアプリで表示するフォントを変更するサンプルアプリを作ってみた。

オリジナルフォントを設定する方法– Android
team-hiroq http://team-hiroq.com/blog/android/android_use_original_font.html

スクリーンショット

簡単にできるんですね。

そのときのコードはこちら。
https://www.box.com/s/1j629iw82vcm61n0uytc
※サンプルにフォントファイルは含まれていません。

2013年2月21日木曜日

Conversion to Dalvik format failed with error 1

仕事で開発しているアプリで、apkを出力する際に以下のエラーメッセージが表示されて、apkが作成出来ない状態になりました。
Conversion to Dalvik format failed with error 1

このエラーメッセージで検索すると、同じ症状に遭遇している人は結構いるらしいことがわかります。
ただ、どのサイトも解決策がはっきりしない印象です。
この症状について書かれているのはだいたい以下の点です。

・Androidのソース形式のライブラリを参照するプロジェクトで起きている
・プロジェクトのcleanを行ったら直った
・Eclipseに-cleanオプション付けて起動し直したら直った
・binとgenディレクトリを削除したら直った

自分もこのあたりは試したのですが、直りませんでした。
その後、いろいろ試しているうちに、binの中のファイルをたまたま開きました。すると、Eclipseから同期されてない状態になっていたのです(refreshしろと言われる状態)。
なんとなくあやしいと思い、binディレクトリをリフレッシュした後、apkの作成を試してみると…ちゃんと出力されるではありませんか!

ただ、これで完全に解決したわけじゃないのですよね…。
その後、プロジェクトをcleanしたら、また同じ症状が…。またbinをリフレッシュしたり、もう一回cleanしてみたりしていたら、再びapk作成が成功…。よくわかりません。
原因を特定出来るようなエラーメッセージがどこかに出力されてると良いんですが…(されてるけど英語を読めてないだけかな…?)。
一応apk作成に成功する(こともある)ようになったので、あまりコレばかりに時間をかけるわけにもいかず、よくわからないまま、また必要性になったら調べることにしました。
 うーん、どうもすっきりしません。

ご存知の方がこの記事を読まれましたら、コレどうしたら良いのか是非とも教えてくださいませ。よろしくお願いします。

追記:
[menu - Project - Build Automatically]のチェックを付けていると失敗しやすいような気がします。

2013年2月18日月曜日

画面遷移時にIMEを表示しない方法

Androidのアプリで、画面遷移時にIMEを表示しない方法について。
検索すればいくらでも出てくるだろうけど、備忘録としてメモ。


AndroidManifest.xmlの対象の<activity>に以下を記述する。

android:windowSoftInputMode="stateAlwaysHidden"

http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft


または、対象のActivityのonCreate()で以下を実行する。

getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

http://developer.android.com/reference/android/view/Window.html#setSoftInputMode(int)
http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#SOFT_INPUT_STATE_ALWAYS_HIDDEN

2013年2月5日火曜日

ScrollViewの中でlayout_weightが効かない

下のような構成にしたとき、ScrollViewの中でlayout_weightが効かない状態になっていました。                                 原因がわかりません。 検索してみると以下のページが見つかりました。 android - layout_weight is not work in scrollview - Stack Overflow http://stackoverflow.com/questions/10312272/layout-weight-is-not-work-in-scrollview ScrollViewに「android:fillViewport="true"」を指定するだけで良いみたいですね。 まだまだ知らないことがたくさんあるなぁ。

2013年1月30日水曜日

外部のライブラリをどうするか

gitで管理していたAndroidプロジェクトがありました。

Project1
├.git
├src
├res
└libs

こんな感じです。ディレクトリ全部を書き出したわけじゃないです。こんな感じだと思ってください。

このプロジェクトでは外部のAndroidライブラリを利用することになりました。jarではなく、eclipseのプロジェクトの状態でソース形式で配布されているやつです。

workspace
├Project1
│├ git .
│├src
│├res
│└libs
└Library1
 ├src
 ├res
 └libs

こんな感じにしました。ここのLibrary1もプロジェクトなので、こうするのが自然かなぁ、と思ってこんな感じにしました。
ただ、これだとgitの管理下にLibrary1がないんです…。
Project1だけgitで管理しても、Library1も揃わないとビルド出来ません。かと言って、自分が修正するでもないプロジェクトを別のリポジトリに登録するのも変な感じだし…と、困っていました。

知人に聞いてみたら、Library1を他のプロジェクトでも繰り返し使うならリポジトリとして登録して、submoduleにするのが良いのではないか、という意見をもらいました。
(submoduleって何だろう?という状態です…)
あとはProject1のどこかにLibrary1を含めてしまうか、Library1をjar化してProject1の中に含めるか等の案をもらいました。

まずは一番すっきりしそうなLibrary1のjar化を試してみることにしました。ダメでした…。
少し調べただけですが、リソースを含むライブラリプロジェクトはjarには出来なさそうですね(出来るなら配布元もjarにしてそうですしね)。

続いて、プロジェクトの中にプロジェクトを入れてしまうことにしました。submoduleがよくわかってませんし。
これは簡単ですね。

workspace
└Project1
 ├ git .
 ├src
 ├res
 └libs
  └Library1
   ├src
   ├res
   └libs

こうするだけです。
これならgit管理下に入ります。プロジェクトの中にプロジェクトがあるというのは変かな?と思っていましたが、やってみるとそこまで違和感はなかったです。
ただ、Library1が外部のSDKですので、公開リポジトリに置くのはマズそうな気はします…。今回は非公開のプロジェクトだったので、とりあえずこのまま進めることにしました。

こういう場合の定番の方法を知りたいですね。

2013年1月11日金曜日

ThreadPoolExecutorってこんなやつかも

昨日、帰ったらThreadPoolExecutorの動きを確認するサンプルコードを書くつもりだったのですが、仕事の中で満足するくらい確認できてしまって、結局家ではやりませんでした。

自分の理解したThreadPoolExecutorはAndroidのものです。たぶん、一般的なJavaでも同じだと思いますが。さらに、Android2.xまでのAsyncTask内で使われているような使い方をした場合の動作です。

http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html

ThreadPoolExecutorというのは、大きく2つため込むものがあるようです。
1つは名前が表す通り「スレッド」、もう1つは「実行前のタスク」です。タスクっていうのはRunnableですね。
コンストラクタで指定するいくつかの値がありますが、corePoolSize、maximumPoolSizeはスレッド数に関するものです。keepAliveTime、unitはcorePoolSizeを超えたスレッドの生存期間を表しているようです(ここはあまり調べませんでした)。workQueueは実行前のタスクがためられるキューです。キューのインスタンスを渡すので、ここの長さも使用する側で決めることができます。

ちなみにAndroid2.xまでのAsyncTaskでは以下のように設定されていました。

corePoolSize … 5
maximumPoolSize …128
keepAliveTime、unit … 1秒
BlockingQueue<runnable> workQueue … 長さが10固定のキュー

このときexecute()を行うとどのようになるか。

(1) Executorが保持するスレッドがcorePoolSize以下のとき

スレッドを作って実行します。poolSizeが+1されます。
getPoolSize()は内部のスレッド数を返します。
getActiveCount()は動作中のスレッド数を返します。
ここは問題ありませんね。

(2) Executorが保持するスレッドがcorePoolSizeを超えているとき

workQueueの状態で動作が変わります。

(2-a) キューにタスクを格納可能なとき

キューに詰めて終わりです。キューに詰められたタスクは、実行中のスレッドが空けば取り出されて処理されます。

(2-b) キューにタスクを格納できないとき(キューが一杯のとき)

キューからタスクを1つ取り出して、新しくスレッドを作って実行します。新しいタスクはキューに詰められます。
ただし、スレッド数がmaximumPoolSizeを超えるようだと、例外が発生して終わりです。
ここでスレッドが作られるため、getPoolSize()を呼ぶとcorePoolSizeを超えた数が返されます。スレッド数は最大でmaximumPoolSizeまで増えますが、keepAliveTime、unitで指定した時間を超えて何もしないスレッドは破棄されていきます。

書いてみると単純ですね…。
すっごく苦労したんですが。


今回、不具合でタスクが完了しない(無限ループに陥ってた)ものがあり、スレッドに居座り続けるという事態が発生していました。しかも、何度も呼ばれる処理だったために、徐々にスレッド数を消費していきます。
その不良スレッドがcorePoolSizeを超えて、なおかつキューに空きがある場合、新しく呼ばれた処理はキューに詰められるだけで何もしません。恐ろしいですね。そんな不具合でした。

大変でしたが、コードをたくさん読めて満足しました。

2013年1月10日木曜日

ThreadPoolExecutorって何だ

昨日はThreadPoolExecutorの動きに悩まされていました。
もう少し細かく書くと、Android 2.xまでのAsyncTaskの内部的な動きがよくわからなかったのです。
AsyncTaskの内部ではThreadPoolExecutorが使われていました。
それに絡んでいる(ような気がする)不具合が発生していて、内部の動きがわかれば解決に向かうかも、という期待からThreadPoolExecutorについて調べていました。

インターネットを検索すると、いくつかThreadPoolExecutorに関する記事は見つかるのですが、自分の理解力がアレなのかイマイチ理解出来ません。
プールやらタスクやらキューやら出てきて、どこにどうスレッドがたまるのか想像出来ないのです。
ネット上でThreadPoolExecutorのソースを見つけたので読んでみて、ようやく「こういう動きかな?」というところまでわかってきました。

昨日帰宅してから確認するためのコードを書いてるみようとしたのですが、睡魔に勝てず寝てしまいました(帰れたの1時なんですもの)。
また、今日帰ったら試してみたいと思います。

2012年12月24日月曜日

Nexus 7 のカメラアプリ

Nexus 7 にはインカメラは搭載されているものの、カメラアプリを起動するアイコンが表示されないんですね。写真を要求するアプリからの連携で起動することはできるみたいですけども。
Play storeを検索してみたら、カメラアプリを起動するというNexus 7用のアプリが見つかりました。なるほど、わざわざ作らなくても起動だけすれば良いですね。
ということで、自分も作ってみました。カメラアプリを起動するだけのアプリ。パッケージ名とクラス名を直で指定して起動させています。
いやぁ、あるとなかなか便利ですね。

2012年12月19日水曜日

Nexus 7 の購入

12月18日に「Nexus 7」を買いました。
会社から冬のボーナスが出て、お小遣いが入ったのです。お金もらってすぐ全部使っちゃうところは、子供の頃から変わってないなぁ…。

容量は16GB版を買いました。きっと十分だと思います。
カバーが欲しかったのですが、(ヨドバシには)これといったものがありませんでした。とりあえず画面の保護フィルムだけ買いました。

開封後、いくつかアプリをダウンロードした後、システムアップデートを行いました。Android4.2の端末が欲しかったのです。アップデートは何事もなく終わりました。

少し触ってみて感じたことをいくつか。

動作速度は快適です。サクサク動きます。ただ、タブレットの操作に慣れてないせいか、スクロールやフリックがうまくできないことがあります。スマホより大きなっストロークが必要な感じがします。慣れれば問題なさそうですが。

画面解像度も十分で、電子書籍がきれいに読めます。SonyのReaderで同じファイルを読んだときは小さな文字がつぶれ気味でしたが、Nexus 7ではきれいに読めます。7インチというサイズと解像度がちょうど良いのかなと思います。

インカメラしかないせいか、標準ではカメラアプリがインストールされていないようですね。後から適当なカメラアプリをインストールすれば使えるので問題はないです。

単体で通信出来ないのはちょっと面倒です。スマホでテザリング出来るので良かったですが、最近のサービスやアプリは通信出来ないと困るものが多いと思うので、持ち運べるネットワークがない人気は飽きるのも早そうです。

これだけの端末が2万円で買えるというのはありがたいですね。
開発にも有効活用していきたいと思います。

2011年10月14日金曜日

ISW12HT EVO 3Dに機種変更。

発売翌日の10/08、秋葉原のヨドバシカメラで ISW12HT EVO 3D に機種変更してきました。
それまではCASIOのW53CAを使っていました。使っていた期間は3年と9ヵ月くらいです。とても良い機種だったと思います。
といっても、最近はHTC Desireと2台持ちの生活を続けていて、通話とメールにしか使っていませんでした。

さて、ISW12HTを1週間ほど使ってみての感想です。
最初、フィーチャーフォン(普通のケータイ)との違いに戸惑いましたが、だんだん慣れてきました。
元々データ通信専用端末としてAndroid機は使ってたので、慣れなきゃいけないのは通話と絵文字くらいでしょうか。

通話はそんなにしないのですが、W53CAでは0キー長押しで奥さんにかけられるように設定してあったので、同様の操作ができないのは困りました。
その後、奥さんに電話するアプリを作ったのですが、そんなことしなくても連絡先のショートカットを張ればよいことに気付きました。
今では便利に使ってます。

絵文字は奥さんとのメールに必須です。
といっても使うのは数種類ですけど。
絵文字が入力できるのはありがたいのですが、絵文字入力状態に切り替えるときに少しモタっとしますね。ちょっと重いです。
絵文字入力するのがちょっと面倒になりますね。

Desireと比べて端末の容量が増えたのがかなり嬉しいです。アプリのやりくりをしなくてすむようになりました。
WiMAXはエリアがまだ狭いみたいですが、使うと速いのがわかりますね。
3Dカメラは時々撮影してますが、どうなんでしょ?最初だけな気がしないでもありません。
バッテリーは僕の使い方だと全然足りません。Desireの時は大容量バッテリーに交換して使ってましたが、今回は外付けのモバイルチャージャーを買うことにしました。
そのほかの機能は、Desireでも使っていたものがほとんどなので、大した不満はありません。

やっぱり新機種は良いなぁ~。