2012年9月6日木曜日

ダブルクリックでジャンプできるようにログを出す方法

LogCatのダブルクリックでコードにジャンプする機能を利用する方法について考えてみたメモ

コード


まとめ

色々試した結果
at クラス名(ファイル名:ライン数)
がログに含まれているとLogCatでダブルクリックした時にコードにジャンプ出来るようです。
上記のコードではログの可読性向上のため、getPadding()でタブ数を計算してジャンプ用ログを整列しています。

こんな感じでログが出ます。


2012年9月1日土曜日

ロックスクリーンを考慮して処理の再開を行う方法

この動画に「Lock Screen時は音楽再生を止める」というTipsがあったので、試してみたメモ

Google Developers Live
[JP 日本語] Google Play での Android アプリ提供ことはじめ
22分40秒あたり

コード


まとめ

  • アプリが開いている状態でスリープから復帰した場合、ロックスクリーンが表示されていても、onResume()が呼ばれる
  • ロックスクリーンが表示されているかの判定はKeyguardManager#inKeyguardRestrictedInputMode()で可能
  • ロックスクリーンを使用していない場合への考慮も必要
  • ロックスクリーン解除時は、ブロードキャストインテントandroid.intent.action.USER_PRESENTがシステムから通知される

その他

KeyguardManagerですが、API Level 16からisKeyguardLocked()/isKeyguardSecure()が追加されたようです。
isKeyguardLocked()でもロックスクリーン表示の判断が行えました。
isKeyguardSecure()はロックスクリーンにパスワードやパターンなどが設定されている時にtrueを返すようです。
※ API Level 15のIS11LGでも上記のメソッドが使用出来ました。リファレンスの誤記でしょうか?

参考にしたサイト
Yukiの枝折
Android:キーガードはActivityではなくViewであることの影響

2012年8月18日土曜日

LruCacheの使い方

TwitterのツイートをListViewに表示するという処理で、TwitterアイコンのキャッシュにLruCacheを使ってみたメモです。

馴れ初め(ダイジェスト)

TwitteアイコンのキャッシュにSoftReferenceを使っていたのですが、2.2 と 2.3 / 4.xで挙動が違って困っていたところ、以下のツイートに出会う。


ということで、Android Training「Caching Bitmaps」で使われていたLruCacheに辿り着いた次第です。
http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Twitter と 有益な情報をツイートしてくれる方々に感謝です。

コード


使い方

LruCacheはAPI Level 12からのクラスですが
http://developer.android.com/reference/android/util/LruCache.html
Support Libraryに入っているので
http://developer.android.com/reference/android/support/v4/util/LruCache.html
API Level 4から使えるようになっています。

使い方としては
・KeyとValueの型を指定してインスタンス化する
・LruCache#sizeOf()をオーバーライドしてBitmapのByte数を返してあげる
だけです。

Android TrainingのサンプルコードではBitmap#getByteCount()を使っていますがAPI Level 12からのメソッドなので上記の処理に書き換えています。
上記のコードではキャッシュサイズを1MB固定にしていますが、端末のDalvikVMヒープサイズから動的に決めたい場合は、Android TrainingのサンプルコードのようにすればOKです。

あとは、Twitterアイコン画像URLをKeyにBitmapをキャッシュしておいて、画像使用時にImageCache.getImage(Twitterアイコン画像URL)がnullだったら再取得というような処理にしておけばよいかと思います。

まとめ

2.3以降GCがモア アグレッシブになっているので、SoftReferenceを使用した場合、ListViewの行が画面から消えるとすぐに画像キャッシュがクリアされてしまう。
従って、今後はLruCacheを使いましょう。
といったところでしょうか。

LruCacheを利用することで、SoftReferenceを使用した場合の2.2 と 2.3以上でキャッシュの挙動が違うという問題が解決できました。
公式ドキュメントはちゃんとチェックしておかないとダメですね。。

因に僕は、常にこの構成でデバッグしています。
書いたコードに対してすぐにバージョン間の差異が確認できるので良いかなと思っています。
今のところ誰からも賛同を得られていませんが...

Fragmentationと共に生きる方法
http://neta-abc.blogspot.jp/2012/08/fragmentation.html


2012年8月11日土曜日

エミュレーター・実機に文字列を流し込む方法

最近多用している便利なコマンドのメモです。

adb shell input text <文字列>

エミュレーター・実機でテキスト入力欄を選択して、上記のコマンドを実行すると文字入力ができます。
<文字列>の部分に日本語は使えません。
端末のIME設定が入力に反映されますのでローマ字入力してあげれば日本語の入力も可能です。

adb shell
input text <文字列>
でも使えますが、adbを切断したときにコマンド履歴は消えてしまうので
adb shell input text <文字列>
とやったほうが、コマンド履歴から再利用できて良いと思います。

Facebookのテストアカウントとか使ってるとメールアドレス長くて手入力は辛いですよね。。

MacでInkscapeを使う(画像取り込み編)

Inkscapeに画像ファイルを取り込もうとしてハマったのでメモしておく。

ドラッグ&ドロップ

Windows環境ですと、画像ファイルの取り込みはExplorerからドラッグ&ドロップすればOKですが、Mac環境では、ドラッグ&ドロップは受け付けてくれませんでした。
X上で動いているからでしょうか?

コピー&ペースト

なので、今度はコピー&ペーストを試してみましたがこんな感じに...


インポート

で最後に辿り着いたのがインポートです。
メニューの[ファイル] - [インポート]から開きます。
拡張子のフィルタを[すべてのイメージ]にして、取り込みたい画像ファイルを選択すればOKです。
後は、画像を「リンク」にするか「埋め込み」にするか聞かれますのでお好みで。
・リンクにすると、画像ファイルを移動したときにリンク切れになります。
・埋め込みにすると、SVGファイルに埋め込まれるのでファイルサイズが大きくなります。


これで画像が取り込めるようになりました。
Windows環境と比べると少し面倒ですね。

2012年8月4日土曜日

Fragmentationと共に生きる方法

ADT20から1クリックで複数の実機・エミュレーターにアプリをDeploy出来るようになっています。

ADT 20 Preview 3 メモ
http://neta-abc.blogspot.jp/2012/06/adt-20-preview-3.html

この機能を利用すれば、デバッグが少し楽になるんじゃないかと思い試してみました。

機材

・MacBook Air (13-inch, Mid 2012)
・USBハブ(U2H-TZS420Sシリーズ)
 http://www2.elecom.co.jp/cable/usb-hub/u2h-tzs420s/index.asp
・Nexus S(4.1)
・IS11LG(2.3)
・IS06(2.2)


今回使用したUSBハブはセルフパワー対応の物を選んでいます。
アダプタの出力が2.0Aなので、4ポートフルに使った場合でも1ポート当たり500mAは供給される計算です。
複数の端末を使って開発しているとバッテリーマネジメントがストレスだったりします。
今回はその辺りの解消も目指します。
※そもそも、バスパワーだと電力不足で4台も繋げない気もします。確認してませんが...

あとは、ポート単位でON/OFFスイッチが付いている所が、このUSBハブを選んだ理由です。
特定の端末を一時的に切り離したい時に、面倒なUSBの抜き差しが不要なので便利かと思います。

動作確認結果

DDMSで見ると、USBハブ経由で3台の端末が認識されています。

プロジェクトの設定は[Run As] - [Run Configurations...]から行います。

この状態でプロジェクトを実行して見ましたが、問題無く3台の端末にアプリをDeployできました。

まとめ

先日からこの構成でデバッグを行っていますが、Androidのバージョン違いで動作が異なる部分に気付いたりして、楽しく(?)開発を進めています。
タイトルのFragmentationとは離れますが、端末間で通信するアプリのデバッグなんかにも良いんじゃないかと思います。