Android Tips その2 Intent 画像の取得篇
こんにちは、最近浦和レッズの不振に悩む、いわたです。
今日は、久しぶりにAndroidについて書いてみようと思います。
国内でのスマートフォン市場をみた場合に、Androidは、iPhoneに比べると国内ではまだまだユーザー数は
少ないのが現実です。
しかし、世界に目を向けてみると、
<以下記事抜粋>
世界スマートフォン市場でAndroid搭載機が躍進、2012年のシェアは14%に
米国の市場調査会社Gartnerがまとめた世界スマートフォン市場の動向予測によると、
Android搭載機のシェアは、現在の2%未満から2012年には14%まで拡大する見通しだ。
現在、世界のスマートフォン市場でシェア1位のOSはフィンランドのNokiaが開発したSymbian OSで、
全スマートフォン製品の約半数に搭載されている。だが、そのシェアは2012年に39%まで減少するとGartnerはみている。
このSymbian OS搭載スマートフォンに代わってシェアを拡大するのがAndroidスマートフォンだ。
Android端末は、2012年には市場シェアでiPhone やWindows Mobile端末、BlackBerryを抑えて、
Symbian OS端末に次ぐ第2位に躍進すると、Gartnerのアナリスト、ケン・デュレイニー(Ken Dulaney)氏は予想している。
2012年の世界スマートフォン市場(Gartnerの予測)
第1位 SymbianOS 販売台数2億300万台(シェア39%)
第2位 Android 販売台数は7,600万台(同14.5%)
第3位 iPhone 販売台数は7,150万台(同13.7%)
第4位 WindowsMobile 販売台数6,680万台(同12.8%)
第5位 BlackBerry 販売台数6,525万台(同12.5%)
という報告がされています。
また、国内でも現在販売しているドコモでは、販売機種を拡大していく予定みたいです。
この数字だけでは、AndroidとiPhoneを比べた場合、あまり違いがわかりませんが、
AndroidOSはスマートフォンだけではなく、ネットブックや組み込み系のデバイスにも搭載することができることが大きな違いであり、OSとしての潜在的な市場可能性はiPhoneの比ではないでしょう。
機能面を比べても、スマートフォンに特化したiPhoneOSとAndroidではどちらが良いとかではなく、違ったものです。
実際に様々な勉強会やフォーラムに参加すると、参加者は、大手電機メーカーやモバイルとは関係性の薄い会社の方々とよくあいます。
やはり、オープンなAndroidはコストの面やプラットフォームを統一することでメーカーを超えた様々なデバイス同士の連携などが可能となり、魅力的なOSだと思います。
(モバイルアプリ開発としては、まだiPhoneの方がUIの設計などはライブラリが豊富でやりやすいですが。。)
おそらくスマートフォンのアプリケーションからみた場合は、iPhoneのほうがMacのデザイン性やUIなどのクオリティの進化などを考えると、今後もiPhoneのほうが、数や機能では上をいくのではと思いますが、OSとしてみた場合は、閉鎖的なiPhoneと比べAndroidのほうが数を伸ばしてくると思います。
前置きが長くなってしまいましたが、今日は、Androidの良く出来ているなと思う機能のIntentとContent Providerについて簡単に書いてみたいと思います。
インテントには意図や目的という意味があり、主にアクティビティを起動する際のパラメータに使われます。
と言ってもよくわからないと思うので、噛み砕くと、アクティビティとはAndroidにおいて、アプリケーションがユーザーとのインターフェイスをとるための基本単位です。MVCモデルでいうところのView(V)に相当するものかなと思います。
ここで重要なことは、Androidはアクティビティを基本単位としているので、異なるアプリケーションのアクティビティ同士で呼び出しができることです。
複数のアプリケーションで連携作業が容易にできることはとても面白いことです。このアクティビティ間の呼び出しを行うための
仕組みがインテント(Intent)です。
Intentには明示的な呼び出しと、暗黙的な呼び出しの2通りがあります。
明示的な呼び出しは、アクティビティを直接指定して起動させるのに対し、暗黙的な呼び出しでは、明示的に起動させるアクティビティを指定せずにインテントのパラメータに起動するアクティビティをある程度推測できるだけの情報(インテントフィルター)を入れておくと、該当するアクティビティが起動するようになっています。
面白いことは、起動元からは実際に起動するアクティビティが何なのかわからないというところです。
実際に、今回は暗黙的な呼び出しを行い、画像を集めたGaralley(フォトアルバム的なアプリケーション)の呼び出しを行ってみます。
(意外にネットや本には載っていませんでしたね)
インテントの発行
Intent intent = new Intent(Intent.ACTION_PICK); // アクションとしてピックを指定する
intent.setType(“image/*”); // タイプとしてimageを指定、要するに画像をピックするインテントを作成
startActivityForResult(intent, REQUEST_PICK_CONTACT); // アクティビティのスタート REQUEST_PICK_CONTACTは任意のIDです
これだけで、自動的にGaralleyが起動します。(これだけだとアプリケーションのGaralleyが起動するというよりは、Android内の画像を集めてGaralley Viewに
表示していると言ったほうが適切ですね。)
その後に、何か画像が選択された場合は、OnActivityResultで結果を受けます。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_PICK_CONTACT){
//Content Providerとは、全てのアプリケーションからデータの読み書きが可能なオブジェクトで、パッケージ間でデータ共有を行う唯一の手段
Uri photoUri = data.getData();
ContentResolver cont_reslv = getContentResolver();
if (photoUri != null) {
try {
mBitmap = MediaStore.Images.Media.getBitmap(cont_reslv, photoUri);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
上でおこなっていることは、選択された画像のURIを取得、ContentResolverというオブジェクトを作成し、MediaStore.Images.Media.getBitmapで
実際の画像を取得しています。
この他にもアドレス帳の情報を取得することや、電話をかけるなどなど多数のことがIntentを使用して出来るのでいろいろと試してください。
検索すればアドレスなどはいろいろと出てきます。
- 2009年10月30日
- Android