Android: 画面に合わせて画像を縮小して読み込む

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Nexus OneやDesireではエラーが起きなくなったのに、HT-03AではOut of Memoryによる強制終了が頻発。これをどうやったら解決できるのか?色々と考えたけれど、DDMSを使ってHEAPのメモリ使用量を見たら、圧倒的に画像が占めているぽかったので、Bitmap自体のメモリ使用率を下げること以外に方法はないのだろうと。じゃあ、どうすればいいか?読み込む画像サイズを、BitmapFactiory.decodeStream()で読み込むタイミングで大きすぎる画像は小さくして読み込んでやれば、使用するメモリ量は少なくて済むだろうと。なんでも、Xperiaで取った写真を読み込んだだけでOut of Memoryが発生したりするから、サイズを最適化したらいいというのを見て、ネット上の画像でもできるだろうと判断。通信は複数回になっているのかもしれんが、まぁわからん。

しかし、やってみたんだが、思ったよりもいい結果が得られなかった。

// AsyncTask.doInBackgroundの中。引数はurls

HttpGet httpRequest = new HttpGet(urls[0]);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
InputStream is = bufHttpEntity.getContent();

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
// 画像の大きさだけ取得
image = BitmapFactory.decodeStream(is, null, opts);
is.close();

Log.d(TAG, "before opts.outWidth = " + String.valueOf(opts.outWidth));
Log.d(TAG, "before opts.outHeight = " + String.valueOf(opts.outHeight));

// DisplayMetricsをActivity側でキャッシュしておいたと仮定
DisplayMetrics metrics = MetrixCache.get();
if (metrics != null) {
	Log.d(TAG, "run metrics.widthPixels = " + String.valueOf(metrics.widthPixels));
	Log.d(TAG, "run metrics.heightPixels = " + String.valueOf(metrics.heightPixels));
	int zoomWidth = (int)Math.floor(opts.outWidth / metrics.widthPixels);
	int zoomHeight = (int)Math.floor(opts.outHeight / metrics.heightPixels);
	opts.inSampleSize = Math.max(zoomWidth, zoomHeight);
}
// 今度は画像を読み込む
opts.inJustDecodeBounds = false;

is = bufHttpEntity.getContent();
// 最適な画像サイズで読み込む
image = BitmapFactory.decodeStream(is, null, opts);
is.close();
return image;

opts.inSampleSizeはintで指定するため、値が2になった途端に、縦横比は半分に(画像サイズは1/4)になるので、やけに荒くなる。しかもぎりぎりで2に届かないものはオリジナルで読み込まれるので、メモリ消費もでかくて役にたたんと判断。判断というか、HT-03Aの強制終了が起きたから、しゃーない。あと、inputStreamを2度使うから、やっぱり2回通信が発生しているのかもしれない。確かめてないけど。とにかく、別の手段を考える。

いったん画像を読み込んで、機種の解像度に合わせて画像をコピーし直す方式にしてみた。

HttpGet httpRequest = new HttpGet(urls[0]);
HttpClient httpclient = new DefaultHttpClient();
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
InputStream is = bufHttpEntity.getContent();

image = BitmapFactory.decodeStream(is);
is.close();
DisplayMetrics metrics = MetrixCache.get();
if (metrics != null) {
	// 画像の大きさを最適化する
	Log.d(TAG, "before image.getWidth() = " + String.valueOf(image.getWidth()));
	Log.d(TAG, "before image.getHeight() = " + String.valueOf(image.getHeight()));
	float s_x = (float)image.getWidth() / (float)metrics.widthPixels;
	float s_y = (float)image.getHeight() / (float)metrics.heightPixels;
	float scale = Math.max(s_x, s_y);
	if (scale > 1){
		int new_x = (int)(image.getWidth() / scale);
		int new_y = (int)(image.getHeight() / scale);
		Log.d(TAG, "new_x = " + String.valueOf(new_x));
		Log.d(TAG, "new_y = " + String.valueOf(new_y));
		image = Bitmap.createScaledBitmap(
				image,
				new_x,
				new_y,
				false);
		Log.d(TAG, "after image.getWidth() = " + String.valueOf(image.getWidth()));
		Log.d(TAG, "after image.getHeight() = " + String.valueOf(image.getHeight()));
	}
}
return image;

あれだけ頻発していたHT-03AでのOut of Memoryが影を潜めた。さらに、画面の解像度に合わせて画像サイズを最適化するため、そんなに画像も汚くはない。この方式ならば、フォトフレームなどで使うにしても、きれいな画像が表示できそうだ。今のところは、これが一番よさそうなので、採用!!


Android: GridView更新後にスクロール位置を保つ

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Android: GridViewに次へボタンを仕込むを書いたときの課題として、『次へボタンを押した後にスクロール位置を保持する』というのがあったのですが、それが出来ましたので、備忘録として書いておきます。

  1. 次へボタンが押されたら、先にGridView.getLastVisiblePosition()で現在位置を取得し、アクティビティのメンバ変数(mPosition)などに保存
  2. 今まで通り、次のデータを取得して、GridView.setAdapter(adapter)する
  3. その直後、GridView.setSelection(mPosition)を実行

という感じですねー。これで、次へボタンが押されたら、次のデータが画面に表示されています。今回はそのほうが都合がよかったのでそうしたのですが、もし次のデータでなく、次へボタンを押す前のデータが表示されてて下にスクロールしたら次のデータが見るようにしたい!ということだったら、getLastVisiblePosition()ではなく、getFirstVisiblePosition()を使いましょう。


Android: SoftReferenceでOut of Memory対策

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

現在Androidで画像を扱うアプリを作っているのですが、Androidの場合、画像を大量に扱うと、あっという間にメモりを使い果たしてOut of Memoryで強制終了してしまうという悲しい現実があります。画像をある程度キャッシュするようにしないと、毎回画像をインターネットからDLすることになってパフォーマンスは低下するし、かといってキャッシュするとOut of Memoryが発生する…。

Web+DB Press Vol.57で、onPauseのタイミングで大きなリソースは解放してしまい、小さなリソースのみキャッシュするというふうにするとOut of Memoryが発生しにくいというふうに書かれていたので、サムネイルのみキャッシュして、でかい画像は全くキャッシュしないように実装してみたのだけれど、どうもしっくりこない。やっぱりパフォーマンスが落ちるからでしょう。

パフォーマンス対策のみならずメモリ対策もどうしたらいいのかな〜と思案していたのですが、TechFirm Android LabさんのブログでSoftReferenceが紹介されていました。

SoftReferenceを使うと、メモリがOut of Memoryになりそうになると、優先的にGCされるそうです。これを使っておけば、Out of Memoryに悩まされることもなさそうです!BitmapオブジェクトをSoftReferenceでラップするようにして使うようです。

public class ImageCache {
  private static HashMap<String,SoftReference<Bitmap>> cache = new HashMap<String,SoftReference<Bitmap>>();
  public static Bitmap getImage(String key) {
    if (cache.containsKey(key)) {
      SoftReference<Bitmap> ref = cache.get(key);
      if (ref != null) {
        return ref.get();
      }
    }
    return null;
  }  

  public static void setImage(String key, Bitmap image) {
    cache.put(key, new SoftReference<Bitmap>(image));
  }

  public static boolean hasImage(String key) {
    return cache.containsKey(key);
  }

  public static void clear() {
    cache.clear();
  }
}

さっき画像を大量に扱うアクティビティで試してみたら、全く落ちなくなっていて感動です!あぁ〜、2週間前から知っていたらなぁ〜。いや、そういう経験を積んでこそ成長するんですが。TechFirm Android Labさん、貴重な情報をありがとうございました!


Android: GridViewに次へボタンを仕込む

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

GridViewで、twicca(Androidのtwitterアプリ)みたいに、リストビューの下のほうにスクロールしたら、『もっと読む』みたいなボタンをつけたいと思っていたのだけれど、GridViewにはListViewのようにヘッダーやフッターをつける方法がない。最初は無理やり、ScrollViewの中にLeniearLayout(GridViewとButton入り)を入れればできるかなと思っていたのだけれど、世の中甘くなかった。LeniearLayoutのlayout_widthをfill_parentにしても、そうなってくれないようなのである(EclipseのViewエディター上で確認)。元々GridView自体がScrollViewを内包しているためか、やっぱり思ったとおりにはなってくれないので、諦めかけていた。

twitterで諦めた宣言をしていたら、yokmamaさんからアドバイスをいただけたことで、閃いた。

ソースコードは今手元にないので、後日公開するとして(本当か?)、考え方はこうだ。
GridViewに渡すAdapterをImageAdapterとした場合、

  1. ImageAdapter.getCountの結果を1増やす。つまり、画像が20枚ならば、21にする。
  2. ImageAdapter.getViewで、
    positionが20未満の場合は今までと同じ処理(画像用)で画像を返す。
    20の場合は次へボタンを表す画像を返す
  3. GridView.setOnItemClickListenerで、positionが20未満の場合は今までと同じ処理。
    20の場合は次の20件をダウンロードしてImageAdapterを更新する処理を行う。

つまり、ダミーのGridViewアイテムを準備して、そいつがクリックされたらダウンロードという作戦。フッターを準備するのではなく、ImageAdapter側を変則的にすることで解決するという方法なので、ImageAdapterクラスの一貫性としては損なわれるのであるが、実装できなければ話にならない。それがプログラムという世界である、なんつって~…(ごめんなさい、実力がないだけです)。一列に画像が4枚あるとしたら、以下のようになります(■が画像、□がダウンロードボタンとする)。

■■■■
■■■■
■■■■
■■■■
■■■■

とりあえずはこれで次へボタンっぽい動きにはなった!しかし問題はまだあって、ListViewのようにInflatorを使っているわけではないので、追加されるというよりは、要素を増やしてGridViewを再描画するということになるため、処理が走るとスクロールバーが一番上に戻ってしまう。スクロールバーの位置を覚えておいて、ダウンロードボタンが押されてGridViewの再描画が行われたと同時に、スクロールバーの位置を変えてやらなければならないかなぁと思ってます。

本当にAndroidのレイアウトは奥が深いなぁ~と思い知らされる毎日。

(追記)
Android: GridView更新後にスクロール位置を保つを書きました。


Android:searchableを使用する方法

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

MapActivityを使っているときに、地名検索ができるといいのになぁと。その際にGoogleが提供しているMapアプリのように検索ボタンを押したら画面上部に検索フォームが出てきて、さらにボイス検索まで出来たら素晴らしいのだろうが、これは一体どうやてやるのだろうか?と思って色々と検索していたら、わかりやすく紹介されている方がおられたので、それを参考にした。

searchableを使用する方法 – haruserのめもちょ

なお、今回は検索フォームで入力された内容をToastで表示するまでをやります。
さらにさらに、今書いている環境が実際に作業した環境ではないので、かなりうろ覚えで書いてます。多分大丈夫だと思うけれど、間違っていたらすみません。ご指摘お願いします。

1.まず、/res/xmlにsearchable.xmlを作成する。

<searchable
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:label="@string/search_label"
  android:hint="@string/search_hint"
  android:imeOptions="actionSearch"
  android:searchMode="showSearchLabelAsBadge"
  android:inputType="text"
  android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" />

android:voiceSearchModeを上記のように設定しておくだけで、音声検索対象言語は端末に設定されている言語になるようなので、日本語を選択している場合はこのままでいいし、外国語の場合でも勝手に外国語になってくれるっぽいです。固定にしたい場合はほかのパラメータを追加していくことになりそうですが、今回は必要ないので設定していません。また、音声検索できない端末の場合は、音声検索ボタン自体が表示されません(Nexus One, Desireで表示されたが、HT-03Aで表示されなかったことを確認)。

2.次に呼び出し元のActivityの設定を行うためにマニフェストを修正します。
今回は検索フォームに入力された内容を自分自身のアクティビティに渡します。
違うアクティビティに渡したい場合は、上のほうに書いたURLのほうをご参照ください。

<activity
  android:name="Map"
  android:label="@string/app_name"
  android:launchMode="singleTop">
  <intent-filter>
    <action android:name="com.example.VIEW_SEARCH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.intent.action.SEARCH" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
  <meta-data android:name="android.app.default_searchable"
             android:value="Map" />
  <meta-data android:name="android.app.searchable"
          android:resource="@xml/searchable" />
</activity>

3.onSearchRequestedメソッドを呼び出します。
検索キーが押されたらコールされますが、メニューなどに検索を付けている場合は、メニューボタンが押されたらonSearchRequestedを呼び出すようにしておきましょう!

4.Activityに、onNewIntentを実装しましょう。
検索と結果が同じ画面でandroid:launchMode=”singleTop”が指定されていれば、onNewIntentメソッドが呼び出されるので、そこで検索処理を実行します。

@Override
protected void onNewIntent(Intent intent) {
  if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
    String query = intent.getStringExtra(SearchManager.QUERY);
    // 検索処理を実行 今回はToastを表示
    Toast.makeText(this, query, Toast.LENGTH_LONG).show();
    // 自分がやった実装ではGeoCoderで地名検索させて、Addressに変換させた。
  }
}

1つのアクティビティ内で完結する検索フォームの実装方法は、思ったよりも簡単でよかったです。searchableを使わない場合は、もうひとつ検索用ActivityをかませてIntent経由で結果を取得して、となるので、検索用Activityのレイアウトを実装しなければならなかったりと、面倒なことが多そうなので、こちらのほうがスマートかなと思います。

今回の実装はあんまりコード書いてないのに音声検索までできてしまうので、人に見せたら「スゴイ!!」と言われてちょっと嬉しかったりする。。。(^_^;)


Android: 端末の回転時にActivityを再起動させない方法

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

Android端末がの画面の向きが変わったときに、Activityが再起動してしまう。これは、アプリの整合性を保つ為には必要であるらしいのですが、現在自分が作っているアプリケーションにとっては問題あり。最初はonDestroyが走る前に状態を保存して再起動したときに状態を復元するように作成するのが正しいのかなと思っていたのですが、本を見ていたら、簡単に解決する方法を見つけました。Activityの再起動自体をさせない方法です。

  1. ActivityにonConfigurationChangedメソッドを実装
  2. マニフェストファイルのActivityの定義に、android:configChanges属性を追加

コンフィグが変わったことを検知して呼ばれるメソッドを実装。
今回は、端末の回転のみ検知するようにしてあります。(後のマニフェストにて)

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  Log.v("TEST", "onConfigrationChanged was called!!");
}

マニフェスト側で、configChangesにorientationを指定。これで回転のみを対象とします。

<activity android:name=".TestActivity" android:label="@string/app_name" android:configChanges="orientation">

これで、端末の向きを変えてもActivityが再起動しません!!

Androidアプリを開発するには、この本が一番内容が充実していますね。会社にはあるんだけど、実は個人ではまだ買ってない…。


夏風邪

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

多分もう大丈夫なのですが、夏風邪を引いてしまいました〜…。自己管理がなってないということか。どうも冷房に弱いので、毎年この時期になると必ず夏風邪で寝込んでいるような気がします。今回は予定の詰まっていた金・土に当たってきたのだけど、その際はまだ症状が弱かったので、なんとかやり過ごせたけど、日曜日からどーんと発症。今日も朝起きたら治ってることを期待していたのだけれど、全然駄目でした。昼過ぎに起きたら、すっきりしてたけど。嫌な汗がだいぶ出たので、もう大丈夫かなとは思いますが、久々に有休を使ってしまいました。まぁしゃーない。

案外寝ることができたので、睡眠不足からくる疲れもひょっとしたら溜まっていたのかもしれません。やっぱりほどほどに寝ないと頑張り続けられないということですかね〜。それでも毎日5〜6時間程度は寝ていたんだけど。早いところこなさなければならない案件があるので、それを終わらせて、ぐっすりと眠りたいものです。本当は休んでいる場合ではない…。


Android: HorizontalScrollViewとScrollView

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

今作っているAndroid用アプリで、Desireにデフォルトで入ってるギャラリーアプリのように、画像を拡大したときにドラッグで画像内移動をできるようにしたいと思って研究中なのだけど、なかなかうまくいかない…。

最初はアニメーションで拡大したものをドラッグでと思っていたのだが、今のところこの方法ではうまくいってない。

次に、ImageViewでScaleTypeをmatrixにして、やっている最中。アニメーションはまだ実装できていないが、微妙にやれそうな感じがしている。ただ、課題も多い…。それにアニメーションを付けられるのか?という感じ…。

同僚に、「iPhoneアプリのときにはScrollViewを使って云々…」というのを聞いて、なるほど!ScrollViewを使うという方法があったか!?と思ってやってみるも、横スクロールができんじゃないか!?と思って憤慨していたら、横スクロールはHorizontalScrollViewを使えと…。で、HorizontalScrollViewを使うと今度は縦スクロールができない。なので、HorizontalScrollView内にScrollViewを入れ子にして、そのScrollView内にImageViewを入れてみたら、思っていたような感じになったかに思えた。ところが、スクロールが斜めに反応してくれない。縦にスクロールしているときは縦だけ、横にスクロールしているときは横だけにしか反応してくれないのだ。

Androidのブラウザでは、斜めに動いてくれて、その際にスクロールバーも両方(縦も横も)表示されているのに、アプリになるとできないのだろうか?謎は深まるばかり…。ちなみにこれにハマってもう3日目。精神的につらいです…。


Android: metersToEquatorPixelsが便利

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

GoogleMapを使ったアプリを開発中なのだけれども、指定地点から円を描きたいな〜と思っていた。円を描くこと自体は、CircleOverlayクラスを作って書けたのだけれども、問題は半径である。ピクセルで指定しなければならない。でも、ZoomLevelによって縮尺は変わるので、一体1ピクセルが何メートルなのかをどうやって出せばいいのだろうかと考えていたのだが、ふと同僚が持っているAndroidプログラミング入門を見たら、いちいち計算しなくてもメソッド一発で取得できることがわかった!1時間半も悩んだのに〜!!

private class CircleOverlay extends Overlay {
	private GeoPoint mPoint;

	public CircleOverlay(GeoPoint point){
		mPoint = point;
	}

	@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		super.draw(canvas, mapView, shadow);
		if (!shadow) {
			Projection projection = mapView.getProjection();
			Point point = new Point();
			projection.toPixels(mPoint, point);

			float pixels = projection.metersToEquatorPixels(10000);

			Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
			paint.setColor(Color.RED);
			paint.setAlpha(80);
			canvas.drawCircle(point.x, point.y, pixels, paint);
		}
	}

	@Override
	public boolean onTap(GeoPoint point, MapView mapView) {
		mPoint = point;
		return super.onTap(point, mapView);
	}
}

ズームしたら自動的に半径のサイズも変わってくれたのを確認。
すごく便利じゃないか!!


ABC2010 Spring行ってきました~!

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加

もう火曜日だけど、報告っつーことで。

Android Bazaar and Conference 2010 Springに参加してきましたー!

うちの会社の人と2人で愛媛から車で参加してきたので、移動が超大変だった…(>_<)
金曜日に仕事終わってから家にも帰らず19時に松山を出発。横浜に到着したのが午前4時半。なぜ横浜かといえば、駐車場代が安いのと、移動は電車のほうがよさそうだったから。8時まで仮眠してから、東京大学駒場キャンパスに移動。初めて東大に入ったー!!

東京大学 入り口

Androidユーザ会の集まりだけあって、愛媛ではほとんど見なかったDesireがそこかしこに。NexusOneも、Xperiaも大量に。すごい。それだけでなんだか嬉しい。

すごく寝不足だったが、せっかく愛媛から来たのだから全部聞いてやろうと思って、リポビタンD注入して、なんとか寝ないで聞いた。

最初は日本Androidの会の基調講演。丸山 不二夫さん。
以下の文は、私が講演を聴いて思ったことなども含まれているので、客観的な感じじゃない部分も多々あると思いますがご容赦。

Androidの機種が発売されてから現在まで、どのような勢いでAndroidが広まってきたか。そして、日本でも遂に各3キャリアからAndroidケータイが発売され、確実に認知度は増している。流れ的に今秋以降、Androidが爆発的に普及していくだろう。それからAndroid2.2の説明。でも次の講演がGoogleさんなのでザックリと。

  • HTML5とFlashのサポート(iOSとは異なる完全なるWebサポート)
  • ケータイの広告プラットフォーム化
  • インターネットトラフィックはモバイル端末からのものが増え続けている
  • 5年以内にPCからのトラフィックを抜くだろう

iPadの登場でタブレット市場が全く別のものになってしまった。まるでiPadが初めてのタブレットと勘違いさせるくらいに。HP(ヒューレットパッカード)もHP Slateを作成中。Windows 7版とAndroid版。Googleもタブレットを構想中。だが、当初はChromeOSを使う予定だったが、Androidになるんじゃないだろうか?とのこと。

そして、メディアと未来。
クラウドとクラウドデバイス(iPhoneやAndroid)の成熟により、ようやくデバイスが活きる土壌ができた。この点についてはGoogleのほうが優位に立っているがAppleもクラウドに力を入れていて、でっかいデータセンターを作ってる最中。iPadの登場により、電子書籍の売り上げがゲームの売り上げを超えた。そして、音楽市場もダウンロード販売がCD販売を抜いた。メディアはどんどんデータ化され、クラウドに持たれるようになっていっている。
コミュニケーションツールも爆発的に利用されるようになっている。代表がTwitterとFacebook。これらのコミュニケーションを支えているのはモバイルネットワーク。そしてそのプラットフォームの王者に成りえるのがAndroidである。

あー、なんか書いていてまとまらなくなってきてるような…。
他のは後日書きます。


Get Adobe Flash playerPlugin by wpburn.com wordpress themes