普段はスマホに入っているデフォルトの電話帳を使っているのですが、
連絡先を交換した際に、電話帳の中のどこにいったか分からなくなる事がよくあります。
そこで、新しい順に表示する電話帳を作りました。
基本的にそれだけの機能で、検索とか並べ替えとかできませんw
ただついでに、クリックしたら詳細画面に飛ぶ様にはしておきました。
このアプリ、個人的に非常に便利だと思ってます(笑)
詳細は↓ここから。
RecentlyAddedContacts@アンドロイドマーケット
普段はスマホに入っているデフォルトの電話帳を使っているのですが、
連絡先を交換した際に、電話帳の中のどこにいったか分からなくなる事がよくあります。
そこで、新しい順に表示する電話帳を作りました。
基本的にそれだけの機能で、検索とか並べ替えとかできませんw
ただついでに、クリックしたら詳細画面に飛ぶ様にはしておきました。
このアプリ、個人的に非常に便利だと思ってます(笑)
詳細は↓ここから。
RecentlyAddedContacts@アンドロイドマーケット
下記コマンドでCameraPreviewのソースコードをダウンロードしてください。
Eclipseプロジェクト形式でデモActivity等を含んでいます。
git clone git://github.com/pikanji/CameraPreviewSample.git
webで見るにはここ:https://github.com/pikanji/CameraPreviewSample
Android Marketでもビルドしたものを公開しています。
https://market.android.com/details?id=net.pikanji.camerapreviewsample
プロジェクトに含まれているデモActivityであるCameraPreviewSampleActivity.javaを見ながら使用方法を説明します。
“Android: サンプルの使用方法”の続きを読む
カメラをopenするタイミングをsurfaceCreatedからコンストラクタに変更しました。
public CameraPreview(Activity activity, int cameraId, LayoutMode mode) { . . . if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { mCamera = Camera.open(mCameraId); } else { mCamera = Camera.open(); } Camera.Parameters cameraParams = mCamera.getParameters(); mPreviewSizeList = cameraParams.getSupportedPreviewSizes(); mPictureSizeList = cameraParams.getSupportedPictureSizes(); } @Override public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay(mHolder); } catch (IOException e) { mCamera.release(); mCamera = null; } }
あえてCameraPreview内のsurfaceCreatedではなくコンストラクタでCamera.openするのは、
surfaceCreatedに続くsurfaceChangedが実行される前にカメラプリビューのサイズを
指定しておきたい場合があると考えたためです。
surfaceCreatedが呼ばれるのはCameraPreviewをLayoutにaddした後になりますが、
カメラプリビューのサイズはCamera.openしてからでないと取得できないため
あえてコンストラクタでCamera.openしています。
したがってsurfaceChangedが呼ばれてもsurfaceDestroyでreleaseしたカメラは
openされないので、resumeでCameraPreviewを再度インスタンス化する必要があります。
Androidのカメラ周りはデバイス特性が強く現れるところなので鬼門と言われています。
私がこのサンプルを実装する上でもいくつか問題があったので、なるべく例外で落ちない様な実装を目指しました。
使用する分にはここでの説明は不要だと思いますが、一応、なぜこのような実装なのか説明しておきます。
向きやアスペクト比の補正もだいたいsurfaceChangedで実装してた通り、カメラプリビューの要はsurfaceChangedに入る処理です。
その向きやアスペクト比をする処理はdeterminePreviewSizse, determinePictureSize, adjustSurfaceLayoutSize, configureCameraParametersへ機能別に分けて実装しました。そちらは、特に難しくないと思うので説明は割愛します。
それらのメソッドを呼び出すsurfaceChangedが少し分かりづらいものとなってしまったので説明します。
“Android: 実用的なカメラプレビューの実装(2)”の続きを読む
今回は、より実用的な実装を目指して、いろいろと手を加えてしまいました。
追加した機能は以下の通りです。
・マルチカメラ対応
・表示する位置の指定
・隙間なく表示するモード
・プレビュー準備完了コールバック
・プレビューのフレーム毎/ワンショットコールバック
・信頼性向上の施策
とりあえずコードはここにあります。
https://github.com/pikanji/CameraPreviewSample/tree/practical
下記コマンドで取得できます。
git clone git://github.com/pikanji/CameraPreviewSample.git
説明が必要と思われるところだけ抜粋して説明していきます。
“Android: 実用的なカメラプレビューの実装(1)”の続きを読む
Activityを切り替えるアニメーションをいろいろ設定するための情報は
検索して結構でてくるんですが、逆に完全になくす方法を紹介しているサイトが
見当たらなかったので私が見つけた方法を紹介します。
アニメーションはあった方が基本的に見栄えは良くなりますが、
画面が切り替わっているのを見せたくないなど、
アニメーションが邪魔なこともあるのではないでしょうか。
今回は私が見つけた最も簡単な方法を紹介します。
“Android: Activity切替えアニメーションをなくす”の続きを読む
今回は、IntentでServiceを呼び出したときのServiceのライフサイクルについて説明します。
bindでServiceに接続した場合のServiceのライフサイクルは若干異なるので、
そちらはbindに関する記事の方で説明します。
IntentでServiceを呼び出したときのServiceのライフサイクルを下図に示します。
既に起動しているServiceを複数回startServiceで起動したら、
同じ回数だけonStartCommandが実行されます。
が、stopSelf/stopServiceは1回だけでServiceを終了することができます。
また、Context.BIND_AUTO_CREATEフラグでbindされている場合は、
Service.stopSelfやContext.stopServcieしてもすべてのbindが解かれるまでプロセスは終了しません。
ServiceはonStartCommandなど特定のメソッドを実行中以外は
システムによって終了させられる可能性があるので
onStartCommandで必要な処理をした後は、あえて停止する必要はなさそうです。
が、だからと言ってだらだらとServiceを走らせていたら
悪いことはあってもいいことはないので停止してやりましょう。
意図しない処理が続いていることを防ぐことにもなります。
ちなみに、特定のメソッドとは他にonDestroy、onCreateなどで
確かにこの途中で終了させられたらお手上げですよね。
“Intent起動したServiceを停止する”の続きを読む
以前、常駐するServiceを使用したアプリを作成したときに、
たまーにServiceがNullPointerExceptionで落ちるというのを経験しました。
調べてみるとonStart/onStartCommandの引数のIntentがnullになっていることが原因でした。
ドキュメントによると、onStartCommandでSTART_STICKYを返していると
Serviceがkillされた後に自動的に再起動しますが、
その際に、onStartCommandにnullのIntentが渡される可能性があるとのこと。
ご参考:
http://developer.android.com/reference/android/app/Service.html#START_STICKY
“Android: Serviceがヌルポで落ちる”の続きを読む
ContentWrapper(たいていはActivity)のstartServiceにIntentを渡してServiceを起動します。
Activityを起動するのとほとんど変わりません。
シンプルなのでとりあえずサンプルコードを示します。
“Android: IntentでServiceを起動する”の続きを読む