メイン

Android アーカイブ

2008年06月03日

Android勉強会

早稲田大学主催でAndroid勉強会が定期開催されています。
 http://android.siprop.org/
秋葉原ダイビルの12階にあるwakhok東京サテライト校というところでやっています。

現在、第4回から第6回の申し込み受付中です。
もしご興味がある方は是非ご参加ください。

・申し込みページ
http://android.siprop.org/index.php?%BF%BD%A4%B7%B9%FE%A4%DF

・スケジュール
http://android.siprop.org/index.php?%A5%B9%A5%B1%A5%B8%A5%E5%A1%BC%A5%EB

2008年08月27日

Some information on APIs removed in the Android 0.9 SDK beta - Android Developers Blog

色々と話題になっているAndroid 0.9 SDK beta ですが、Android Developers Blog“Some information on APIs removed in the Android 0.9 SDK beta”を、日本語にしたものを参考までに載せます。


Android 0.9 SDK betaから削除されたAPIについて 2008/8/25 Dan Morrill

今週の初めに、我々はAndroid SDKのベータ版をリリースしました。以下の(前回の)投稿では、Android1.0に向けていくつかのAPIを削除しなければならなかったこと、そしてその結果として、それらのAPIは0.9 beta SDKにも含まれていないし、1.0互換のSDKにも含まれないであろうことについて触れました。今回は、何故そのようにしたのか、その理由について少し説明したいと思います。

・GTalkService

「XMPPService(当初はそう呼んでいました)」が初回のearly-look版SDKに含まれたことは、とてもエキサイティングなことでした。しかしながら、セキュリティをレビューするチームに評価を依頼したところ、彼らはすぐに気付きました。GTalkServiceは、エキサイティングであるのと同じくらい、いくつかの基本的なセキュリティ上の問題を抱えているということに。我々のセキュリティ研究者の一人であるRich Canningsは、この点について以下のように述べています。

GTalkServiceに初めて触れたとき、私はとてもエキサイティングな気持ちになりましたが、それと同じくらい怖い気持ちにもなりました。開発者としては、シンプルなインタフェースでGoogle Talkの友達(以下GTalk friends)との間でメッセージを送ることができる機能が提供されていることに興味を持ちました。メッセージは受信側のデバイスでは扱いが容易な標準のIntentとして取り扱うことが出来ます。なんてシンプルで美しいことでしょうか。しかし残念なことに、Tin Foil Hatをかぶった人(ヤヴァイ人)としてみたときには、このことはそれほど単純なことではないと認識しました。

我々は、以下に述べる理由により、GTalkServiceのデータメッセージングの機能を延期することに決めました。

  1. GTalk friendsに複数の意図を持たせてしまうことについて
    GTalk friendsの目的(意図)は、GTalkServiceによって実現しようとしていることと異なります。あなたのGTalk Friendsは、いつでもIMを使ってあなたとコンタクトを取ることが出来ます。彼らはあなたのメルアドを知ることができますし、あなたの本名も知ることが出来るかもしれません。しかし、GTalk Friendsについての考え方は、必ずしもAndroidアプリケーションによってインタラクトしたい人々に対する考え方と合致しているとは言えないでしょう。例を挙げます。例えば、GTalkServiceを使った、とてもクールなモバイルの、大規模多人数参加型オンラインロールプレイングゲームがあると想像してみて下さい。あなたは、一緒にプレイするために、すべてのプレイヤーをあなたのGTalk Friendsに加える必要があるでしょう。そして、別のあるときに、あなたはWEBかデスクトップPCでGTalkにログインしたとします。あなたはたくさんの新しい「friends」がいることに気付くでしょう。あなたは彼らとチャットをしたいわけではないでしょう。そしてさらに悪いことに、彼らにあなたのメルアドや本名を知られたくないでしょう。Androidユーザーは、他のAndroidユーザーと、匿名で、かつ(特にゲームのシナリオのような)短い間だけインタラクトしたいのだと我々は気付きました。残念ながら、インスタントメッセージングがこのことに対する良い手段ではないと思います。
  2. Intentの送信元を検証することについて
    Intentは、デバイス内でメッセージを送信するように設計されました。Intentサブシステムは、同じデバイスからIntentが生成され送られたときのみIntentの送信元を確実に解決することが出来ます。異なるデバイスからIntentが送られてきたときは、Intentサブシステムは、どのようなアプリがそのIntentを送ったのかを解決できません。このことは様々な問題を生み出す可能性があります。当初は、リモートのアプリケーションは任意のインテントを送信することが出来ました。このことはあなたのGTalk Friendsが、あなた自身と殆ど同じくらいあなたのデバイスを制御できたということです。この問題が解決されなければ、我々はリクエストの送信元となるアプリの身元を信頼することが出来ないだろうと判断しました。我々はそのユーザーの身元を信頼することが出来るだけです。つまり、あなたの友達のデバイスにインストールされている「悪い」アプリが、あなたのデバイス上の「よい」アプリにメッセージを送り、害をなすことが出来たということです。結局、Intentはローカルユースのために設計されており、RPCの伝達手段としては役に立たないものであると結論付けました。
  3. セキュリティ面でのあまりに多くの負担を開発者に強いていることについて
    当初の設計では、GTalkServiceはセキュリティ面での欠陥を除去することや、ユーザーとのリレーションの管理をおこなうことをアプリ開発者に委ね、多くの負担を強いていました。GTalkServiceを使ったアプリには、すべてのGalk Friendsからアクセス可能です。そしてアプリに欠陥があれば、悪意を持った「friend」や、自動化されたマルウェアに対して恰好の標的となってしまいます。脆弱なアプリを保護したり、マルウェアの繁殖を防ぐことのできる自動化の仕組みは存在します。しかしこれらのテクノロジーの開発は最初のAndroidハンドセットを提供するまでには間に合いませんでした。

我々は、本当にこのサービスを提供したかったんです。しかし最終的に、Androidチームは、ユーザーを危険にさらしたり、将来提供されるよりセキュアな機能との互換性を弱めるのではなく、APIを取り除くことに決めました。我々はこのような機能が信じられないほど便利だということを十分承知しています。だから、いずれ開発者の方々にはたくさんの新たな扉を開くつもりです。最初のデバイスを提供した後の我々の最優先事項は、デバイス間(あるいはデバイスとサーバー間)の高速で、信頼でき、開発者やユーザーを保護できるRPCメカニズムを開発することです。

最後に、いずれにせよGTalkServiceはGoogleによって「価値が付けられた」サービスなので、全てのAndroidデバイスで動作することは保証していたわけではないということに私は言及したいと思います。つまり、GTalkServiceは決してAndroidのコア機能ではなかったということです。結果として、この変更は、Androidの将来のバージョンのコアの一部となる新しいシステムを我々が構築する可能性を開いたと言えます。

・Bluetooth API

Androidの1.0バージョンと、最初のデバイスはBluetoothをサポートする予定です。たとえばAndroidはBluetoothハンドセットをサポートするでしょう。early-look版のSDKでは、Bluetoothの基本機能は不完全なドラフト版のAPIとして開発者に晒されていました。しかし残念なことにこのAPIは1.0のリリースからは削除せざるを得なくなりました。その理由を知るために、私はNick Pellyとコンタクトを取りました。Nick Pellyはこの機能に対する責務があるAndroidエンジニアのうちの一人です。彼は以下のように語りました。

 理由は、我々に検討する時間が無くなってしまった事です。Android Bluetooth APIは順調に進捗していましたが、SDKにコミットするまでにはいくつか整理する必要があります。Bluetooth APIを1.0 SDKに組み込むためには長い時間を必要とするということを心に留めておいて下さい。

 APIの抱える問題の例を挙げます。クライアント側のコードでは、非同期でのコールバックを受けるためにIBluetoothDeviceCallbackオブジェクトを回す必要があります。しかしIBluetoothDeviceCallbackは内部的なインタフェースなはずです。新たなコールバックをIBluetoothDeviceCallback.aidlに加えた瞬間クライアントコードは破壊されてしまいます。これは将来的な運用に耐えるものではありません。

 さらに慎重を期すことになった要因としては、最近発表されたbluez 4.xシリーズでは新たにAPIが追加されているという点です。Androidとbluezのインタフェースに似ている点があることからも想像がつくでしょうが、Android Bluetoothでは、GAPとSDPのためにbluezを利用しています。bluez 4.xの変更によって、我々は将来的にAndroid Bluetooth APIをどう構築するかを慎重に考える必要に迫られています。また、インタフェースを一旦決定してしまったら、我々はそれをずっとサポートしなければならないということを考えて下さい。

たくさん変更が入るだろうとわかっていながら、破綻したAPIを提供するよりは、それを含めないことを我々は選択しました。我々は、いつか必ずBluetooth APIをサポートするつもりです。しかしそれがいつになるのか、正確なことは言えません。以下は含むべきいくつかの便利な機能の一例です。

  • GAPとSDP機能とのバインド
  • RFCOMMとSCOソケットとのアクセス
  • JavaでのL2CAPソケットのサポート(これは検討段階です)
  • 我々のハンドセットとハンズフリープロファイルとのAPI

個人的な発言として、Nickは付け加えています。「私はちゃんとしたサードパーティのアプリやゲームがBluetoothを使って動くのを見ることが何よりも大好きです。私は、Bluetoothは多くのモバイルプラットフォームでもっと十分に活用されてしかるべきだと思います。そして開発者コミュニティがAndroidを使って何をするかについてとても興味を持っています。」

私は、今回のAPIの削除については非常にがっかりしました。特にGTalkServiceによって提供されるP2Pの機能を楽しみにしていました。しかし、いつでもユーザーのセキュリティとプライバシーは最優先に考えなければなりません。いかなる場合でも、我々はこれらの関心事とバランスを取れた素晴らしいAPIを作るために開発者コミュニティとともに活動していきます。

2008年08月29日

Android Market: a user-driven content distribution system - Android Developers Blog

最近、Android Developers Blogにビッグニュースがよく載ります。“Android Market: a user-driven content distribution system”を、日本語にしたものを参考までに載せます。訳はそれほど正確ではありませんので、オリジナルの方もご覧下さい。オリジナルにはスクリーンショットも載っています。さて、このことがAndroidをどの方向へ導くことになるのでしょうか。


Android Market:ユーザー主導のコンテンツ配布システム 2008/8/28 Eric Chu

 開発者の方々と話をしていると、アプリケーションをどのような方法でユーザーの元に届けるのかと言うことが、しょっちゅう話題になります。なので、今日Android Marketの初期構想について皆さんにお伝えすることが出来て嬉しいです。Android Marketはオープンなコンテンツ配布システムです。Android Marketは、Androidが搭載されたデバイス上で動作する様々なコンテンツを、エンドユーザーが探したり、購入したり、ダウンロードやインストールしたりすることを支援します。コンセプトは、インフラや検索に関するGoogleのノウハウを有効活用して、ユーザーとあなたのような開発者が作成したコンテンツとをつなぐことです。とてもわかりやすいでしょう?

 開発者は、Googleによって提供されるオープンなサービスを使うことで、コンテンツに対してフィードバックを受けたりYouTubeと同じような評価システムを設けることができるようになる予定です。開発者はオープンで妨げの無い環境でコンテンツを公開できるようにするべきだと我々は感じています。だから「store」ではなく「market」と名付けることにしました。YouTubeと同じように、簡単な3つのステップを経るだけで、マーケットプレイスにコンテンツを公開することが出来ます。3つのステップとは、まず取引主(merchant)として登録します。そしてアップロードして説明文を書き、それを公開するという感じです。また、ビジネスをどうドライブしたらよいのかや、最終的には公開しているものをどう改善すればいいのかについての手助けとなる便利なダッシュボードや解析ツールを開発者に対して提供したいとも考えています。

 また、あなたたちが我々のパートナーとして、最初のAndroidハンドセットのリリースを迎えられるように、いくつかの初期構想を共有して、あなたたちが計画を立てる手助けをしたいとも思っていました。最初のハンドセットでは、Android Marketのベータ版を利用できると思っておいて下さい。他にもいくつか決めていることがあるのですが、少なくともフリー(無料)のアプリケーションはサポートします。Android Marketの運用を開始してから間もないうちに、有料のコンテンツのダウンロードもサポートするつもりです、また、バージョン管理や、複数のデバイスプロファイルのサポート、解析ツールなどのような機能を提供するつもりです。以下に、セキュリティ関連の機能や操作手順を説明したいくつかのスクリーンショットを載せています。

 マーケットプレイスが新たに登場したことで、Androidのエコシステムはさらに強固なものになります。今回のサポートや、今までに拝見したとても素晴らしいコンテンツが、私に信じられないほどのエネルギーを与えてくれています。Android Marketが公開されたら、もう少し詳細な情報をお知らせできると思います。今後数ヶ月以内には、多くの皆さんとともに活動できるようになるでしょう、そうなることを私は楽しみにしています。

2008年08月31日

Android Developer Challenge 上位10作品

Android Developer Challenge(ADC)の最終結果が発表されました(ここ)。めでたく$275,000を獲得した上位10作品の概要を以下に示します。いいなあ。私も次回は何か応募したいと思います。作{ら|れ}ないと何も語っちゃいけないような気がするので。

■cab4me
Konrad Huebner, Henning Boeger
どこにいてもクリックひとつでタクシーを呼べるアプリ。GPS,cell basedで現在位置を把握。コンタクトリストと連携し、現在位置でピックアップ可能なタクシー会社の連絡先を表示。

■CompareEverywhere
Jeffrey Sharkey
目の前にある商品の販売価格が妥当かどうか、バーコードをスキャンするだけでわかるアプリ。カメラ機能を使いバーコードをスキャンすると、その商品を扱っている店での販売価格が一覧で表示され、比較できる。GPSを使って最寄のお店を知ることも可能。Mapで場所もわかる。

■Ecorio
Jeff Kao, Gary Pong, Robert Lam, Taneem Talukdar
地図上で行程を入力すると、その行程での二酸化炭素排出量を正確に知ることが出来るアプリ。GPS、Location、WEB使用。次の3つの機能がある。Reduce:公共の乗物を利用するなどして排出量を削減する提案をしてくれる。/Inspire:排出量を削減するために行った試みを他人とシェアできる/Offset:二酸化炭素排出量削減プロジェクトに出資(二酸化炭素を排出することに対してお金を払う。)

■GoCart
Rylan Barnes
開発者曰く、オンラインストアと現実の店でのショッピングの間にある隙間を埋めるアプリだとのこと。カメラを使い商品のバーコードをスキャンすると、インターネット上のオンラインストアや、近所のお店などから最安値を検索できる(GPS利用)。ウィッシュリスト機能がある。OpenSocial APIを使っており、リストをソーシャルネットワークのページで友達とシェアできる。

■Life360
Chris Hulls, Dilpreet Singh, Luis Carvalho, Phuong Nguyen, Steve Potell
隣人との近所付合いを支援するための多チャンネルメッセージングシステム(火事があった時に家族が無事か確かめたり、犬が逃げた時に捜索に協力してもらったり)。GPSもMAPも使っている。家族の位置を常に把握でき、緊急時の医療情報等が確認可能。事故で衝突したりすると、加速度センサーでそのことを自動的に検知し家族へ通知。困っていることを近くにいる人に通知して助けを請う機能もある。

■Locale
Carter Jernigan, Clare Bayley, Jasper Lin, Christina Wright
"場所"に対して、意味を持たせることが出来るアプリ。Map上で"場所"を予め設定しておくと、自分の現在位置がその"場所"内に入った時に、端末の設定を変えることが出来る。例えば、"仕事場"に入った時は、着信音を鳴らさずにバイブにするなど。

■PicSay
Eric Wijngaard
端末で写真を撮って、吹き出しやタイトル、説明などを素早く添えることが出来るアプリ(絵がしゃべってる感じ)。色補正やエフェクトをかけることができたり、友達や家族とBLOGやWEBを通して画像をシェア出来る仕組みを提供する。Location APIで、位置も取得可能。

■Softrace
Staffan Kjellberg, Thomas Kjellberg
各プレイヤーが端末を持ち、実際のコースを自分で走って競争するレースゲーム。Location APIで位置情報を取得し、リアルタイムに順位がわかる。位置はMapに出る。

■TuneWiki
TuneWiki Inc.
曲やPVなどを再生しながら、同期して歌詞(翻訳されたものも可)を表示するアプリ。音楽の情報は友達とシェアできる。GPSを使って、近所の人が聞いている曲がわかったり、その場所(国、地域)でのヒットチャートを見ることが出来たりする。OpenSocialやGoogle Mapsと連携しており、Android端末ではない人とも共有できる。

■Wertago
Kelvin Cheung,Teresa Ko, Peter Ree, Robert Sarvis, Douglas Young
夜の街で遊ぶことが好きな人のためのアプリ。ソーシャルネットワークの友達と、どの場所が今アツいとかの情報を交換したり、夜遊びの計画を練ったりすることができる。これもLocationとGPS、ソーシャルネットワーク。

2008年09月02日

SensorSimulator - OpenIntents

2009.02.14 追記:この記事の内容は若干古くなっています。こちらの投稿も併せてご覧下さい。


OpenIntentsという、Google Codeのプロジェクトがあります。このプロジェクトでは、役に立つライブラリやアプリ、ツールがいくつか公開されています。8/29頃に概ねver.0.9 betaに対応されているようです。OpenIntentsには、SensorSimulatorというツールが含まれています。このツールは、加速度やコンパス、回転(傾き)のセンサー入力部を、ソフトウェアでシミュレートするものです。SensorSimulatorがサーバーとなり、アプリからソケットで接続する構成です。SensorSimulatorは、デバイスの回転運動の表現にロール・ピッチ・ヨー(roll, pitch, yaw)角を用いています。簡単な解釈は以下の図をご覧下さい。(下図は端末を地面に水平に置いた時の想定です。)

rollpitchyaw

SensorSimulatorを使うと、この動画のようにセンサーからの入力を受け付ける(SensorListenerをインプリしている)アプリを操作することができます。


使い方に関する簡単な説明を書きます。

・はじめに

  • Java 6じゃないとダメです

  • OpenIntentsはeclipseで開発されているので、eclipseを使った方が楽です

  • 現時点でリリースされているOpenIntents 0.1.7は、SDK 0.9 betaに対応していないので、SVNからチェックアウトする必要があります。私は、rev.1065で動作確認しました。

・セットアップ

 まず、SensorSimulator(http://openintents.googlecode.com/svn/trunk/tools/SensorSimulator)をチェックアウトし、org.openintents.tools.sensorsimulator.SensorSimulatorを実行します。Simulatorのウィンドウが表示されるはずです。この時点でエミュレータからの接続を待っている状態になっています。

simulator

 次に、OpenIntentsのコア部をエミュレータにデプロイする必要があります。しかし、現時点でリリースされている0.1.7は、SDK 0.9 betaに対応していないので、SVN(http://openintents.googlecode.com/svn/trunk/openintents)からチェックアウトし、エミュレータにデプロイして下さい。(eclipseの場合、OpenIntentsプロジェクトをAndroid Applicationとして起動)

 OpenIntentsが起動したら、“setting”タブを開き“Sensor Simulator”を押します。

setting

 ここでエミュレータからSensorSimulatorが待ち受けているIPアドレスやポート番号を設定します。

setting2

これで準備は完了です。OpenIntentsのOpenGLのサンプル(http://openintents.googlecode.com/svn/trunk/samples/OpenGLSensors)で動作を確認してみて下さい。

・使用上の注意

SensorSimulatorを使う上で、いくつか気にしておいた方がよいポイントや注意点があります。

  • openintentsのjarを含まねばなりません。(OpenGLSensorsに含まれるopenintents-lib.jarを使えばよいと思います。)
  • アプリ側のコードがOpenIntentsに依存することになります。 まず、初期化時(onCreateなど)に以下のおまじないコードが必要です。

    OpenIntents.requiresOpenIntents(this);
    Hardware.mContentResolver = getContentResolver();

    SensorManagerのインスタンスは、SensorManagerSimulatorでなければなりません。

    SensorManager sensorManager = (SensorManager) new SensorManagerSimulator((SensorManager) getSystemService(SENSOR_SERVICE));

    アプリがアクティブになる際(onResumeなど)に、ソケットを開くstaticメソッドをコールする必要があります。

    SensorManagerSimulator.connectSimulator();

    アプリが非アクティブになる際(onStopなど)に、ソケットを閉じるstaticメソッドをコールする必要があります。

    SensorManagerSimulator.disconnectSimulator();



安直に書くとこんな感じです。

public class SensorExample extends Activity implements SensorListener {
 SensorManager sensorManager;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // --- views
    ・・・
  // --- sensors
  OpenIntents.requiresOpenIntents(this);
  Hardware.mContentResolver = getContentResolver();
  sensorManager = (SensorManager) new SensorManagerSimulator((SensorManager) getSystemService(SENSOR_SERVICE));
 }
 @Override
 protected void onStop() {
  sensorManager.unregisterListener(this);
  SensorManagerSimulator.disconnectSimulator();
  super.onStop();
 }
 @Override
 protected void onResume() {
  super.onResume();
  SensorManagerSimulator.connectSimulator();
  sensorManager.registerListener(this,
  SensorManager.SENSOR_ACCELEROMETER |
  SensorManager.SENSOR_MAGNETIC_FIELD |
  SensorManager.SENSOR_ORIENTATION,
  SensorManager.SENSOR_DELAY_FASTEST);
 }
 public void onSensorChanged(int sensor, float[] values) {
  ・・・
 }
}

ハードに疎く、エミュレータだけが頼りの開発者(私のような..汗)がテストする用途には充分使えるような気がします。

2008年09月05日

加速度計 - Android

2009.02.14 追記:この記事の内容は若干古くなっています。こちらの投稿も併せてご覧下さい。


先日ポストした、Android関連プロジェクトのOpenIntentsのSensorSimulatorを使って遊ぶ目的で簡単なサンプルを作ってみました。

加速度センサーを使っています。上下左右(端末の側面方向)にある程度以上強く動かすと、動かした速度に応じてその方向へ地図が移動します(一応orientation sensorも見て端末の傾きを考慮していますので、どのような持ち方をしていても大丈夫な、、、はずです)。また、正面方向に動かすと、ズームイン、正面と反対(背中)方向に動かすとズームアウトします。

加速度を知るには、android.hardware.SensorListenerインタフェースのメソッド

void onSensorChanged(int sensor, float[] values)


の第1パラメータ(int sensor)が、SensorManager.SENSOR_ACCELEROMETERであるときの、第2パラメータの値(float[] values)を拾う必要があります。この値は要素数3(公式ドキュメントでは、それぞれX, Y, Zと呼んでいます)のfloatの配列(float[] values)です。各要素の値の意味ですが、加速度センサーの場合は

  • X(1つ目の要素)は、端末の右面からの加速度合(右面と垂直な方向のベクトル)

  • Y(2つ目の要素)は、上部からの加速度合

  • Z(3つ目の要素)は、前面(正面)からの加速度合


となります。(下図な感じの雰囲気。)

accerelometer1

ベクトルの度合は、重力加速度(9.82m/s^2)を基準とするようです。加速度計は重力の影響を受けます。地球ならその面を真下に向けると1、真上に向けると-1を示します。例えば、端末の正面が上に来るように地面に置いた状態では、XとYは約0、Zは約-1となります。(下図な感じの雰囲気。)

accerelometer2

加速度計が受ける重力の影響は、端末の傾き(端末をどう持っているか)によって逐次変化しますので、端末の傾きによって挙動に差が出ないアプリを作ろうとした場合は、傾きを考慮した調整が必要です。

 次に、端末と向かい合っている状態(X:0, Y:-1, Z:0)で、端末を左右に動かした場合を考えます。端末を右へ移動させるとXは増え、左に移動させた場合はXは減ります。ただし、これは非常にゆっくり移動させた場合の話で、ある程度以上の勢いをつけた(振るなど)場合は、慣性力の影響で、一旦逆向きの力が働くことに注意する必要があります。(勢いよく車を加速させて発進すると、後ろに引っ張られるのと同じです。)

サンプルのソースは「ここ」に置いています。eclipseプロジェクトを固めたものです。OpenIntentsに依存しているので、動かすためにはOpenIntentsとSimulatorの設定が必要です。詳しくは先日のエントリ(こちら)を参照して下さい。

ご覧になった方、もしバグッてたら、教えて頂けると嬉しいです。

2008年09月08日

日本Androidの会

「日本Androidの会」という団体が9/12(金)に設立されます。
富士ソフト秋葉原ビル(http://www.fsi.co.jp/company/akihabara.html)で9月12日19時から発足式典があります。無料ですし、Googleの人も講演されるとのことですので、皆さん申し込みましょう。

申し込みページ:https://www.c-sq.com/modules/eguide/event.php?eid=48

「日本Androidの会」は、Androidに興味をもつ全てのユーザが参加可能なコミュニティです。
詳細:
http://www.android-group.jp/index.php?%B9%D6%B1%E9%2F%C8%AF%C2%AD%BC%B0%C5%B5


2008年09月26日

Android - VIEW_ACTIONのIntentでStreet Viewを開く

Android SDK の0.9から、公式なIntentの種類にStreetViewが追加されています。(http://code.google.com/android/reference/available-intents.html
なので、IntentでStreetViewを開くことが可能です。

エミュレータを起動しておき、ターミナルからadbで実験してみます。

adb shell
# am start -a android.intent.action.VIEW 'google.streetview:cbll=35.713768,139.777254&cbp=1,0,,0,1.0'

この座標は上野駅周辺ですので、上野駅付近のStreetViewが開いたと思います。cbllパラメータは、緯度経度情報です(必須)。cbpはヨーとピッチ等の角度を指定します。ロールは見ていないようです。他にも、Mapに表示を切り替えた時のズームレベルなども指定可能です。

アプリから実行する例はこんな感じです(ちょっとダサいですが。。)以下は、MapViewに表示されている中央の座標のStreetViewを表示します。

GeoPoint center = map.getMapCenter();
Uri uri = Uri.parse("google.streetview:cbll=" + center.getLatitudeE6()/1E6 + "," + center.getLongitudeE6()/1E6);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

なお、このIntentのactionはVIEWになるので、startActivityForResultなどで、サブアクティビティとして起動し、戻り値をもらうような使い方は出来ません。(一方通行のやり取りになってしまうようです。)また毎回StreetViewアプリが起動するので、端末からStreetViewアプリを直接操作する時のような軽快な操作は期待できません。でも、いずれ出来るようになるような気がします。

ちなみに、地図に表示している地域がStreetViewに対応しているかどうかを示す青線(WEBのGoogle Mapで「ストリートビュー」ボタンを押した時に出るアレ)は、MapView#setStreetView(true)とすれば表示されます。

2008年10月22日

Android - ソース公開 & iPhone - 出荷台数

ついにAndroidのソースコードが公開されました。
http://source.android.com/

2.1GBとデカい&gitで公開されていますので、気をつける必要がありそうです。ビルドのことも考えると、Windowsだと色々と面倒そうですね。

また、米ではAppleの第4四半期決算が発表されました。
iPhoneは、この四半期で6,892,000台売れたとあります。
http://www.apple.com/pr/library/2008/10/21results.html

わかりませんが、好調なのではないでしょうか。

2008年10月31日

Android - Eclipseで開発時にAndroid SDKのソースコードを見る方法

Eclipse(ADT)を使ってAndroid Projectで開発している際に、デバッグなどの目的でAndroidのJavaのソースコードを参照したいことがあると思いますが、どうすれば効率がよいかちょっと悩み中です。とりあえず私が現在やっている方法を書きます。ので、もしもっといい方法があれば教えて下さい。

私が悩んだところは以下の2点です。

1. ディレクトリ構成
Repo(git)で取得したpublicリポジトリのディレクトリ構成だと同一の(またはよく似た)Javaパッケージが別のProjectにも入っていたりするので、ソースコードを手軽にアタッチすることが出来ません。なので、SDK部分のソースコードを見たくなったときは、そのソースのある場所を探さなければならないというわずらわしさがあります。私は最初はシンボリックリンクで何とかしようと思ったのですが、面倒すぎて途中で挫折しました。現在は以下のようなrubyスクリプトを書き、必要そうなJavaソースをSDKのホームディレクトリへコピーしています。リポジトリが更新されたら、スクリプトを流しなおします。

require 'fileutils'

#####################################################################
# Android SDK home
$SDK_HOME = "/User/egawa/android/android-sdk-mac_x86-1.0_r1"
# the root directory was pulled down from the public Android repositories
$SRC_ROOT = "/User/egawa/android/gitsources"
#####################################################################

$SDK_SRC_DIR = File.join($SDK_HOME, "sources")

$FILTERS = [
  /.+\/src\/main\/java\/(.+$)/,
  /packages\/.+\/src\/(.+$)/,
  /external\/.+\/src\/(.+$)/,
  /external\/.+\/src\/(.+$)/,
  /frameworks\/base\/awt\/java\/(.+$)/,
  /frameworks\/base\/cmds\/am\/src\/(.+$)/,
  /frameworks\/base\/cmds\/input\/src\/(.+$)/,
  /frameworks\/base\/cmds\/pm\/src\/(.+$)/,
  /frameworks\/base\/cmds\/svc\/src\/(.+$)/,
  /frameworks\/base\/core\/java\/(.+$)/,
  /frameworks\/base\/graphics\/java\/(.+$)/,
  /frameworks\/base\/location\/java\/(.+$)/,
  /frameworks\/base\/media\/java\/(.+$)/,
  /frameworks\/base\/opengl\/java\/(.+$)/,
  /frameworks\/base\/packages\/SettingsProvider\/src\/(.+$)/,
  /frameworks\/base\/packages\/SubscribedFeedsProvider\/src\/(.+$)/,
  /frameworks\/base\/sax\/java\/(.+$)/,
  /frameworks\/base\/test-runner\/(.+$)/,
  /frameworks\/base\/tools\/.*\/src\/(.+$)/,
  /frameworks\/base\/wifi\/java\/(.+$)/,
  /frameworks\/policies\/base\/phone\/(.+$)/
]

def match filepath
  $FILTERS.each do |filter|
    return $1 if filter =~ filepath
  end
  nil
end

STDOUT.sync = true
puts "copying sources from #{$SRC_ROOT} to #{$SDK_SRC_DIR}"
Dir.glob("#{$SRC_ROOT}/**/*.java").each_with_index do |src, index|
  print '#' if index % 100 == 0
  next unless matched_src = match(src)
  dest = File.join($SDK_SRC_DIR, matched_src)
  FileUtils.makedirs(File.dirname(dest))
  FileUtils.cp(src, dest)
  # log
  # puts "#{src} was copied to #{dest}"
end
puts ''
puts 'done.'

2. android.jarの中に含まれていないクラス

ZygoteInitやActivityThreadなどはpublicリポジトリにソースはありますが、SDKのandroid.jarにはクラスが含まれていません。このようなものはコンパイルタイムではEclipseにクラスとして認識されていないので「型を開く(Open by Type)」などでも出てきません。多分アプリを作っている限りは、それらのクラスと直接依存するようなコードを書くことはないと思うので、実際にはあまり不便を感じないかもしれませんが、ランタイムでは、たとえば、デバッグモードで実行し任意の場所で止め、コールグラフからActivityThreadなどのソースに飛びたいことがあります。ソースが見れないときにはEclipseからソースのありかを求められるので、そのときに先ほどのスクリプトで取得したソースコードのディレクトリをexternal folderとして指定することで、参照できるようになります。android.jarに対するソースコードのアタッチとは別になります。

2008年11月05日

Android is now available as open source - Android Open Source Project

Androidのソースコードが公開されたその日、「Android Open Source Project(http://source.android.com/)」にDave Bortさんがポストしている文章に感銘を受けたので、簡単に和訳して載せます。


Android is now available as open source 2008/10/21 Dave Bort

(オリジナル:http://source.android.com/posts/opensource

 今日という日は、Android、Open Handset Alliance、そしてオープンソースコミュニティにとって大きな一日だと言えるでしょう。我々がこのモバイルプラットフォームに対して注ぎ込んだ全ての成果が、Android Open Source Projectとして、今公式に無料で利用することができるようになったのです。

 あなたはAndroidデバイスについて色々耳にしているでしょう。我々は皆、最初のAndroidデバイスに対して粉骨砕身の姿勢で取り組んできました。そしてその結果について本当に満足しています。しかし、このデバイスはただの始まりに過ぎません。

 Androidはハードウェアの1ピースというわけではなく、様々なハードウェア構成の元で動かすことに適した完全なエンド・ツー・エンドのソフトウェアプラットフォームです。ブートローダーから始まり、ずっと上のアプリケーションにいたるまでの全てが含まれます。そして既に市場に出ているAndroidデバイスは、モバイルの市場競争に必要なものを備えていることを証明しています。

 あなたに、近いうちにモバイルデバイスを出荷する予定がもしなかったとしても、Androidは多くのことを提供してくれます。音声認識ライブラリの動作について興味はありませんか?バーチャルマシンを調査してみませんか?革新的な組込Linuxソリューションが必要ではありませんか?たった今から、これらのピースの全てが、グラフィックライブラリ、メディアコーデック、そして私が今まで利用していた最高の開発ツールなどに加えて、Android Open Source Projectの一部として利用可能になります。

 なに?新機能のためのすごいアイデアを持っている?じゃあそれを追加してください!オープンソースプロジェクトなので、誰もがAndroidに貢献できるし、Androidの方向性に影響を与えることが出来るというとても素晴らしい面があります。そして、もしこのプラットフォームが、私が願っているような地位を獲得したら、あなたはモバイルデバイス全体の未来に対して影響を与えるようになるかもしれません。

 とてもエキサイティングなAndroidの時代の到来です。そして我々はちょうどスタートを切ったところです。モバイル業界の変化に対応し続けるためには、たくさんやることがあります。しかし、我々はただ対応する以上のこと、つまり、道を示したり、新たなことにチャレンジしたり、他の皆がやろうと競っている新機能を追加したりしたいと思っています。ですが、あなたの手助け無くしては、我々はこれを実現することが出来ません。

あなたはAndroidをどのようにしていきますか?

2008年12月08日

Android Dev Phone 1

Androidの開発者用端末が発表されました。見た目はG1ですが、諸々の面倒な制限が解除されており、スペックにしては比較的リーズナブルな価格なので、これはいいですね。プラットフォームからビルドしなおせるとなると開発用途で長く使えそうですし。日本でも買えるようです。私はリリース日に早速注文しました。5万円弱の出費はデカいですが。。
しかし日本でおおっぴらに使っていいんですかね。法関係は大丈夫なんでしょうか。とりあえず、Android Marketのような胴元がオフィシャルに日本にも発送するって言ってるんで、僕のような、しがない一利用者が気にするようなことでもないかと思い買っておきました。いつ届くのでしょうかね。楽しみにしておきます。

以下特徴です。

・SIMフリーです。
・カスタムビルドのAndroid OSを入れなおし可です
・購入にはAndroid Marketの登録が必要($25)です。
・Android Marketにユーザー登録していれば、ここから買えます
・本体は$399ですが、日本だと送料に$109.55かかりますので、$508.55で買えます。Android Marketの登録料と合算すると、計$533.55です(USD)。
・Android Market登録ユーザー毎に1台のみ購入可能です。
・Brightstar Corporationという会社から購入する形になります。
・配送はUPS Innovationsです。
・見た目はG1のようですが、T-Mobileのロゴが外れ、背面にAndroidのアイコンなどの模様が入っています。

2008年12月11日

OHAのメンバーが増えた

設立当時から、メンバーの増減が一切行われなかったOpen Handset Allianceに新たなメンバーが加わりました。日本からは東芝やオムロンソフトウェア、ソフトバンクなどが増えていますね。

日本語入力のベースはオムロンのやつ(Wnn)ってことに確定でしょうか。
ADCの審査員などをしていた東芝がついに入りました。
DoCoMo, AU, Softbankの大手が皆参加したことになっていますね。

特に今回参画したメンバーから、Android端末がたくさん出てきそうですね。楽しみです。

2008年12月13日

Android Dev Phone 1到着

さきほど届きました。先週の土曜日に注文したのでちょうど1週間程度ですね。
結構早かったです。今日と明日はほとんど触れないのですが、近いうちに触ってみようと思います。

2009年02月05日

「Android SDK WG 第3回 セッション withプチ勉強会」を開催しました

私は「日本Androidの会」というところで、Android SDK WGというワーキンググループのリーダーをしています。
Android SDK WGとは、一言で言うと
「Android SDKの理解を深めながら、開発者同士仲良くやろうぜ の会」
です。皆で休日集まって、午後の時間を丸々使って勉強し、その後ご飯を食べに突入します。

先日、「Android SDK WG 第3回 セッション withプチ勉強会」というイベントを開催しました。
今回は50名くらい集まりました。私は実機を使って皆でセンサーで遊ぶ発表をしたのですが、G1やDevPhoneも15台くらい集まりました。
Android SDK WG 第3回 セッション withプチ勉強会

Android SDK WGでの活動は、今回が3回目です。今までこんなことをやってきました。

Android SDK WG 第1回 セッション(2008.10.25)
Android SDK WG 第2回 セッション(2008.11.29)
Android SDK WG 第3回 セッション withプチ勉強会

定期的に開催していますので、もしご興味があればぜひお気軽に御参加下さい。

2009年02月06日

Android Developers Blog - Can I use this Intent?

Android Developers Blogの、“Can I use this Intent?”というポストが役に立ちそうだった、かつ、誰も翻訳してなさそうだったので日本語にしてみました。訳はそれほど正確ではありませんので、オリジナルの方もご覧下さい。

http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html


Can I use this Intent? - このIntentって使える? 2009/1/5 Romain Guy

 Androidは、Intentと呼ばれるとてもパワフルで使いやすいツールを提供しています。Intentによって、アプリケーションをハイレベルなライブラリとして利用することが出来ますし、従来よりもコードを再利用しやすくなります。例えば、AndroidのホームスクリーンとAnyCutアプリは、ショートカットキーを定義するためにIntentをたくさん使っています。疎結合なAPIを使って作れることはとてもナイスなんですが、その反面、あなたが送ったIntentが別のアプリケーションで受け取られているという保証はありません。これは、「Panoramio」とその「RADAR Intent」のような、サードパーティのアプリで特に起こりがちです。

 私は新しいアプリを作っている最中に、あなたが使いたいIntentに反応してくれるアプリケーションがシステム中に存在するかどうかを知る、とても簡単な方法があることを思いつきました。私のアプリではメニュー項目をユーザーがクリックするとIntentが出るようになってるのですが、この方法を使って(利用できない)メニュー項目を灰色表示にするよう実装しました。コードはとてもシンプルで追いかけるのも簡単です。

/**
 * 引数で指定したActionを使えるIntentがあるかどうかを返します。
 * このメソッドは、引数で指定したActionを設定したIntentに応答できる
 * インストール済パッケージをパッケージマネージャーに問い合わせます。
 * 適切なパッケージが存在しない場合はfalseを返します。
 *
 * @param context アプリのContext
 * @param action 使えるかどうかチェックしたいAction文字列
 *
 * @return true:引数で指定したActionが設定されたIntentを扱える場合
 *         false:それ以外
 */
public static boolean isIntentAvailable(Context context, String action) {
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(action);
    List<ResolveInfo> list =
            packageManager.queryIntentActivities(intent,
                    PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

使い方はこんな感じです。

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    final boolean scanAvailable = isIntentAvailable(this,
        "com.google.zxing.client.android.SCAN");

    MenuItem item;
    item = menu.findItem(R.id.menu_item_add);
    item.setEnabled(scanAvailable);

    return super.onPrepareOptionsMenu(menu);
}

この例では、バーコードスキャナのアプリがインストールされていなければメニュー項目を灰色表示にします。他のもっとシンプルな方法としては、startActivityメソッドを呼ぶときにActivityNotFoundException例外をキャッチする方法があります。しかしこの方法は、問題が発生した時に対応することしか出来ません。したがって、ユーザーがうまく動作しない何らかの操作をしてしまうことを防止するために、事前に予測してUIを更新することが出来ません。ここで示したテクニックは、足りないパッケージをインストールするかどうかをアプリ起動時にユーザーに尋ね、適切なURIを使ってAndroid Marketへリダイレクトするといったような使い方も出来ます。

注釈:この記事のオリジナルは私の個人BLOGの投稿です。

2009年02月10日

Android SDK 1.1 リリース - APIレベルについて

Android SDK 1.1がリリースされました。Android SDK 1.1では、アプリがサポートしているAPIレベル(APIのバージョンのようなもの)を指定することが出来るようになっているようです。Android 1.1 Version Notesの、APIレベルに関係するOverviewのみ、ノリで日本語にしてみました。訳はそれほど正確ではありませんので、オリジナルの方もご覧下さい。


Android 1.1 Version Notes - Overview

 SDKに含まれるAndroid 1.1のシステムイメージは、Android 1.1のプロダクションシステムイメージと開発用途に互換を持たせたものです。Android 1.1のプロダクションシステムイメージは2009年2月からAndroid搭載端末にデプロイ可能です。
 Android 1.1のシステムイメージは、フレームワークのAPIも更新されて配布されています。Android 1.1のAPIでは、「2」のように数値で識別子をつけてシステムに記録しておくことが出来ます。このことはAndroid 1.0のAPIも同様です。この識別子は「APIレベル」と呼ばれ、システム上でアプリが正しく動作するかどうかを、そのアプリをインストールする前に正確に判断することができるようにするためのものです。
 マニフェストファイルにはAPIレベルの値を定義しておくことができます。これは、そのアプリが動作するにあたって必要となるAndroidのシステムのミニマムバージョンを示します。APIレベルを指定するには、マニフェストファイルにminSdkVersion属性を設定します。この属性には、APIレベルを特定する数値を設定します。システムはアプリをインストールする前にこのminSdkVersionの値をチェックして、システム自体に記録されているAPIレベル以下の値のもののみインストールを認めます。
 もし、Android 1.1のプラットフォームが動作しているAndroid端末と互換性を持たせたアプリを、Android1.1のシステムイメージを使って作成したら、minSdkVersionの値は「2」(Android 1.1と厳密に対応したAPIであることを示します)にする必要があることに注意して下さい。
 具体的には、マニフェストファイルの<manifest>要素の子要素として<uses-sdk>を置き、そこにminSdkVersion属性を定義します。以下のような感じです。

<manifest>
  ...
  <uses-sdk minSdkVersion="2" />
  ...
</manifest>

 このようにminSdkVersionを設定することによって、ユーザーはそのアプリをAndroid 1.1プラットフォームの端末にのみインストールできるようになります。言い換えると、1.1のAPIを使って作成されているそのアプリケーションはこれらの端末でちゃんと動作することを示しています。
 もし、アプリを1.1のAPIを使って作ったのに<uses-sdk minSdkVersion="2" />を書いていなかったら、Android 1.1の端末上ではちゃんと動くでしょうが、1.0の端末では動かないでしょう。後者の場合、実行時に1.1のAPIを使おうとした時点でアプリがクラッシュしてしまうでしょう。
 もしアプリに1.1で新しく公開されたAPIを全く使ってないのなら、minSdkVersionを設定しないようにするか、minSdkVersionに「1」を設定することで、Android 1.0に互換があることを示すことが出来ます。しかし、アプリケーションの公開前にAndroid 1.0のシステムイメージ(Android 1.0 SDKで利用できます)を対象にして、アプリケーションがちゃんとコンパイル出来るかを確認しなければなりません。このことはAndroid 1.0の端末でちゃんと動くことを保証することにつながります。アプリが互換性を持つAPIレベルと対応するシステムイメージを使ってアプリをテストする必要があります。
もし、アプリに1.1のAPIを使っておらず、使う必要がないとはっきり判っているならば、Android 1.0のSDKをそのまま使い続ける方が、1.1を使って追加でテストするよりも楽かもしれません。

2009年02月14日

Android - 加速度センサー再び

私が以前書いた、これ、や、これ、などのセンサーの投稿は、結構内容が古くなってしまいました。

 これを調べていた頃はまだG1が出る前(9月)だったので、その当時のOpenIntentsのSensorSimulatorの振る舞いや、当時のAPIリファレンスを見ながら書いたものです。しかし、実際にDev Phoneを購入して試してみるとDev Phoneで実際に取得できるセンサーの値がちょっと違っていることがわかりました。また加えてAPIに拡張や変更があったことも原因で、前に書いた記事を鵜呑みにすると、うまくいかないことがあります。ググってもAndroid SDKの加速度センサーを使った日本語の情報があまり出てこないようで、私のこのBLOGに辿り着かれる方が結構いらっしゃるので、ずっと修正したいと思っていました。

 全て網羅するわけではないのですが、いくつかの差異をここに示そうと思います。もしかすると、G1特有の挙動かもしれず、別機種ではまた別の値となるかもしれませんが、ご参考までに。


加速度センサーの値:
 以前は、1Gのときに1.0fを示すと書きましたが、仕様が変更になったようで、m/s^2のままです。なので、1Gのときは9.82fになるのだと思います。1Gのときに1.0にしたい場合はSensorManager.GRAVITY_EARTHで割ると出てきます。地球以外で使う場合は別の値で割ればいいと思います。


傾度センサーの値:
 以前は、0番目からyaw, pitch, rollと思っていましたが、違うようです。通常のロールピッチヨー角の考え方とは異なります。0番目はyawでなく、代わりにAzimuthという方位を示す値が入ります。この値は0以上360未満の範囲を取ります。0は北、90は東、180は南、270は西です。この値を使うことで、方位だけなら磁気センサーの値を計算せずとも簡単に取ることが出来ます。傾きはpitchとrollのみで判断します。多分以前よりも簡単です。ロールピッチヨーの3つの値の組み合わせだと、どのような経緯を経て、今の傾きになったのかを追跡することが出来ます。それは確かに必要な局面はあるかもしれませんが、通常はその時点の傾きのスナップショットのみが欲しいことが殆どでしょうから、pitchとrollだけでも判断できますし、そのように判断した方が簡単だと思います。でも、加速度センサーの値から傾きは判断できますので、(方位は楽かもですが)傾度センサーの値は別に要らないかなあ、とも思います。


サンプル:
先日、Android SDK WGで、加速度センサーを使った簡単なサンプルを皆で作って遊びました。

作ったアプリの仕様は

・端末を振っているときに、背景の色を変えてください
・振るのを止めたら、背景の色を元(黒)に戻してください
・端末の傾きに応じて、画面に(縦、横、水平などの)文字を表示してください


という感じです。実装したアプリは、例えばこんな動きをします。

多分実装の方法は無数に考えられるのですが、Activityのひとつの実装例を丸ごと載せておきます。

package net.grandnature.android.sdkwg.examples.sensor;

import java.text.DecimalFormat;

import android.app.Activity;
import android.graphics.Color;
import android.hardware.SensorListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class Main extends Activity implements SensorListener {
    View layout;
    TextView accelerometerValue;
    TextView orientationValue;
    TextView filteredAccelerationValue;
    TextView filteredOrientationValue;
    TextView orientation;
    SensorManager sensorManager;
    static DecimalFormat format;
    static {
        format = new DecimalFormat();
        format.applyLocalizedPattern("#0.000");
    }
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // --- views
        setContentView(R.layout.main);
        layout = findViewById(R.id.layout);
        accelerometerValue = (TextView)findViewById(R.id.accelerometer_value);
        orientationValue = (TextView)findViewById(R.id.orientation_value);
        filteredAccelerationValue = (TextView)findViewById(R.id.filtered_acceleration_value);
        filteredOrientationValue = (TextView)findViewById(R.id.filtered_orientation_value);
        orientation = (TextView)findViewById(R.id.orientation);
        // --- sensors
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }
    @Override
    protected void onStop() {
        sensorManager.unregisterListener(this);
        super.onStop();
    }
    @Override
    protected void onResume() {
        super.onResume();
        sensorManager.registerListener(this, 
                SensorManager.SENSOR_ACCELEROMETER | 
                SensorManager.SENSOR_ORIENTATION,
                SensorManager.SENSOR_DELAY_FASTEST);
    }
    private float[] currentOrientationValues = {0.0f, 0.0f, 0.0f};
    private float[] currentAccelerationValues = {0.0f, 0.0f, 0.0f};
    public void onSensorChanged(int sensor, float[] values) {
        switch(sensor) {
        case SensorManager.SENSOR_ACCELEROMETER:
            accelerometerValue.setText(convertFloatsToString(values));
            // 傾き(ハイカット)
            currentOrientationValues[0] = values[0] * 0.1f + currentOrientationValues[0] * (1.0f - 0.1f);
            currentOrientationValues[1] = values[1] * 0.1f + currentOrientationValues[1] * (1.0f - 0.1f);
            currentOrientationValues[2] = values[2] * 0.1f + currentOrientationValues[2] * (1.0f - 0.1f);
            // 加速度(ローカット)
            currentAccelerationValues[0] = values[0] - currentOrientationValues[0];
            currentAccelerationValues[1] = values[1] - currentOrientationValues[1];
            currentAccelerationValues[2] = values[2] - currentOrientationValues[2];
            filteredAccelerationValue.setText(convertFloatsToString(currentAccelerationValues));
            filteredOrientationValue.setText(convertFloatsToString(currentOrientationValues));
            // 振ってる? 絶対値(あるいは2乗の平方根)の合計がいくつ以上か?
            // 実装例
            float targetValue = 
                Math.abs(currentAccelerationValues[0]) + 
                Math.abs(currentAccelerationValues[1]) +
                Math.abs(currentAccelerationValues[2]);
            if(targetValue > 22.0f) 
                layout.setBackgroundColor(Color.YELLOW);
            else if(targetValue < 10.0f) 
                layout.setBackgroundColor(Color.BLACK);
            // かたむきは?3つの絶対値(あるいは2乗の平方根)のうちどれがいちばんでかいか?
            // 実装例
            if(Math.abs(currentOrientationValues[0]) > 7.0f) {
                orientation.setText("横");
            } else if(Math.abs(currentOrientationValues[1]) > 7.0f) {
                orientation.setText("縦");
            } else if(Math.abs(currentOrientationValues[2]) > 7.0f) {
                orientation.setText("水平");
            } else {
                orientation.setText("");
            }
            break;
        case SensorManager.SENSOR_ORIENTATION:
            orientationValue.setText(convertFloatsToString(values));
            break;
        default:
        }
    }
    private String convertFloatsToString(float[] values) {
        return 
        String.valueOf(format.format(values[0])) + ", " + 
        String.valueOf(format.format(values[1])) + ", " + 
        String.valueOf(format.format(values[2]));
        
    }
    public void onAccuracyChanged(int sensor, int accuracy) {
        
    }

}

サンプルのEclipseプロジェクト:
Eclipseのプロジェクトごと圧縮してここに置いています。
SensorExample.zip

2009年02月19日

Software Design3月号

ついに来ましたよこの日が。
日本Androidの会で、技術評論社さんの雑誌「Software Design」(3月号)の特集を担当しました。
この特集記事は、ようやく来たと言う感じです。全体が網羅されており、Androidの開発を始めようという方にはすごくいい特集です。こういう日が来るのを待ち望んでいましたが、ついに実現しました。

私も2章を書きました。個人的には結構気を遣った力作です。(ミスったところもありますが。)
ぜひ読んでみて下さい。御意見ご感想などありましたら、頂けると嬉しいです。

Software Design (ソフトウエア デザイン) 2009年 03月号 [雑誌]Software Design (ソフトウエア デザイン) 2009年 03月号 [雑誌]

技術評論社 2009-02-18
売り上げランキング :

Amazonで詳しく見る

あ、あと入籍しました。ついに既婚者です。最近いいことたくさんあります。いいですねえ。

2009年02月23日

Android Hackathon

Android Hackathon 3月19日、20日に開催

3/19(木)、3/20(金)に、主催:Android-SDK-Japan、後援:GoogleでAndroidのHackathonがあります。
場所は、セルリアンタワーのGoogle Japanです。
Hackathonというのは、何人かのグループで実際に動くものを開発してみるイベントです。

http://groups.google.co.jp/group/android-sdk-japan/browse_thread/thread/fef47f02acedac50

私もサポートメンバーで参加します。当日会ったら声をかけてください!


2009年03月06日

JADE LEAP for Android

JADE(Java Agent Development Framework)という、LGPLのマルチエージェントのJava実装があります。いわゆるエージェント指向のひとつのようです。JADEは、FIPA(http://fipa.org)で定めているマルチエージェントの仕様を実装したものです。これのAndroid用アドオンが出ているのでちょっと試している最中です。セットアップが結構面倒だったので、方法を備忘録として書きます。
 


1.ソースの取得
http://jade.cselt.it/から、JADEのソース(full版でも可)をダウンロードする。(ユーザー登録が必要)
・「add-ons and 3rd party sw」のページ(http://jade.cselt.it/community-addons.php)からLeapとJADE Androidを取得し展開する
・以下のようなディレクトリ構成になるようマージする


jade/
 |
 |-add-ons/
 |- …
 |-android JADE LEAP for Androidのディレクトリ
   |- demo
   |- doc
   |- lib
   |- src
 |-leap/
 |   |- …
 |   |-src/ LEAPのソースファイル
 |- …
 |-src/ JADEのソースファイル

2. build.propertiesの修正
JADE LEAP for Androidのディレクトリにあるbuild.propertiesを修正(Android SDKの場所など)

3. jarの生成
※ Antが必要です。Antのインストールと環境変数への設定(PATH等)を済ませておいて下さい。

・LEAPのビルド
leapディレクトリに移動し、

ant

leap/j2se/libに、JadeLeap.jarが出来ていればOK。

・JADE LEAP for Androidのビルド
/add-ons/androidに移動し、

ant jar

を実行。うまくいくとJadeLeapAndroid.jarが出来る。

4. JADE LEAP Main Containerの起動
leapディレクトリで

java -cp j2se/lib/JadeLeap.jar jade.Boot -gui

等と実行すると起動する。

5. 使い方、試し方
Androidのプロジェクトでは、JadeLeapAndroid.jarをビルドパスに含み
AndroidManifestに

<uses-permission android:name="android.permission.INTERNET" />
<service android:name="jade.android.MicroRuntimeService" />


を追加しておけば使えます。

JADE LEAP for AndroidのdemoディレクトリをそのままEclipseプロジェクトにインポートすればデモを試すことが出来ます。ただし、stringのvalue.xmlにIPアドレスの定義などがあるので、環境に合わせて変更する必要があるようです。デモを実行するとこんな画面が開きます。

GUI側にもエージェントが新たに追加されています。

このデモでは、Android端末からInteraction Protocol(対話の種類みたいなもの)を選んで、任意のエージェントへメッセージを投げることが出来ます。私はまだマルチエージェントの細かい振る舞いや仕様をよく知らないので、これから勉強してみます。ちょっとみた感じでは、メッセージを受け取ったときにそのメッセージに対応する処理を実装するだけでよさそうなので、プロセス間通信の仕組みとしては、シンプルでわかりやすいんじゃないかと思いました。

2009年03月12日

QCon Tokyo行きます

InfoQさんのQConというカンファレンスがあるのですが、今回は、2009年4月9日(木)と4月10日(金)に、日本(東京)で開催されます。私もそれに出させてもらえることになりました。木南さんありがとうございます。今までネットに名前と顔をセットでは出したことがなかったのに、ついに顔バレです。写真は妻に選んでもらいました。
http://qcontokyo.com/

特に海外から来られるスピーカーはかなりすごいメンバーばかりなので、びっくりします。が、私が臆す必要もないと思いますので、気持ちは負けないつもりで楽しんでこようと思います。Androidをアジャイリストや、非組み込みの世界に知らしめることが目的です。是非よろしければご参加下さい。

「Androidって組み込みでしょ?私、組み込みのことわからないから」

今までに何度この言葉を聞いたことでしょう。

2009年03月17日

Android Dev Phone 1のセンサーがおかしくなったときの対処方法

ある日から、私のDev Phoneが指し示す加速度計の値がおかしくなりました。多分何かヘンなことをしてしまったのだとは思いますが、どこかにぶつけたり、乱暴に扱ったりしたわけでもなく、全く心当たりがありません。Z軸の重力加速度のみが約0.5G大きくなっています。こうなってしまうと、色々なゲームで遊んでいても、挙動が変になって楽しく遊べません。自分が作ったゲームも動きがおかしいですし。。

と、困っていたのですが、工場出荷時の状態に戻すことで直りました。
「SD card & phone storage」=>「Factory data reset」です。
Dev Phoneはこのときにセンサーをキャリブレーションしなおすようです。

直ってよかったです。。教えてくださった方、ありがとうございました。
ちなみに、工場出荷時の状態に戻すと、SDカードを除く全てのデータは消去され、最初のアカウントのセットアップからやり直しですが、ファームウェアのバージョンだけは戻りませんでした。こういうものなんですかね。

2009年04月15日

Android 1.5 Early Look SDK利用方法

自分用のメモです。

■ 1. ダウンロード
以下のURLから、SDKと、Android Eclipse plugins (ADT) をダウンロードする
http://developer.android.com/sdk/preview/

■ 2. SDKの配置
SDKを展開し、任意の場所に置く
SDK_HOME/toolsをPATHに通しておく

■ 3. ADTのインストール
EclipseのHelp>Software Updatesからやる。
前のADT(0.8以前)が入っている場合は、まずそれらをアンインストールしてEclipseを再起動する
先ほどダウンロードしたADTのzipを指定してインストールする
※リモートリポジトリがないといったエラーが出るが、気にしないでいい
ここでいったんEclipseを終了させておく

■ 4.AVD(Android Virtual Device)の設定
ターミナルから以下のコマンドを実行
android create avd --name [任意の文字列] --target 2
例)
android create avd --name AndroidSDK15Pre --target 2

※Googleのjar(map)を使いたいときは、targetを3にしないとだめなので、3にしておいたほうがいいかもしれません
android create avd --name AndroidSDK15PreGoogle --target 3

■ 5.ADTの設定
Eclipseを起動し、PreferencesのAndroidの設定で、SDKのパスを設定する

■ 6.既存プロジェクトの修正
旧SDKで作成したプロジェクトはエラーが出るので、プロジェクトを右クリック、Propertiesを選択、Androidを選び「SDK Target」を指定する。
そうすると、genディレクトリが生成され、R.javaがそっちに移る。また、プロジェクト直下にdefault.propertiesができる。

■ 7.既存プロジェクトの実行
今迄とおなじようにRun>Android Applicationだけで動くはず。もし動かなければ(AVDが自動検出できないとき)ターゲットのAVDを設定してあげる必要がある。
Run Configurationsのtargetタブで先ほど(4で)作成したAVDを指定する。こうすることで実行できるようになる。

2009年04月16日

Android JUnit Test

1.5から、ついにテストをEclipseから動かすことができるようになりました。今まではテストのパッケージを手(やant)で端末にデプロイし、シェルで実行や確認を行うという形でしたが、これでだいぶ便利になったのではないかと思います。ApiDemosというサンプルには、ユニットテストが含まれているので、Eclipseからこれらのテストを実行する手順を載せます。

■1. ApiDemosをEclipseプロジェクトとして読込
File->New->Android Project->Create project from exiating source
で、「ApiDemos」ディレクトリを指定する
ApiDemosは、「SDK_HOME/platforms/android-1.5/samples」にあります。

■2. ApiDemosを実行
端末へデプロイするためです。

■3. ApiDemosのテストコード用Eclipseプロジェクトを作成
先ほどと同じように
File->New->Android Project->Create project from exiating source
で、今度は「ApiDemos/tests」ディレクトリを指定する

■4. プロジェクト間の参照設定
テストコード用Eclipseプロジェクトのプロパティを開き
Java Build PathのProjectsに「ApiDemos」プロジェクトを追加する

■5. テストの実行
適当なテストコード、あるいはテストコード用Eclipseプロジェクトを右クリックし、Run as->Android JUnit testを実行する

楽ですね~

2009年04月22日

SDK 1.5 PreのemulatorがBus Errorで落ちる場合

僕の3つ隣の席でLeopardを使ってる人が表題の件で悩んでました。私もLeopardなのに私の端末では発生しなかったので、なんでかなあ、と思っていたのですが、どうやらホスト名が解決できない場合に起きるようです。

お使いのLeopardのターミナルからhostnameと実行し表示されたホスト名に対してpingを実行して通らなければ、たぶんこの問題に遭遇すると思います。
パッチが出ているので、そのうち解消されると思います。
http://groups.google.co.jp/group/android-developers/browse_thread/thread/586ce0e87d13b702/b31299b3229d0c13

2009年05月01日

Android Marketにアプリが登録できない場合

以下のようなエラーが発生して、アプリがAndroid Marketに登録できないことがあります。

Market requires the minSdkVersion to be set in AndroidManifest.xml. The server could not process your apk. Try again.

原因は、uses-sdkタグの位置にあるようです。uses-sdkタグはmanifestタグの子要素です。本来であれば記述する順序はどこでもよいはずですが、一番最初に書かなければなりません。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="your.package"
android:versionCode="1"
android:versionName="1.0.0">
<uses-sdk android:minSdkVersion="2" />
・・・
</manifest>

などのようにすれば大丈夫です。ちなみに、こうなったのはつい最近です。本件はMarketのパーサーのバグなので、やがて改修されると報告されています。

Android Dev Phone 1のディスク空き容量が無くなる場合の対処方法

nAndroid Dev Phone 1を使い続けていると、不要なアプリやファイルを消しても空き容量が回復しないことがあります。こうなってしまうと、単なる黒電話になり、ネット関係はほぼ何もできないに等しいので非常に使いにくいです。ファイルシステム(yaffs2)でリークがあり、削除したはずの領域を解放しないことが原因のようです。かなり乱暴なのですが、対処方法を示します。

1. いったん端末の電源を落とす
2. 端末背面の蓋をあけておく
3. ブート中に電池を引き抜く
4. 電池をはめて通常通りブートする


この操作を行うと、解放されていなかった空き領域を認識するようになります。
なお、自己責任でお願いします。

センサーを用いたアプリがエミュレータで動作しない件

1.5r1では、Windowsでこの現象が起きます。Macで開発していれば発生しません。やがて対処されると思います。

Eclipseから参照するソースディレクトリの位置の変更

もともとは$SDK_HOME/sourcesでしたが、変更になりました。ターゲットが1.5系の場合は

$SDK_HOME/platforms/android-1.5/sources
になります。
ターゲットが1.1の場合は
$SDK_HOME/platforms/android-1.1/sources
になります。

2009年06月09日

GDDフォン

Google Developer Day 2009では、事前登録し、かつ当日実際に来た参加者に対して、サプライズプレゼントとしてGDDフォンが配られました。無料で一人一台ずつです。すごいですね。

GDDフォンは、ヨーロッパのVodafoneなどから提供されているHTCのMagicという端末です。Magicは、日本でもDoCoMoさんから、HT-03Aという型番で発売されることが公式に発表されています。

ただ、GDDフォンは開発者用端末なので、SIMフリーであることや、プラットフォームを載せ替えられること、といった開発者には嬉しい自由度が備わっています。

そして、さらに嬉しいことに、GDDフォンは、TELECTELEC(テレコムエンジニアリングセンター)の適合証明を受けています。G1やAndroid Dev Phone 1は、FCCFCC(米国連邦通信委員会)の認可は受けていましたが、TELEC の証明は受けていませんでした。日本で無線機として使うことにお墨付きはなかったのです。
つまりGDDフォンは、日本で正々堂々と使える初めてのAndroid機となるわけです。開発者にとって、正々堂々と開発できる端末があること、これはとても大事なことだと思います。GDDフォンの配布は、とても感激しました。

2009年06月11日

GDDフォンでのデバッグ

Android Dev Phone 1では、特に意識せずにステップ実行やインスペクションなどのデバッグが可能でしたが、GDDフォンではAndroidManifest.xmlに明示的に指定しないと、出来ないようになっています。ブレークポイントを置いても止まりません。おそらく今後はそうなるんでしょう。

AndroidManifest.xmlのapplication要素に、

android:debuggable="true"
を記述すればOKです。

2009年06月16日

WakeLock

AndroidのPowerManager(電源マネージャ)にはWakeLockという仕組みがあります。PCでも一定時間放置しているとスクリーンセーバーになったり、スリープしたりしますよね。WakeLockは、簡単に言うと一定時間経過後に勝手に画面がOFFになってしまったり端末がスリープしたりすることを防ぎたいときに使うものです。以下のような種類があります。

フラグCPU画面キーボード
PARTIAL_WAKE_LOCKOnOffOff
SCREEN_DIM_WAKE_LOCKOnDim(薄暗い)Off
SCREEN_BRIGHT_WAKE_LOCKOnBright(明るい)Off
FULL_WAKE_LOCKOnBrightBright(明るい)

例えば、SCREEN_BRIGHT_WAKE_LOCKを設定すると、その間は、画面のライトはつきっぱなし、CPUもアクティブのままになります。ただしユーザーが明示的に端末の電源ボタンを押したときは、スリープします。PARTIAL_WAKE_LOCKだけが少し特殊で、ユーザーが電源ボタンを押して端末をスリープさせても、CPUは動き続けます。ユーザーのポケットの中に端末がある間も、センサーの値を取得したりGPSの値を取得したりしたいときに使います。(1.5からPARTIAL_WAKE_LOCKのときにセンサーの値が取得できるようになっているようです。)

コードとしてはすごく簡単です。

WakeLock wakelock = ((PowerManager)getSystemService(Context.POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "[タグ名となる適当な文字列]");
・・・
// wakelockを取得
wakelock.acquire();
・・・
(処理)
・・・
// wakelockを解放
wakelock.release();

releaseは忘れないように、finallyなどでやった方がいいと思います。あと、容易に想像できますが、かなり電池食います。

2009年06月29日

Android SDK WG 第5回 セッションの申込を開始しました

個人的に忙しくて、しばらくお休みをしていたAndroid SDK WGのオフライン勉強会を開催します。

・Android SDK WG とは、日本Androidの会( http://www.android-group.jp/)のワーキンググループのうちのひとつで、Android SDKの理解を深めながら、開発者同士仲良くなろうぜ!を目的としたフランクな集いです。定期的に週末の午後を使って「セッション」と言う名の{勉強会|交流会}を開催しています。
・講演者や受講生という構図はありません。特にテーマは設けず、話したい人が自由に話すだけです。それをネタにして色々と意見交換ができたら面白いと思っています。(元々は私がAndroid開発者の仲間を増やしたいなあと思ってはじめたイベントです)

申込みはこちらからどうぞ
http://atnd.org/events/947

2009年07月03日

「Google Androidプログラミング入門」

 以前、Android SDKのベータ版(m3)が公開されてから約3か月後に、「Google Android完全解説」というムックを書きました。まだAndroidがほとんど知られてなかった頃でした。色々な人にAndroidを知ってほしかったので、当時僕らで出来る限りのことを調べて書きました。とても頑張って書いたのですが、やがてAndroidのバージョンアップによりAPIが大きく変わってしまい、掲載されているサンプルの多くがそのままでは動かなくなってしまいました。よくあることだと思いますが、うまく動かずに困っているといった話を耳にするたびに、最新バージョンに対応したものを早く出したいと思っていました。

 今回は、その贖罪のつもり、ではないですが、個人的にはその気持ちが強いです。前のムックでは出来なかった機能などについて、これもいれたい、あれもいれたい、と僕らで出来る限りの内容を載せているうちに、650ページにもなってしまいました。

Google Androidプログラミング入門Google Androidプログラミング入門
江川 崇, 藤井 大助, 麻野 耕一, 藤田 泰介, 山田 暁通, 山岡 敏夫, 佐野 徹郎, 竹端 進

Amazonで詳しく見る

 本書は、Android SDKを使ってAndroidプラットフォーム上で動作するアプリケーションを開発するための基礎知識を解説するものです。648ページと少し分厚いですが、その割に3,800円(税別)という意外とお得な価格になっています。

 どこにも目次が載っていないようなので、以下に貼り付けます。個人的なお勧めは、「ユーザーインターフェイス」です。実に100ページ以上費やして詳細に説明しています。標準のウィジェットをすべて載せた「ウィジェットカタログ」というサンプルも用意しています。「アプリケーションモデル」も濃いですが、楽しいと思います。「テスティングフレームワーク」も、今までここを紹介した本はないと思いますのでお勧めです。もしよろしければ、ご覧になってみて下さいませ。

目次

【第1部 基礎知識】
 ・Android SDKの概要
 ・Android開発環境
 ・開発ツール
【第2部 開発の基本】
 ・Androidアプリケーションの4大要素
 ・アクティビティ
 ・インテント
 ・サービス
 ・データ入出力と永続化
【第3部 画面要素】
 ・ユーザーインターフェイス
 ・グラフィックス
【第4部 実践開発】
 ・アプリケーションモデル
 ・セキュリティ
 ・リソースと国際化
 ・センサーAPI
 ・地図表示とロケーション
 ・テスティングフレームワーク
【第5部 応用開発】
 ・Input Method Framework
 ・ConnectivityManager
 ・カメラ
 ・メディア
 ・JNI(Java Native Interface)
 ・アプリケーションの実行結果を解析する
 ・ソースコードの探訪
 ・Androidの開発用端末
 ・アプリケーションの配布
【付録A】
 ・ウィジェットカタログ

2009年07月23日

iモード.netのメールをチェックするAndroidアプリ「芋煮」のベータ版を公開しました

 かなり悩みに悩んだ挙句、数日前にHT-03Aを買いましたが、友人や家族との連絡用にiモードのメールアドレスも残しておきたかったので、iモード.net(http://imode.net/)と同期するAndroidアプリを作りました。同じような機能を持つアプリもあるようでしたが、自分の使い方に合ったものがなかったので、自分で作ることにしました。

 アプリの名前は「芋煮(IMoNi)」と言います。数日使ってみましたが、実用に耐えるレベルになってきたような気がするので、ベータ版(0.9)として公開しました。Android Marketの「アプリケーション」-「ライフスタイル」に登録しています。

Android Marketより

「芋煮」は、iモード.netのメールをチェックするアプリです。最新10件のメールの一覧を見ることができます。一覧の情報は端末内部にキャッシュしており、通信圏外でも件名やメールアドレス、受信日時を確認することができます。また、定期的にメールをチェックする機能を備えており、新たなメールが届いたことを知ることができます。iモードのメールを継続してお使いの方にお勧めです。

「iモード」および「i-mode」は、株式会社NTTドコモの商標または登録商標です。
一部の画像は「Tango Icon Gallery(http://tango.freedesktop.org/)」よりお借りしました。素敵なアイコンを公開して下さっていることを感謝します。

・使い方

 初めて起動すると設定画面が出ます。ここでiモード.netに接続するためのdocomo IDや、パスワードを設定します。

設定画面


 他にも、定期チェックの更新間隔や通知時の設定(LED、バイブレーション、効果音)などを設定することができます。設定をし終えてから、Backキー(矢印型のキー)を押すとメインの画面が開きます。

メイン画面

 ここでは主にMENUから操作します。受信済の最新のメールの一覧を見たり、定期チェックの開始、停止などを切り替えたりすることができます。定期チェック機能の状況もこの画面で確認することができます。メールの一覧から1件を選択すると、そのメールの内容をiモード.netサイトへ接続して表示します。


 定期チェックでiモードの未読メールを見つけると、以下のようにステータスバーへ通知されます。

通知

 ヘルプはまだ作っていませんが、なんとなく操作はわかるのではないかと思います。まだ作ったばかりなので、バグがあるかもしれませんが、iモードのメールアドレスも併用していて、手軽にメールをチェックする方法を探している方は、もし宜しければ一度お試し下さいませ。

2009年07月24日

芋煮 0.9.1

やはり細かなバグがいくつかありましたので修正しました。ご指摘下さった方ありがとうございます。また、端末をスリープしていると、たまに定期チェックが動かないことがある点ですが、わかっていてそのままにしていたのですが、twitterのクライアントなどもWakeLockを使ってそうだったので、ちょっと嫌ですがこのアプリでもPARTIAL_WAKE_LOCKを入れることにしました。しばらく様子を見てみます。

参考:AlarmManager.RTC_WAKEUP Not Waking Device?

修正した不具合
・ログインがエラーとなった時に「直ちにチェック」ボタンが効かない
・チェック中のときにネットワークと接続が切れた場合、まれに状態がチェック中のままになる
・端末がスリープしていると、たまに定期チェックが動かないことがある

追加
・「芋煮について」のダイアログを追加

2009年07月27日

芋煮 0.9.2

iモード.netのメールをAndroidで手軽に見るアプリ「芋煮」ですが、個人的に使っていく中で気に入らなかった点や、リクエストを反映してだいぶいい具合に煮えてきました。まだヘルプを作っていないので、ヘルプの意味も含めて、新たに追加した機能の簡単な説明を書きます。

・メールのキャッシュ

メールの情報を本格的にキャッシュすることにしました。最大50件までのメールの情報がローカルに保存されており、一覧に表示されます。




一覧から任意の1件をタッチするとそのメールの詳細が出ます。この画面ではメールの本文も含めた全体を見ることができます。メール本文中にURLや電話番号があれば、そこを押すことでWEBをみたり電話をかけたりすることができます。




また、送信者のメールアドレスをクリップボードにコピーして連絡先(Contactsアプリ)を開くことができます。連絡先にメールアドレスを追加する作業をひと手間軽減できます(たいしたものじゃないですが)。

 メールの本文も含め、メールの内容を閲覧するためにiモード.netは必要ありませんし、今までよりもかなり軽快に動作するようになっているはずです。とは言え、顔文字が駄目なんですが。。。個人的には絵文字を使わないし、絵文字のメールも来ないので、ついついいいかなと思ってしまいます。

・スター(お気に入り)

一覧画面ではスターをつけることができます。上ではローカルに保存するメールの最大件数は50件と書きましたが、正確にはスターを付けていないメールの上限が50件です。スターを付けたメールは削除されることはありません。



メニューから、スターを付けたメールのみを表示することが可能です。つまりずっと残しておきたいメールや、頻繁に見るメール、忘れないように覚えておきたいメールなどにスターを付けておくとよいでしょう。



・フォルダ対応

スターを付けたメールを頻繁に見たくなる機会があるので、フォルダからも簡単にアクセスすることができるようにしました。フォルダはホーム画面を長押しすると出てくるダイアログから追加します。


「スター付きのiモードメール」を選択すると、ホーム画面にアイコンが一つ増えます。


このアイコンを押すと、芋煮を経由せずにスター付きのメールを確認することができます。どれかのメールを押すと、芋煮を開き、そのメールの内容が表示されます。

・ログイン回数の削減

iモード.netにログインしたときに送られる「ログイン通知メール」の存在を知りませんでした。HT-03Aしか使ってないと、そんなメールが来ていることに気付きません。これを知ったときはちょっとどうしようかと思いました。芋煮はログインしまくりだったので、タイムアウト時のみログインするよう修正しました。これでかなり通知メールの数は減るのではないかと思います。

iモード.net ヘルプ(https://imode.net/cmn/help/security/login_mail.html)より抜粋

ログイン通知メールはiモード.netにログインする際にログインがあったことをお手持ちの携帯電話にお知らせするメールです。ログイン通知メールをご利用いただくことで、いつログインされたかご確認いただけます。

※ワンタイムパスワードによるご本人確認を「しない」設定をされている方に送信されます。
※受信拒否設定をすることができません。
※受信料は無料です。(海外での受信時を除く)


iモード.net ログインできない方(https://imode.net/cmn/id/login.html)より抜粋

モードセンターのメールが最大保管件数である1,000件または約10Mバイトを超えた場合、ログイン通知メールを受信することができないため、iモード.netにログインすることができません。
携帯電話にメールを受信するか、iモードセンターからメールを削除して再度ログインしてください。

 iモード.netは、ログインするたびにログイン通知メールがiモードセンターへ送られるようになっています。iモードセンターのメールは最大1000件まで保管しか保管できず、それを超えた場合、それ以降のメールは受信することができません。iモードセンターのメールは、iモード対応のFOMA端末で受信(ログイン通知メールの受信にかかるパケット代は無料)するか、720時間(30日)経過するまで削除されません。また、iモードの「メール選択受信」機能を使えば、iモードセンターのメールを受信することなく削除することができます。今の芋煮だと720時間に1000件を超えることはまずありませんが、定期的にiモードセンターのメールの状況を確認されることをお勧めします。

2009年07月28日

iモード.netのメールを見るアプリ iモード.netメールクライアント 芋煮 0.9.4

芋煮でメールの送信や返信ができるように機能を追加してみました。

・メールの作成

メニューから「新規iモードメール作成」を選んだり、本文を表示する画面で「返信」ボタンを押すと、メールを作成する画面に飛びます。

宛先は連絡先(アドレス帳)と連携しているので手入力する必要はありません。先頭の何文字かを入力すると、氏名やメールアドレスを調べて、その文字で始まる人たちが候補で表示されます。

連絡先(アドレス帳)アプリからも芋煮を使ってメールを送信することができます。連絡先を開き、メールを送信を選択します。

そうすると、メールを送信することができるアプリケーションの一覧が表示されます。ここから芋煮を選択すると、芋煮のiモードメール作成画面に移ります。

ここまでの機能は0.9.3で実装しました。0.9.4ではメニューからCCやBCCを追加することができるようにしました。また、細かな不具合もいくつか直しています。ご指摘下さった皆様ありがとうございます。

2009年08月04日

芋煮 0.9.7

0.9.7をリリースしました

機能拡張
・下書き、送信済みメールの管理
・スター済みメール以外を全て削除する機能を追加
・送信結果の通知をステータスバーで行うように変更(従来の方法と設定で切り替え)

2009年08月06日

芋煮 0.9.8

0.9.8をリリースしました

・メールが複数の宛先に同報されている場合に、全員へ返信することができるようにした
・内部構造を見直し、アプリのファイルサイズをコンパクトにした

その他、細かな調整、バグ修正

2009年08月07日

芋煮 0.9.9

芋煮0.9.9をリリースしました。

機能追加
・メールの転送

主な不具合修正
・定期チェックが止まることがある現象の対策
・リストの最大件数のチェック方法が不十分だった点を修正

その他細かな不具合修正

Androidアプリは助け合いながら動くのです

変えるなら、まずAndroidから。Androidの中にいる小人たちが仲良くしてたら、そのAndroidを持っている人同士も仲良くなれたりしませんか?人同士が仲良くなると、やがて地球が平和になったりしませんか?そんなことないですかね?そうなるといいなあ。

何が言いたいのかというと、Androidでのアプリは助け合いながら動くんです。効果的に助け合うには、アートな感覚が必要なのだと思いますが、試すだけならすぐできます。これくらいならすぐにできるよ、という例を、俺アプリを基に示したいと思います。

俺アプリ「Jot」

 このアプリ(Jot)は、簡単にメモしたい時に使うツールです。僕が自分のためだけに作ったシンプルなアプリです。外出時に何かを思い出したり、面白いことを思いついたりした際に、そのことを忘れないようにするために使っています。

・今まで書いたメモのリスト画面




・メモを書く画面



 入力すると勝手に保存されるので、書いてからいきなりアプリを落としても大丈夫です。また、メモはSDカードの中にテキスト形式で保存していますので、PCなどへ取り出せます。

 これだけの機能しか実装していません。コーディング時間は数時間です。僕はコーディング速度がそれほど速くありませんが、もっと速い人なら1時間程度で作ることができるでしょう。

 Jotにはもうちょっとだけ機能がついてます。

例えば、WEBをブラウズしているときなどに、「あーこれメモしたい」と思ったら、

・メモしたい文字を選択してコピー




・Simejiの「マッシュルーム」ボタンを押してJotを呼ぶ





と、メモれます。



 メモをメールで送ることもできます。メモの内容がメール本文につきます。どんなメールクライアントからでも送ることができます。Gmailでも、芋煮でも、あるいはほかのメールクライアントでもOKです。

 ・・・でもこれらは、Jotそのものに機能があるわけではありません。Jot君はあまり多くのことができないので、色んなことができる他のアプリさんたちに助けてもらっているんです。アプリたちが各々の得意分野で力を発揮しあいながら、利用者のためにひとつの機能として提供してくれてるんです。なんだかほのぼのとして、可愛いとすら思えます。

アプリには、

「オレはこんなことができるんだぜ!」
「私はこれとこれとこれが得意よ」
「僕に何か頼みたいなら言ってね」

のような宣言をしておくと、他のアプリを助けることができます。Simejiはそのように配慮してくれているので、Simejiから力を貸してもらうことができます。こういうのって楽しいですよね。もちろん、中には、○○ができる力があるのに、宣言せずに黙ったままのアプリもあります。僕もそうですが、ついついそういうアプリを作ってしまいがちだと思います。でもこれって、近くに困っている人がいるのに見て見ぬふりをして助けてあげないのと同じような感じですよね。

というわけで、Jotも口を開いてます。

ActionIntent.ACTION_SEND
Scheme"jot"
メモ本文のキーIntent.EXTRA_TEXT

で、Jotにメモれるようにしています。

一応apkを(Jot_001.apk

2009年08月11日

芋煮 0.9.10

芋煮 0.9.10をリリースしました。

機能追加
・標準的な絵文字を表示できるようにした
・ウィジェットを追加した(暫定)
・差出人を連絡先に登録できるようにした
・差出人などがアドレス帳に存在する場合に、氏名を併せて表示するようにした
・メール送信時のエラーチェックを少し拡充した

 絵文字の表示は、かなり多くの方からご要望を頂いたので、ちょっと頑張ってみました。ですが、あくまでも標準的な絵文字の表示のみです。デコメ絵文字は表示できませんし、絵文字が付いたメールを書いたり送ったりすることもできませんのでご注意下さい。絵文字の画像は「My First HDML」様(http://www001.upp.so-net.ne.jp/hdml)よりお借りしました。ありがとうございます。有用なコンテンツを広く公開して下さっていることに心より感謝します。以下が、現在の芋煮が表示可能な絵文字の全てです。


【補足】ステータスバーへの常駐について

芋煮が動いているかどうかがわかるように、ステータスバーにアイコンを常駐させてほしい、というご要望を複数の方から頂いています。この機能は、ずいぶん前から検討はしているのですが、芋煮が意図せず殺されたことを全てのケースで確実に知る方法がないため、ケースによっては芋煮が動いていないにもかかわらずステータスバーにアイコンが出たままになってしまうことがあります。そのため、この機能の実装は見送っています。代わりというわけではありませんが、ホーム画面に芋煮のウィジェットを置けるようにしてみました。とりあえず、前回のチェック(確認)時刻と、定期チェックの状態、未読の有無 を表示しています。

ウィジェットの追加は簡単です。
ホーム画面を長押しするとダイアログが表示されるので、「ウィジェット」を選択します



追加可能なウィジェットが表示されるので、ここで「芋煮」を選択します。



するとホーム画面に芋煮のウィジェットが表示されます。



 ウィジェットは、ステータスバーよりも幅は取りますが、芋煮の定期チェックの状態はわかるような気がします。また、私の周囲では芋煮のアイコンが著しく不評なのですが、ウィジェットをクリックすると芋煮が起動するので、ウィジェットを使えばあの芋アイコンを見ずに済むというメリットもあります。アイコンがかっこ悪いのは私の力不足です。うまく作れなくてすみません。
 なお、ウィジェットは、とりあえず実装しました。という感じなので暫定的な機能の位置づけです。本当に便利なのか、正しく動いているか、また電池の消費量が許容できるか、少し様子を見てみます。

2009年08月12日

芋煮 0.9.11

芋煮 0.9.11をリリースしました。

不具合修正
・ホームアプリが落ちるとウィジェットの表示が消えることがあった問題を修正
バグはあるだろうと思っていましたがやっぱりありました。

機能追加
・メール送信後は定期チェック間隔を一時的に短くする機能の追加(設定により選択可能)
メールを送信したら返信が来るかもしれないので、返信を早く受け取れる機会を増やすためです。設定を有効にすると、メールを送信してから約15分間だけ、90秒程度の間隔でチェックするようになります。15分たつと元の間隔に戻ります。

2009年08月17日

芋煮=>IMoNi 0.9.12

芋煮=>IMoNi 0.9.12をリリースしました。

機能追加など

・アプリケーションの名称を、漢字(芋煮)からアルファベット表記(IMoNi)へ変更しました
アルファベットへの変更だけとはいえ、途中で名前をいじるのってダメなんじゃないか、、とさんざん迷ったのですが、アイコンの変更に伴い一気にやってしまうことにしました。今まで通り「芋煮」と呼んでくださっても結構です。「芋煮」でも検索に引っ掛かるようにしています。
・アプリケーションのアイコンを変更しました
アイコンはプロのデザイナーさんとして各方面で活躍されている「矢野りん (http://yanorin.blogspot.com)」さんが作成して下さいました!本当にありがとうございます!かなり嬉しいです。
というわけで、晴れてIMoNiのイメージキャラクターとなった「イモーニ君」です。



・基本的な絵文字の入力を可能にしました

絵文字の入ったメールが書ける&送れるようになりました。

絵文字の入力は、とても簡単です。メールを作成する画面で、メニューから「絵文字入力部の表示」を選びます。



すると、絵文字の入力ツールが表示されますので、使いたい絵文字を選択すると、本文などに絵文字を挿入することができます。

ちょっと絵文字が小さいため文字のサイズと合ってませんが、、とりあえずこれで。。というか、少し使ってみましたが絵文字の入力も今の方法では選ぶのが大変ですね。絵文字の選択に関する操作には改良できる余地が多々ありそうです。

不具合修正
・メールの本文を表示する画面で、メールによって本文の右端が欠けてしまう(読めない)問題を修正しました
・メールの本文を表示する画面からリストの画面へ戻ってきた時に、前のリストの位置を表示するように修正しました

2009年08月20日

IMoNi 0.9.13

IMoNi(芋煮) 0.9.13をリリースしました。

・絵文字の入力方法の改善(ただし現状はまだ完成版ではありません、ちょっと今日は詳細に書く時間がないので、また改めて説明します。)
・絵文字のサイズがテキストのサイズに合うように
・絵文字を使ったメールの返信、転送時にも絵文字が出るように
・返信時はフォーカスを本文に
・その他細かな不具合の修正

2009年08月24日

IMoNi 1.0.0

 IMoNi(旧:芋煮)に数多くのコメントとご要望を頂きありがとうございます。頂いたご要望については全て記録しています。できるものから少しずつ対応していきたいと考えています。頂いているご要望全てを実現できているわけではありませんが、主要な機能はだいたい実装し終えたと判断し、今回のリリースで1.0.0にすることにしました。

・絵文字を入力する画面「Emoji Picker」の本格導入
・メールを作成する画面の「送信」ボタンと「下書き」ボタンの位置を逆に
・本文を表示する画面の文字色を白に
・本文スクロール時にタップしても文字が暗くならないように
・新着メールをステータスバーへ通知する際に、送信者が連絡先に登録されていればその氏名を表示するように
・その他、細かな調整や修正

以降で、絵文字を入力する仕組み「Emoji Picker」について説明します。


1. 絵文字入りメールの作成

メールを作成する画面を開き、メニューから「絵文字を入力」を選択すると、絵文字を入力する画面が開きます。これを「Emoji Picker」と呼びます。

ボタンの下に

・選択した絵文字
・最近使った絵文字(5つ)
・選べる絵文字全ての候補

の順で並んでいます。

絵文字は連続入力することができます。「入力した絵文字を反映」ボタンを押すと元の画面に戻り、それまでに選択した絵文字たちがフォーカスがあたっていたテキスト入力エリアに渡されます。




2. simejiとの連携(mashroom)

Emoji Pickerは、IMoNiの外からも利用することができます。まずはsimejiとの連携です。試しにGmailアプリのメール作成画面を表示している状態でsimejiの「マッシュルーム」ボタンを押します。



「Emoji Picker」を選択します。



Emoji Pickerが開きますので、IMoNiで絵文字を入力するときと同じように絵文字を選択します。Gmailの画面に戻ってくると、絵文字が四角い文字として表示されています。読むことはできないのでちょっと微妙ですが、絵文字のコードは確かに入力されていますので、このまま送ることができます。




ただし、(少なくとも現時点の)Emoji Pickerが送れるのはDoCoMoの絵文字の文字コードだけです。DoCoMo以外のキャリアに送っても正しく表示はしてくれないでしょう。なおPC版のGmailでは、送信時に各キャリアに合わせた文字コードに変換して送ってくれているようです。


3. 他のアプリとのマッシュアップによる連携

Emoji Pickerと連携できるのはsimejiだけではありません。例えば、あなたが今開発されているアプリからEmoji Pickerを使うこともできます。Emoji Pickerとの連携は、Intentを使います。

・Emoji Pickerを呼び出すIntentの設定項目

アクションnet.grandnature.android.emojipicker.ACTION_PICK_EMOJI
カテゴリnet.grandnature.android.emojipicker.CATRGORY_DOCOMO_DEFAULT

・コード例

final String ACTION = "net.grandnature.android.emojipicker.ACTION_PICK_EMOJI";
final String CATEGORY = "net.grandnature.android.emojipicker.CATRGORY_DOCOMO_DEFAULT";
・・・
Intent i = new Intent(ACTION);
i.addCategory(CATEGORY);
startActivityForResult(i, 1);

これでEmoji Pickerを呼び出すことができます。Emoji Pickerで選択された絵文字は、文字コードと画像データに分けてIntentに詰められて返ってきますので、その内容を取得すればOKです。

種類キー名
文字コードStringKEY_PICKED_EMOJI_CHAR_CODES
画像データList<byte[]>KEY_PICKED_EMOJI_ICONS

KEY_PICKED_EMOJI_CHAR_CODESには、入力された絵文字の文字コードが順番に入っています。KEY_PICKED_EMOJI_ICONSには、入力された絵文字の画像データ(byte配列)が順番に入っています。例えば、Emoji Pickerを呼び出したアクティビティのonActivityResultメソッドで、以下のように記述すれば取得することができます。

final String KEY_PICKED_EMOJI_ICONS = "KEY_PICKED_EMOJI_ICONS";
final String KEY_PICKED_EMOJI_CHAR_CODES = "KEY_PICKED_EMOJI_CHAR_CODES";
・・・
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if(resultCode == RESULT_OK) {
    List<byte[]> icons = (List<byte[]>) data.getSerializableExtra(KEY_PICKED_EMOJI_ICONS);
    String charCodes = data.getStringExtra(KEY_PICKED_EMOJI_CHAR_CODES);
    int len = charCodes.length();
    for (int i = 0; i < len; i++) {
      InputStream in = new ByteArrayInputStream(icons.get(i));
      // i番目の絵文字の画像
      Drawable image = new BitmapDrawable(in);
      // i番目の絵文字の文字コード
      char code = charCodes.charAt(i);
      ・・・
    }
  }
}

Emoji Pickerを利用している簡単なサンプルプログラム(HelloEmoji)を作ってみました。UIはかなり手抜きですが、受け渡しの仕組みはつかんでもらえるかと思います。

・「絵文字を選択」ボタンを押すと、Emoji Pickerを呼び出します。
・Emoji Pickerから戻ってくると、Emoji Pickerで選択された絵文字の画像を表示します。
・絵文字の画像にタッチすると、その絵文字の文字コードを表示します。

このサンプルのEclipseのプロジェクトをそのまま圧縮して置いておきます。(HelloEmoji.zip

2009年08月31日

IMoNi 1.1.0

IMoNi 1.1.0をリリースしました。今日は詳細に書く時間がないので、簡単に書きます。

・メールの情報を他のアプリと共有する機能の追加

端末にインストールされている他のアプリケーションに対して、メールの情報をプレゼントする機能です。メールの本文を表示する画面のメニューから「共有」を選ぶことで利用できます。メールの情報は、テキスト形式の情報を扱える旨を表明しているアプリケーションに対してプレゼントできます。

・受信済メールをSDカードへエクスポートする機能、SDカードからインポートする機能の追加

アプリの再インストール(端末の初期化)時に、メールを失わないようにするための機能です。受信済メールの一覧画面のメニューから行えます。エクスポート、インポートできるのは受信済メールのみです。送信済みメールや下書きメールについては、まだ機能を設けていません。テストはしたつもりですが、もし万が一不具合があったらごめんなさい。

・受信済メールをフィルタする機能の追加

ある文字列が含まれるメールのみを表示する機能です。受信済メールの一覧画面で(HT-03Aであれば、端末右下にある)「サーチ(むしめがね)」ボタンを押すか、メニューから「メールのフィルタ」を選ぶことで利用できます。

以下は、その他の細かなものです。

・時刻の表示を24時間表記に
・下書きや送信済メールのリストから1件のメールの編集画面に行き、再度リストへ戻ってきた時に、前回表示していた位置を表示するように
・その他細かい修正、調整


2009.8.31 20:45頃 追記:
忘れてました。。

・メールを送る前(送信ボタンを押したとき)に、確認ダイアログを出せるように

誤送信してしまう方はお使いください。設定で切り替えられます。

・メール本文のどこかを長押しでクリップボードにコピーできるように

2009年09月07日

IMoNi 1.2.0

2009.09.07 21:35追記
IMoNi 1.2.0に、新規インストール時に設定を完了できない不具合がありました。1.2.0を新規にインストールされた方は一度アンインストール後、1.2.1をインストールし直してください。以前のバージョンからお使いの方はアップデートで問題ありません。申し訳ありませんがよろしくお願いします。


IMoNi 1.2.0をリリースしました。追加、変更点を簡単に書きます。

・設定でメールの送信結果をステータスバーに表示「しない」ようにしている場合も、送信を失敗したときはステータスバーで知らせるように
送信失敗時のみ教えてほしいという方は、チェックを外してお使い下さい。

・メールに対して返信したか、転送したかがわかるように
返信済み、転送済みのメールはリストのアイコンが変わります

・メールの作成画面で、テキスト入力部をタップしなくてもソフトウェアキーボードを出すように
例えばEmoji Pickerから戻ってきた場合などにキーボードが消えていましたが、なるべく出すようにしました。

2009年09月10日

IMoNiの紹介ページ

 最近IMoNiを紹介して下さっているサイトやblogを拝見する機会が多くなりました。感謝の気持ちをこめて、4つのページを載せたいと思います。評価の中で多いのは、AndroidらしいAndroidっぽいという文脈です。これは「便利」を超える最高の賛辞ではないかと私は思います。


・日経トレンディネット
これは便利! アンドロイド携帯でiモードメールを送受信できるアプリ
http://trendy.nikkeibp.co.jp/article/column/20090904/1028655/?P=1

石川さんという方が、Androidの魅力について、IMoNiを題材にして語って下さっています。ただいいアプリ、ではなく、このコンテキストで取りあげて下さったことが嬉しいです。


・ケータイWatch
「みんなのケータイ」HT-03Aの「Androidらしい」お勧めアプリ5つ
http://k-tai.impress.co.jp/blog/2009/08/googleht-03a-1.html

なんと先頭に挙げて下さっています。「Androidらしい」というのはとても嬉しいほめ言葉ですね、ありがとうございます。


・Androidあぷぷ
かなり完成度が高いiモード.netクライアント「IMoNi」
http://www.android-app.info/2009/08/24/imoni/

このサイトでは、かなり初期のころから精力的にアプリを紹介されていますので、載せてもらえて光栄です。Androidと一体化しているという感想はすごくうれしいです。


・HT-03A Androidアプリ・ゲーム~Androidアプリで遊び倒せ~
2009年9月 独断と偏見のAndroidアプリベスト10!(ゲーム以外部門)
http://ht03a.blog.shinobi.jp/Entry/51/

2位にランクインしています。独断と偏見であったとしても、運営されている方の中では2位ということなので、嬉しいです。


 なお、ここでは上の4つのサイトしか載せていませんが、他にも紹介して下さった方々がたくさんいらっしゃるようで嬉しいです。ありがとうございます。

2009年10月06日

IMoNi 1.3.0

大変お待たせしました。i-mode.netの変更に対応したものをマーケットにリリースしました。私が長期旅行中だったためご迷惑をおかけしました。昨日帰国しました。フランスではネットにつなげやすかったのですが、イタリアではネットにつなげる環境をうまく手に入れられなかったので、お返事もできませんでした。どうもすみません。

リリースしたものは、kooさんが対応して下さった野良アプリとほぼ同じですが、前のバージョンでエクスポートしたメールがインポートできないという不具合の修正も加えています。

・iモード.netのレイアウト変更対応
・フォルダ機能の追加

2009年10月16日

IMoNi 1.4.0

たくさんのコメント、ご意見、ご感想、ありがとうございます。最近忙しくてコメントを満足に返せておらず申し訳ありません。頂いたご意見を基にして、少しずつ拡張していきます。
IMoNi 1.4.0をリリースしました。

・iモードセンターのメールBOXが一杯でiモード.netへログインできないときに、そのことを知らせるよう修正
・画像付きメール(デコメなど)の表示
要望が非常に多いので実装してみました。うーん、いまいちイケてない気がしますが、動くのは動いてそうですのでとりあえず公開します。無いよりはマシ程度ですが、もし宜しければお使い下さい。お使いになる場合は下記【説明】【注意事項】をお読み下さい。


【説明】

デコメなどの画像付きメールは、リストの右側(スターの左側)に、小さな画像マークが出るようになっています。



メール一件の内容を見ても、今までと同様に画像は無視されています。



この画面のメニューから「画像も含めて表示」を選ぶことで、画像も含んだメール全体をHTMLとして確認することができます。




【注意事項】

  • 画像は「画像も含めて表示」を押したときにiモード.netへ取りに行きますので、通信が発生します。通信圏内にいなければ、画像を見ることができません。
  • iモード.netへ接続しているセッションが有効な状態でなければ画像が表示できません。通信圏内にいるにもかかわらず画像が表示されない場合は、iモード.netへのセッションが無効になっている可能性がありますので、一度「ただちにチェック」などでメールチェックを行い、セッションを確立してから、再度画像の表示を試みて下さい。
  • この機能は、本バージョンのIMoNiをインストールしてから新たに受信したメールにのみ有効です。前バージョンで受信済のメールには適用されません。
  • 画像の形式によっては、本来アニメーションするはずのものがアニメーションしないことがあるようです。(おそらくアニメーションGIFがダメなようです。)

2009年10月22日

IMoNi よくある質問(FAQ)

本ページの内容は こちら に移動しました。

2009年10月23日

落ちないServiceの作り方

 最近このBLOGがIMoNiのサポートサイトと化しているので、たまには開発者向けの投稿でも書いてみようと思います。

 何らかを定期的に監視し続けるときのように、ずっと動き続けるService(システムが提供する機能というわけではなく、AndroidのServiceコンポーネントです。)を作ることがあると思いますが、私が初めて取り組んだときは、意外とハマりどころがあるなと思いました。このことは、いつの間にか落ちていたり、停止できなかったりするアプリを目にすることが意外と多いことからも頷けると思います。

 多分いろいろな実装方法があると思いますし、処理の特性によって最適な方法は異なるかもしれませんが、私が一番簡単じゃないかなと思っているやり方を簡単に述べます。他にもアイディアや観点があれば是非教えて貰えるとうれしいです。


・息の長いThreadよりonStartとAlarmManagerを使う
 どちらも試しましたが、後者の方がコードが簡潔になりますし、バグが混入しにくいような気がします


・onStartから作業用Thread(Task)を起こす
 onStartで時間をかけすぎると(多分5秒以上)怒られるので、時間がかかる場合は別スレッドで行い、onStartは直ちに終わるようにします。ちなみに生Threadよりもjava.util.concurrent.ExecutorServiceなどを使ったほうが簡単かもしれません。例外の取り方に癖があるので気をつけます。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/concurrent/Callable.html


・定期的に処理を行う場合は、作業用Threadの処理終了時にAlarmをset
 作業用Threadは、一回処理をして終わるようにします。定期的に処理したい場合はThreadが終わる時にAlarmに登録します。


・止める処理もonStart
 止めるときの処理もonStartでやるのがいいような気がします。intentのActionで振舞いを分けるイメージです。以下のような感じです。止める時も呼び側がstartServiceなのか、と少し誤解を招きそうですが、僕はこうしています。

public void onStart(final Intent intent, int startId) {
 super.onStart(intent, startId);
  if (ACTION_EXECUTE.equals(intent.getAction())) {
   // スレッド起こして処理実行
  }
  else if (ACTION_STOP.equals(intent.getAction()) ){
   // 終了処理(Alarmのキャンセルなど)
  }
  ・・・
}

もちろんバインドして終了処理を呼ぶ方法もありだと思います。


・必要に応じてwakelockを使う
 Alarmはpartial wakelockを取得してないとスリープ時に呼ばれないことがあるようです。またwifiなどもスリープする可能性があるので、処理の特性に応じて適宜最小限のwakelockをかけます。


・・・ところで、Androidにはちょっと厄介な特性があります。それは、メモリが足りないなどの諸々の理由でServiceが勝手に殺されることがあるということです。


・onLowMemoryは期待しない
 メモリが少なくなるとonLowMemoryメソッドが呼ばれます。このメソッドをうまく活用すればよいのですが、あまり役に立ちません。なぜなら、このメソッドはちょっとしたことですぐ呼ばれるからです。


・onDestroyも期待しない
 じゃ、死ぬときにonDestroyが呼ばれると思いきや、呼ばれずに死ぬことの方が多いです。なので、ここにコードを書いてもあまり意味はありません。


・各処理の終了時に現在の状況を保存しておき、onCreateで再startする
 つまり死ぬことを予め予期できないし検知できないので、いつ死んでもいいように、なんらかの処理を終えたときに最新の状況を逐次記録(永続化)しておきます。Serviceのプロセスは殺されたとしても、しばらくするとまた別のプロセスが勝手に生成されます。しかしこの時点ではServiceはまっさらな状態なので、以前の最新の状況を読み込んで、何をやっていたかを思い出してから再度動き続けるようにします。

以上です。
繰り返しますが、他にも「おれはこうやってる」などのアイディアや観点があれば是非教えて貰えるとうれしいです。

2009年10月28日

IMoNi 1.4.2で受信できなかった方へ

昨夜から、お使いの端末の環境によってはメールが受信できないという問題が発生していました。(多分クリーンインストールせずにアップデートするとダメだったっぽいです。)
ご迷惑をおかけしました。さきほど1.4.3をリリースしましたので、マーケットからダウンロードしてお使い下さい。
今回はDoCoMoさんに変更があったわけではなく、私と、もう一人のIMoNi開発者kooさんとの間で発生してしまったミスです。
ごめんなさい。

2009年11月24日

debug用キーストアの有効期限は一年

Androidのdebug用のキーストアは、1年間だけ有効なようです。なので、一年以上同じ端末の同じユーザーで開発し続けていると、以下のようなメッセージが表示されて、apkが作成できなくなることがあります。

Error generating final archive: Debug certificate expired on yy/mm/dd hh:mm!

この場合は、ホームディレクトリ近辺(ホームディレクトリ/.android/など)にある、debug.keystoreという名前のファイルを一度削除すれば大丈夫です。

2010年03月18日

IMoNi 1.6.0beta

とても長くご無沙汰していました。メールやコメントを頂いた皆様ありがとうございます。お返事できていなくて申し訳ありません。とても感謝しています。

IMoNi 1.6.0betaを野良アプリとして公開します。DL先は一番下にあります。


【追加機能】

・メールへの画像の添付
・メールへのデコメ絵文字の挿入
・写メールや音声などの添付ファイルのオープンおよび保存
・設定によりトップ画面をフォルダリストに変更

大きな機能追加なので、安定するまではAndroid Marketには上げずに野良アプリとして公開します。不具合があれば教えてください。

【主な使い方】

・画像やデコメ絵文字の使い方

メールを作成する画面のメニューに、「画像の添付」と「デコメ絵文字」が増えています。




ギャラリーアプリケーションから画像を選びます。ギャラリーアプリケーションは端末によって異なります。




デコメの場合は、こんな感じに本文に挿入されます。




添付ファイルの場合はこんな感じです。




・添付ファイルの開き方

メール本文を表示する画面のメニューから「画像やファイルを表示」を選びます




この画面で、ファイルを開いたり、SDカードに保存したりすることができます。開く場合は、音声なら音楽プレイヤー、テキストならテキストエディタ、といったように、そのファイルの形式に応じたアプリケーションが呼び出されます。




【注意事項】

  • 画像や添付ファイルはiモード.netへ取りに行きますので、通信が発生します。通信圏内にいなければ、画像や添付ファイルを見ることができません。
  • iモード.netへ接続しているセッションが有効な状態でなければ画像が表示できません。通信圏内にいるにもかかわらず画像が表示されなかったりファイルがダウンロードできなかったりする場合は、iモード.netへのセッションが無効になっている可能性がありますので、一度「ただちにチェック」などでメールチェックを行い、セッションを確立してから、再度画像の表示を試みて下さい。
  • 同時にダウンロードできるファイルはひとつだけです。複数のファイルをダウンロードするときは、ひとつずつ実施して下さい。
  • デコメ絵文字のサイズは90KBまで、画像形式はJPGとGIFのみです。PNGは使えません。
  • 今までのバージョンのIMoNiで既に受信済みのメールの本文にある顔文字が表示できず [画像] という表示になります。「画像やファイルを表示」を押せば見ることができます。対応を検討中です。
  • 画像の形式によっては、本来アニメーションするはずのものがアニメーションしないことがあるようです。(おそらくアニメーションGIFがダメなようです。)
  • 転送時や送信済メールには、添付ファイルが反映されません。

【その他】

・今回のバージョンより、新たにshooさんがIMoNiの開発メンバーに参加して下さいました。今回の機能が実現できたのもshooさんのおかげです。仲間ができてとても嬉しいです。



Download IMoNi 1.6.0beta



2010年03月31日

IMoNi 1.6.0(正式版)

IMoNi 1.6.0(正式版)をAndroid Marketにリリースしました。IMoNi 1.6.0betaを試して下さった皆様ありがとうございます。Android Marketにリリースすることができたのも試して下さった皆様のおかげです。

ver.1.5.0からの差分】
・メールへの画像の添付
・メールへのデコメ絵文字の挿入
・画像や音声などの添付ファイルのオープンおよび保存
・設定によりトップ画面をフォルダリストに変更

ver.1.6.0betaからの差分】
・他アプリからの共有機能による画像添付(FxCameraなどと組み合わせれば写メールができます)
・新着が1件だけの場合、対応するフォルダを表示
・受信メールの最大件数を300件に
・デコメ画像の保存
・メール本文に署名を挿入可能に
・その他色々と細かな調整

・今までのバージョンのIMoNiをお使いの方へ
 添付ファイルの保存やデコメ画像の保存機能は、本バージョンのIMoNiで新たに受信したメールから有効になります。

・IMoNi 1.6.0betaを試して下さった方へ
 IMoNi 1.6.0betaをお使いの方もアンインストールせずにAndroid Marketからアップデートすることができると思います。添付ファイルの保存やデコメ画像の保存機能は1.6.0正式版で少し改善していますが、改善後の機能は1.6.0正式版のIMoNiで新たに受信したメールから有効になります。

併せて、「よくある質問(FAQ)」を刷新しました。文章ばかりで少々長いですが、IMoNiをお使いになるにあたって気になる点や疑問点がある方は、「よくある質問(FAQ)」をご確認頂ければ答えが見つかるかもしれません。

2010年04月02日

IMoNiの野良apkの公開を停止しました

本日(4/1)、このBLOGに大量のアクセスがあり何度かサーバーが停止してしまいました。(このサーバーはスケールしないレンタルサーバーなので、負荷に弱いです。。)
アクセスの大部分はIMoNiの野良apkへのアクセスだったようですので、一旦野良apkを消去しました。
IMoNiをお使いになる方は、Android Marketからダウンロードして下さい。よろしくお願いします。

2010年04月04日

IMoNi 1.6.1

IMoNi 1.6.1をAndroid Marketにリリースしました。特に1.6.0で送信できるが受信できないという現象に遭遇されている方は、今回のバージョンでアップデートすると受信できるようになるのではないかと思います。

【ver.1.6.0からの変更点】
・iモード.net(WEBサイト側)の設定によってはIMoNiで正常に受信できないことがあった問題を修正
・返信時に本文を引用する機能を追加(初期状態ではOFF。設定で切替)
・メールのエクスポート/インポート時に、下書きメールと送信済みメールを含むように
・iモード.netメールの送信先制限が最大5件から4件に減っていた件についての対応
・前のバージョンのIMoNiで受信したデコメ画像の表示
・XperiaのPOBoxで入力確定時に自動的にスペースが入る件に対する対応
・メール本文の改行コードを\nから\r\nで送信するように変更

 なお、大変申し訳ありませんが今回のバージョンから受信メールのデコメ画像や添付ファイルを表示する画面の下部に広告が表示されることがあります。注釈文を減らしたので画面サイズとしては今までよりも狭くなっているということはないと思います。この画面以外に広告が出ることはありません。ご迷惑かもしれませんが、何卒寛大な心で受け入れて頂けると幸いです。

デコ美

tomorrowkeyさんという方が、IMoNiからデコメ絵文字を簡単に選択できるようにするアプリ「デコ美」を作成して下さっています。tomorrowkeyさんありがとうございます。

tomorrowkeyさんのBLOG「明日の鍵」

Android MarketでIMoNiを検索すれば「デコ美」も出てくると思います。

Androidでは他のアプリケーションと簡単に連携できますので、もし今のIMoNiの機能で満足がいかない点があれば、IMoNiと連携できるアプリケーションをAndroid Marketから探してみたり、あるいはtomorrowkeyさんのように自作することも比較的容易に可能だったりします。このように、様々なアプリケーションを組み合わせて端末全体を自分流にカスタマイズできる点がAndroidのよさではないかと思います。

2010年04月07日

電池の消費量を把握する方法

Xperiaは電池があまり保たないという話を耳にしたので、電池の使用量をプロセス毎に確認する方法について書きます。

Androidの「設定」アプリを開き、一番下の「端末情報」=>「電池使用量(電池を使用している操作)」を選択することで、各プロセスの電池使用量を確認できます。
電池を消費しているものから順に表示されますので、電池を節約する方針を決定する上での判断材料になるかもしれません。

2010年04月16日

IMoNi 1.6.2

IMoNi 1.6.2をリリースしました。

【主な変更・修正】
・Xperia向けにスタンバイ時間を減らして省電力に
・送信済みメールの改行が四角になっていた点の対応
・Auからのデコメ絵文字が保存できないことがあった点の対応
・送信済み、下書きメールのメールアドレス表示で名前も表示できるように
・メール本文画面の背景色を白に変更可能に(設定にて)
・iモード.netが深夜に返すエラーの対応
・その他細かな修正、調整

2010年04月26日

IMoNi 1.6.3

IMoNi 1.6.3をリリースしました。

【主な変更点】
・mailtoスキーマの正式対応
・一回の最大受信件数を10件から100件に拡張
・グループによる振り分け設定の対応
・フォルダ振り分け設定のエクスポート、インポート
・「全てのメール削除」をフォルダごとに
・受信中に再度チェックした場合に定期チェックが停止することがあるなるなどの不具合修正
・その他

詳細はまた後ほど書きます。

2010年05月17日

解消しているみたいです (was: imode.netに繋がりにくくなっているようです)

2010/5/18 AM 6:58 追記:復旧しているみたいです。復旧のご連絡を下さった皆様ありがとうございます。


現在imode.netに繋がりにくくなっているようです。 ご面倒をおかけしますが、IMoNiをお使いの方は、imode.netが安定稼働するまでしばらくお待ち頂けないでしょうか。ブラウザからだとうまくログインできるケースもあるみたいですので、急用の方はブラウザからアクセスしてみて下さい。宜しくお願いします。

2010年05月18日

またつながりにくいようですね

昨日に引き続き、またiモード.netが不安定なようです。
ご迷惑をおかけしますが、安定稼動までしばらくお待ち下さいませ。ブラウザで何度かリトライしていると、つながるケースもあるようですので、お急ぎの方はそちらで対応されることをお勧めします。

ところで、IMoNiをお使いの方にご理解をお願いしたいことがあります。
IMoNiは、iモード.netを見に行くアプリケーションでしかありません。twitterのサーバーが不安定な状況では利用できないtwitterクライアントなどと同じです。
iモード.netに安定してつながらない状況では、IMoNiは安定して利用することができません。そしてIMoNiはDoCoMoさんと関係ない人間が作っているものです。皆さんと同じ立場で待つことしかできません。

生活の中でiモードメールをクリティカルに利用されている方にはご迷惑をおかけしますが、何卒ご容赦下さい。9月には正式対応されるとのことですので、IMoNiやiモード.netから離れてFOMAのようにメールを使えるようになるのもあと少しの辛抱ではないかと思います。

2010年05月19日

IMoNiが使えないとき

既にお伝えしているとおり、最近夜になるとIMoNiが使えなくなる理由は、iモード.netに接続できなくなっているためです。iモード.netにつながりにくくなる原因は、アクセス過多によるもののようです。
https://imode.net/cmn/info/100519_01.html

まだ解消されたわけではなさそうですので、今夜も含め今後もまた発生するかもしれません。アクセス増加がIMoNiによるものかどうかはまだ定かではありません。しかし、4/1時点でのIMoNiのアクティブ(アンインストールしていない)ユーザー数は、およそ2万人でした。それが昨日時点でおよそ10万7千人です。急激にIMoNiユーザーが増加したことにより、当初iモード.netが想定していなかったほどアクセスを増やしていることは間違いないと思います。

何らかの理由で、絶対にiモードメールが使えないと困る!という場合の対処法としては

・モバイル版iモード.netをブラウザから利用する
・SIMカードをFOMA端末に入れ替えて利用する

これくらいかと思います。
あと、無理だと思ったら定期チェックをオフにしてなるべくアクセスしないようにすることをお勧めします。しばらくは1次エネルギーのように限りある資源だと思って大切に使いましょう。宜しくお願いします。

2010年05月31日

IMoNi 1.6.4

【注】1.6.4には、送信したメールが送信箱に入らないという不具合がありました。申し訳ありませんが、1.6.4.1にアップデートして頂けないでしょうか。ご面倒をおかけしますがよろしくお願いいたします。

先日、iモード.netのシステムの安定稼働が宣言されました。
https://imode.net/cmn/info/100524_01.html

問題の切り分けのためにIMoNiのバージョンアップを控えていましたが、その必要が無くなりましたのでバージョンアップを行います。

IMoNi 1.6.4をマーケットへリリースしました。

IMoNiをお使いの方へ
・一度「よくある質問(FAQ)」をお読みになることをお勧めします。
・IMoNiをアップデートするとウィジェットの表示が崩れることがあります。お手数ですが、ウィジェットを削除して、再度置き直して下さい。

【主な変更点】

・Android 2.2(Froyo)対応
・ウィジェットの背景色を変更できるように(設定より切替)
・添付ファイルやデコメが下書き保存されるように
・mailto連携部分の改善
・全て既読にする機能の追加
・受信メールのリストでメールアイコンをタップし、複数のメールに対する削除・既読・選択解除ができるように
・htmlメール送信時に空行が削除される問題を修正
・動くはずのデコメ絵文字が動かない場合に、強引に動かすことを試みる処理を追加(メニューより「動けデコメ絵文字!」を選択)
・メール本文の画面をタップして、前後のメールへ移動できるように
・メール本文の画面をタップして、デコメ絵文字表示画面へ移動できるように(設定より切替)
・メール本文の画面に広告を表示
・その他、細かな修正・調整

 メール本文の画面に広告が出ることがあります。ご迷惑をおかけしますが何とぞご了承下さい。クリックして下さると嬉しいです。よろしくお願いいたします。

2010年06月26日

IMoNi 1.6.5

IMoNi 1.6.5をリリースしました。

【主な機能追加】
・QVGA端末の対応
・勝手見ホイホイ機能
・パスワードロック機能

 Xperia miniやHTC Tattooの方お待たせしました。これでおそらく使えるのではないかと思います。

【勝手見ホイホイ機能とは】
勝手見ホイホイ機能について説明します。

 勝手見ホイホイとは、「誰かが自分のIMoNiのメールをこっそり覗き見ているかもしれない・・・」を確認するための機能です。
 注意) この機能を使用することで、パートナーとの信頼関係を壊してしまう可能性があります。
 設定で「勝手見ホイホイフォルダ名」を設定すると、メールのフォルダリストの画面で設定したフォルダが現れます。フォルダ名には勝手にメールを見るかもしれない人が興味を持ちそうな名前をつけます。たとえば、パートナー以外の人の名前や「秘密」などの怪しげな名前です。設定が完了すると後は待つだけです。もし設定したフォルダを誰かが見ようとクリックすると、「まさか・・・ 人のメールを勝手に見るなんて・・・」というダイアログを表示して、相手に「信頼を裏切ってしまった」という精神的ダメージを与えます(中には逆切れする人もいるかもしれませんが)。フォルダを見ると、そのフォルダの「未読数」が+1されるので、あなたは誰かが勝手にメールを見ようとしたことを知ることができます(件数表示は87固定です)。勝手見フォルダを長押しして「フォルダ名変更」を選択すると、そのフォルダを開いた日時を確認することができます。そこで履歴を削除すると「未読数」は0に戻ります。

2010年06月29日

IMoNi 1.6.6

Thank you for waiting. IMoNi made available in English. Be my guest!

IMoNi 1.6.6をリリースしました。文字サイズでご迷惑をおかけした方申し訳ありませんでした。

【主な変更点】
・英語対応
・高解像度、低解像度端末での文字サイズなどの不具合修正
・その他細かな修正

2010年06月30日

IMoNi 1.6.6.1

IMoNi 1.6.6.1をリリースしました。本日使えないことで困ってらっしゃった方、大変お待たせしました。

【変更点】
・iモード.netのログインに時間を要するようになったため、タイムアウトまでの秒数を10秒から20秒に延長

2010年07月03日

2010年6月30日付近から急にメールの送受信が出来なくなった方へ

 IMoNiでは内部的な通信のタイムアウトを10秒に設定しており、10秒間応答がないときは中断していました。ところが、2010/06/30前後より、iモード.net のログイン時に10秒以上応答が返ってこないケースが出てきました。そのため、1.6.6までのIMoNiではiモードnetへログイン出来ずに送受信できないことがあります。2010年6月30日付近から急にメールの送受信が出来なくなった方は、このことが原因である可能性が高いです。

 1.6.6.1では、タイムアウトを20秒まで延ばしています。接続出来ずにお困りの方は、1.6.6.1以降にアップデートして下さい。御面倒をおかけしますがよろしくお願いします。

 なお、IMoNiは、iモード.netのPC版(https://imode.net/cmn/top/)に接続して、メールの送受信を実現しています。IMoNiと同じような機能をもつアプリケーションの中には、iモード.netのモバイルモード(https://imode.net/cmn/m/)に接続しているものがあるようです。IMoNiのメニューの「iモード.netへ移動」で表示されるサイトも、iモード.netのモバイルモードです。
 IMoNiがPC版に接続している理由は、デコメや添付ファイルを取り扱うためです。ログインに時間がかかるようになったのはPC版サイトの方であり、モバイルモードには特に変化は見られません。
 今のところIMoNiとPC版iモード.netは適切な共存関係にあると判断しています。しかし、IMoNiは、iモード.netのPC版サイトに少なくない負荷をかけているであろうことは想像に難くありません。おそらく、PC版サイトへのアクセスはモバイルモードへのアクセスを遥かに超えているでしょう。今後も本件のように、突然使えなくなることがあるかもしれません。もし本件を許容できない、あるいは今後のリスクを軽減したいと思われる方は、IMoNiの御利用をお控えになることもお考え下さい。モバイルモードは比較的流量が少ないと思われますので、モバイルモード(およびモバイルモードにアクセスするアプリケーション)を利用されることをお勧めします。

About Android

ブログ「GrandNature」のカテゴリ「Android」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

次のカテゴリはその他技術です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。