ソニー・エリクソンのXperia X10(SO-01B)がやっと発表されたっぽい

2010 年 1 月 23 日

しばらく更新してなかったので、久しぶりにブログ更新します。

さて、去年より噂だったソニー・エリクソンのXperia X10がSO-01Bとしてやっと発表されたみたいです。

Xperia X10のスペックや詳細情報はタッチ&トライイベントに行った人のブログでいろいろ紹介されているみたいなので、ここでは、ちょっと気になる点についてまとめてみました。

iモードメール

HT-03Aの頃から要望が多かったiモードメールは今回も非対応の模様です。ただし、「ドコモ山田社長、「Xperiaは新感覚エンタテイメントマシン」 – ケータイ Watch」の記事によると

iモードメールについては、既存サービス「iモード.net」とは別の取り組みとして、年内にも対応する方針が明らかにされた。

とのことですので、2010年中にはなんとか対応がされそうです。(去年も今年中になんとかみたいな話を聞いたような気はしますが。。。w)

Android OS

Xperia X10のAndroid OSのバージョンは1.6のようです。既にGoogle発売のNexus Oneは2.1に対応しているので、ちょっと残念ですね。ただ、将来的にはバージョンアップするような話が開発者ブログに書いてあるという話もあります。自分も探してみたけどちょっと見つけられなかったです。
まぁ、HT-03Aでも1.6に対応された分けなので、そこら辺はそんなに心配いらないんじゃぁないかなとは思います。

FeliCa

もちろん非対応ですw まぁ、FeliCa自体は国際規格から外れてしまっているので、ソニー・エリクソンみたいに世界各国で共通の端末を展開する場合は対応してもらえないですよね。ただ、将来的にはNFCみたいなFeliCa上位互換の非接触ICは搭載されることもあるかもですね。

Biz・ホーダイダブル

スマートフォン契約者必須のパケット定額制サービスでしたが、4月以降はパケ・ホーダイダブルに統合されるそうです。
今までは、1つのSIMカードをガラケーとスマートフォンで差し替えながら使うということが難しかったですが、Biz・ホーダイダブルとパケ・ホーダイダブルが統合されることで、そういった使い方もやりやすくなるんじゃないでしょうか。
っていうか、何気に今回のXperia関連の発表の中では、結構な目玉なんじゃないかと思ったりします。

まとめ

今の所、日本市場でAndroidを一般の人に普及させるにはiモードメールとFeliCaの2つが重要な気がします。FeliCaはハードウェア絡みなので、NFC対応端末を開発してもらうしかないでしょうが、iモードメールについては、ドコモがiモード用メールのAPIを作って公開してくれれば、いくらでも対応ソフトが開発されそうなんですけどね。
すでに、iモード.netっていうwebサービスがあるのだから、APIを開発して公開するのはそんなに難しい話ではないはずです。
なんでもかんでも、自前でやるよりは、余計な囲い込みをやめて自由に開発させた方が、最終的にはドコモも得するとは思うのですが、今まで囲い込みで散々甘い汁を吸ってるからできないだろうなぁと。

まぁ、一番いいのはiモードメール自体がMMSに対応するのがいいような気もしますが、これまた、なかなか難しいだろうなぁ。。。と思ったりします。

Androidで長押し(ロングタップ)やダブルタップのイベントを取得するサンプル

2009 年 9 月 3 日

通常Activityでは画面の長押しやダブルタップ(PCで言う所のダブルクリック)を取得することはできませんが、GestureDetectorクラスを使うことで、長押しやダブルタップのイベントを取得できるようになります。GestureDetectorクラスを使うと他にもいろいろなイベントが取得できるようになるので、いろいろと便利だったりします。

ソースとしては次のような感じになります。
以下の例ではActivityにGestureDetector関連のリスナーを直接実装していますが、書き方はいろいろとできますので、匿名クラスを使ったり専用のクラスを実装したりとかでもOKです。自分の好きな方法でやるといいかなと思います。

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;

public class TestGesture extends Activity implements
            GestureDetector.OnGestureListener,   // 長押し(onLongPress)のイベントが取得できます。
            GestureDetector.OnDoubleTapListener {// ダブルタップのイベントが取得できます。

    /** GestureDetectorを定義する */
    private GestureDetector gestureDetector;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // GestureDetector設定
        // このクラス(TestGesture)をリスナーとして設定
        this.gestureDetector = new GestureDetector(this, this);

        setContentView(R.layout.main);
    }

    /**
     * タッチイベント
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Activityのタッチイベント中でGestureDetectorのイベントを呼び出す
        // 長押しやダブルタップ等はGestureDetector内で判定されて、
        // GestureDetectorに登録したリスナー(このクラス)に処理が振り分けられる
        // if文で戻り値を判定することで、GestureDetectorで処理した後、
        // 通常のonTouchEventをそのまま継続するかどうかを選択できる
        if(this.gestureDetector.onTouchEvent(event)) return true;

        return super.onTouchEvent(event);
    }

    /**
     * 長押しイベント
     */
    @Override
    public void onLongPress(MotionEvent e) {
        Log.v("INFO", "onLongPress");
    }

    /**
     * ダブルタップイベント
     */
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        Log.v("INFO", "onDoubleTap");
        return false;
    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        Log.v("INFO", "onDoubleTapEvent");
        return false;
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        Log.v("INFO", "onDown");
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.v("INFO", "onFling");
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.v("INFO", "onScroll");
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        Log.v("INFO", "onShowPress");
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.v("INFO", "onSingleTapUp");
        return false;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        Log.v("INFO", "onSingleTapConfirmed");
        return false;
    }
}

Androidで使用されるシステムアイコンリソースの保存先

2009 年 8 月 25 日

Android開発等でメニューを表示する際に、

public boolean onCreateOptionsMenu(Menu menu) {
	// ファイルを開くメニュー
	menu.add(0, MENU_OPEN, Menu.NONE, R.string.menu_open).setIcon(android.R.drawable.ic_menu_set_as);
	return super.onCreateOptionsMenu(menu);
}

のような形でシステムアイコンを使用する場合がありますが、ここで指定している android.R.drawable.ic_menu_set_as のシステムアイコンは下記のディレクトリに ic_menu_set_as.png という形式で保存されています。

android-sdk-windows-1.5_r3/platforms/android-1.5/data/res/drawable

通常のメニューに使用するようなアイコン以外にもドロイド君アイコン等いろいろなアイコン(数百種類)が入っていますので、参考に見てみるといいかもしれないです。

ソニエリの話題のAndroid端末Rachael(レイチェル)ですが、日本ではドコモから出るっぽいです。

2009 年 8 月 23 日

ソニエリの話題のAndroid端末Rachael(レイチェル)ですが、日本ではドコモから出るっぽいです。

NTTドコモ、スマートフォン拡充 「グーグル携帯」など

 NTTドコモは携帯電話機世界第2位の韓国サムスン電子と同5位の英ソニー・エリクソンからパソコンに近い性能を持つスマートフォン(高機能携帯電話)を調達する。

~中略~

来年初めにも2社の製品を1機種ずつ発売する。

~中略~

ソニー・エリクソンからは米グーグルが開発した携帯向け無償OS「アンドロイド」を搭載した「グーグル携帯」を調達する。

来年は一気にAndroidが普及しそうです。

それと、あまり話題になっていないですが、中国製のMID端末SmartQ5がAndroidを搭載して、コヴィア・ネットワークス社より9月30日に発売になるっぽいです。

話題のAndroid搭載 MID SmartQ5 国内発売決定

iPhone等と違って、いろいろはハードウェアメーカーから端末が発売されるのがAndroidのいいところですね。

AndroidでBitmapFactoryを使ってサイズの大きな画像を読み込むサンプル

2009 年 8 月 12 日

Androidで開発をやっていると、何度もOutOfMemoryErrorに出くわすことが多いです。Androidは搭載メモリ自体が少なく、1アプリケーションあたり最高で16M。推奨だと8M程度(実際使ってみるとそれより少ない感じ)とされています。そのため、普段PCで開発するのとは違って、結構メモリの容量を意識してプログラムしないといけなかったりします。

普通にちょっとしたプログラムを組む分にはいいのですが、結構困るのはサイズのでかい画像イメージを扱う場合です。特にデジカメなんかで撮った画像は最近のデジカメの画素数がすごいため、jpgファイルの段階で数メガバイトあったりします。

そうした画像をBitmapFactory.decodeFileメソッドなんかで、一度に何枚も読み込んでしまうと、もともとサイズの大きなjpgがメモリ中で展開されて更に大きくなってしまうため、あっという間にOutOfMemoryErrorとなってしまいます。

ということで、そんな場合にはBitmapFactory.Optionsを使って、元画像を読み込む段階で小さくして読み込むといい感じになります。

//読み込み用のオプションオブジェクトを生成
BitmapFactory.Options options = new BitmapFactory.Options();
//この値をtrueにすると実際には画像を読み込まず、
//画像のサイズ情報だけを取得することができます。
options.inJustDecodeBounds = true;

//画像ファイル読み込み
//ここでは上記のオプションがtrueのため実際の
//画像は読み込まれないです。
BitmapFactory.decodeFile(path, options);

//読み込んだサイズはoptions.outWidthとoptions.outHeightに
//格納されるので、その値から読み込む際の縮尺を計算します。
//このサンプルではどんな大きさの画像でもHVGAに収まるサイズを
//計算しています。
int scaleW = options.outWidth / 380 + 1;
int scaleH = options.outHeight / 420 + 1;

//縮尺は整数値で、2なら画像の縦横のピクセル数を1/2にしたサイズ。
//3なら1/3にしたサイズで読み込まれます。
int scale = Math.max(scaleW, scaleH);

//今度は画像を読み込みたいのでfalseを指定
options.inJustDecodeBounds = false;

//先程計算した縮尺値を指定
options.inSampleSize = scale;

//これで指定した縮尺で画像を読み込めます。
//もちろん容量も小さくなるので扱いやすいです。
Bitmap image = BitmapFactory.decodeFile(path, options);

現時点でのAndroidの画面解像度はHVGAしかないので、画像オリジナルの大きさそのものを読み込む必要はあんまり無いってことなんですよね。

特に複数画像を読み込んでサムネイルを作るような場合は、一度オリジナルの画像を読み込んで縮小して。。。なんてことをやってるとすぐにメモリを使い果たしてしまうので、読み込む段階で小さな画像として読み込むと使い勝手がいいんじゃないかなぁと思います。