Androidの最近のブログ記事

日本Androidの会の嶋先生が講演された「Androidの最新技術動向と可能性」の記事が、マイコミジャーナルさんに掲載されていました。

【レポート】WIRELESS JAPAN 2009 - 日本Androidの会幹事の嶋氏が語るAndroidの最新技術動向 | 携帯 | マイコミジャーナル

以前から注目していた講演ですが、参加できず悶々としていたのですが、マイコミジャーナルさんのスライド写真付きの丁寧な解説により、貴重な情報を得ることができました。ありがとうございます!

講演の内容についても、ここ数ヵ月の最新動向を上手くまとめておられて、あらためて上手いなーと思いました。お疲れ様でした。

個人的には、Android の動向は、「Android ニュースリンク集」に残しているのですが、このようにまとまった解説があると嬉しいですね。

特に、解説記事内の5番目のスライドキャプチャ-にある「Android 端末の登場 - CPU情報」みたいに横並びでまとめてある情報は、わかりやすいし、嬉しいです。

今後も、Android 端末のハードウェア最新情報一覧を、どなたかが まとめてくれたら嬉しいな~(祈)。

 「android情報まとめ @ ウィキ」や「アンドロイド情報提供サイト Recently Android」などが有力かな?

[Android] RemoteViews が倒せない App Widgets の限界に挑戦(前編) - adakoda」の続編。

App Widgets として動作するコンパスアプリの話の続き。

このコンパスアプリは、App Widgets として実装しているため、
アプリを明示的に起動しなくても、ホームスクリーン上で、リアルタイムにコンパスの針がグリグリ動きます。

※App Widgets の更新間隔は1 秒間に設定 

では、どうやって、App Widgets でイメージを更新しているかというと、エントリタイトルのとおり、RemoteViews クラスを使用しています。

具体的なソースコードは、以下のとおり。

@Override
public void onUpdate(
    Context context,
    AppWidgetManager appWidgetManager,
    int[] appWidgetIds) {
    ... 省略 ...
    RemoteViews remoteViews = new RemoteViews(
            context.getPackageName(),
            R.layout.appwidget);
    remoteViews.setImageViewBitmap(id.compass, bitmap);
    for (int i = 0; i < appWidgetIds.length; i++) {
        appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
    }
    ... 省略 ...
}

簡単に解説しておくと、App Widgets のリソースにアクセスするには、RemoteViews インスタンスを作成する必要があります。

ここでは、App Widgets 内のリソースに、compass という名前の ImageView を配置しており、
同ビットマップを更新するために、setImageViewBitmap() を呼び出しています。

ポイントは、AppWidgetProvider.onUpdate() で渡された AppWidgetManager を使用し、updateAppWidget() 呼び出している箇所で、
これを実行しないと、いくら RemoteViews インスタンスを操作しても、更新されない点です。

また、ここで渡している Bitmap は、コンパスの針のイメージを 360枚用意しているかというと、そうではなくて、
実行時にソースコードベースで、動的に Bitmap を作成してしています。

※このあたりも長くなってしまうので、別のエントリで紹介する予定です

 

# 余談ですが、このコンパスアプリをホームスクリーンに16個登録して放置しておいたら、15時間ほどで電池が切れました
# HT-03Aの電池の充電は、PCからUSB経由で充電して、1時間に18%回復(約5時間ちょいで100%)という感じでした

少し前に、コンパスの記事を書いていたのですが、

その際に、「コンパスを App Widgets で作ったらどうなるんだろう?」

という疑問が発生したので、作ってみました。

 

サクサクっと作って、実行させてみると、以下の実行結果。。。

AppWidgetsCompass1.png

「ジェットを表示できま」

???

 

おそらく、「ウィジェットを表示できません」といいたいのだろうが、、表示領域が1セル区画しかないので、エラーメッセージが文字切れしたらしい。。。

やったことは、後々、コンパスの部品を再利用できるように、コンパスをソースコードベースで作成し、
xml ファイルから、同部品を参照させたのですが、受け付けてくれないみたい。

部品自体は、単体で正しく動作することを検証済みだったので、かなり悩んだのですが、ヘルプを読んでみると、以下のような記述が・・・。

Creating the App Widget layout is simple if you're familiar with Declaring Layout in XML.
However, you must be aware that App Widget layouts are based on RemoteViews,
which do not support every kind of layout or view widget.

A RemoteViews object (and, consequently, an App Widget) can support the following layout classes:

    * FrameLayout
    * LinearLayout
    * RelativeLayout

And the following widget classes:

    * AnalogClock
    * Button
    * Chronometer
    * ImageButton
    * ImageView
    * ProgressBar
    * TextView

Descendants of these classes are not supported.

・・・。

残念ながら、今回真面目に作ったようなカスタムウィジットは配置できないらしいorz...

試しに AnalogClock を配置してみると、こんな感じ(↓)で簡単に入るし、

AppWidgetsCompass2.png

Chronometer でも、やっぱり、こんな感じ(↓)で簡単に入る。。。

AppWidgetsCompass3.png

※ちなみに、これらのオブジェクトにアクセスする場合には、RemoteViews クラスで簡単にアクセスできる

 

RemoteViews クラスのメソッド一覧をみてみると、setChronometer() や setProgressBar() というのがあって、ちょうど、AppWidgets がサポートしているクラスと一致するので、どうやら、それらの組み合わせで作るのが正解のようです。。。

なんとかならないのかーーーと、apply() ってのでサポート外のものを渡してみるも、結果は、「ジェットを表示できま」。。。

 

今回やりたいことは、「Compass の針を動的に Path で描画する」なのですが、RemoteViews の行く手に阻まれ、さっぱり上手くいかず・・・。

で、

徹夜で5時間粘った結果、以下のように成功しました!

AppWidgetsCompass4.png

 

ホームスクリーン上で、ぐりぐり動く様は、結構気持ちいいです。

ちなみに、16個登録すると、以下のような感じ。

AppWidgetsCompass5.png

 

今日のところは、時間切れなので、ここまでなのですが、色々とソースコード的なネタを収集できたので、次回報告します。

※これから出社(眠)。。。

日本で Android Market が使えるようになったら公開しよう!

と、仕込んでおいた(半年前に作成した)アプリが「英語環境(ADP1)では動作するが、日本語環境(HT-03A)では動作せず」。。。

調べてみると、以下のソースコードが問題でした。

 

問題のソースコード

// ここまでに String 型の inDate 変数に
// "Wed, 22 Jul 2009 00:00:00 +0900" という文字列がセットされている前提
// 問題のソースコード↓
SimpleDateFormat inFormat = new
    SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
Date date = inFormat.parse(inDate);
// 問題のソースコード↑
// 英語環境では、date に正しく値が返されていたが、
// 日本語環境では、date に null が返されていた \></omg!

何が問題なんでしょうか???

これだけでは、伝わらないと思いますので、もう少しやりたいことを補足すると、

"Wed, 22 Jul 2009 00:00:00 +0900" という(英語ロケールでの書式)文字列から Date 型のインスタンスを得るために、
SimpleDateFormat クラスの parse() メソッドを呼び出しているのですが、
これが、英語環境では成功していたのに、日本語環境では失敗してしまうのです・・・。

 

修正後のソースコード

日本語環境(というより、厳密に言えば、英語環境以外)でも正しく動作するように修正したコードは、以下のようになります。

// 修正後のソースコード
SimpleDateFormat inFormat = new
    SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz",
        Locale.ENGLISH); // ←を追加(これだけ)
Date date = inFormat.parse(inDate);

修正したのは、SimpleDateFormat クラスのコンストラクタの第2引数に、明示的に英語ロケールを指定してあげただけです。

というのは、そもそも第1引数の書式が英語ロケールを期待しているからです。

SimpleDateFormat クラスは、明示的にロケールを指定されない限り、デフォルトロケールで動作するのが仕様のため、
問題のコードでは、明示的にロケールを指定していなかったため、
英語環境では、英語ロケールのため、問題なし(=第1引数の書式を正く解析できる)。
日本語環境では、日本語ロケールとなり、問題あり(=第1引数の書式を正く解析できない)となっていました。

 

少々、ニッチな話になってしまいましたが、伝えたいことは、

「少なくとも、英語と日本語ロケールでテストせよ!」

ということです。

 

幸いにも、HT-03A では、英語と日本語ロケールを積んでいるので、両方のテストが可能ですし、
Android SDK 1.5 のエミュレーターも同様です。

いまのところ、ADP1 だと、Android 1.5 にアップデートしても、英語ロケールしかないので、ADP1 だけでテストしている方は、
上記のように日本語ロケールを積んでいる環境でテストした方がよいかもしれません。

 

最後に一言・・・ 

「認めたくないものだな、自分自身の若さゆえの過ちというものを」

実は、このエントリ、↑の名言を言いたいだけです ^^;

Android 1.5 SDK, Release 3 がリリースされ、OS X と Linux では「android update adb」というコマンドが追加されました。

The android tool provides a new command that scans SDK add-ons for their USB Vendor IDs and makes them available to adb (OS X and Linux versions of the SDK only). The command is android update adb. On Windows versions of the SDK, a custom USB driver is included that supports the "Google" and "HTC" Vendor IDs, which allow adb to recognize G1 and HTC Magic devices. For other devices, contact the device manufacturer to obtain a USB driver, especially if you have an SDK add-on that defines a new USB Vendor ID.

 

先日の書き込みでは、Linux 上で同コマンドを試していたのですが、クリーン環境でなかったため、
「/etc/udev/rules.d/51-android.rules」の設定が必要かどうかまで確認できていませんでしたので、
今回、あらためてクリーン環境でも試してみました。

 

結論

  • Android 1.5 SDK, Release 3 でも「/etc/udev/rules.d/51-android.rules」の設定は、これまでどおり必要
  • ADP1、HT-03A ともに「android update adb」を実行しなくても認識される

 

ということで、「android update adb」は、"Google"、"HTC"以外のベンダー用なのかな?・・・(まだ自信なし)。。。

同コマンドを実行してみると、~/.android 以下に adb_usb.ini ファイルが作成されましたが、中身はコメントを除き、空っぽでした。

adb_usb.ini.png

 

クリーンなUbuntu8.04環境にAndroidSDK1.5r3をインストールしてHT-03Aを接続するまでの手順

  1. Ubuntu 8.04インストール
  2. ログインユーザーを su できるようにする
  3. ネットワークを設定する
  4. Java (JDK5) をインストールする
    Androidのソースコードをダウンロードしたり、ビルドすることを考えると、JDK6でなくJDK5の方がよいです
  5. Android SDK 1.5 r3 をインストールする(= ダウンロード後、展開し、tools 下へパスを通す)
  6. HT-03A (Androidデバイス)側の設定をする(「設定」>「アプリケーション」>「 開発」>「USBデバッグ」)
  7. 「/etc/udev/rules.d/51-android.rules」を作成&編集
  8. HT-03A と PC(Ubuntu)を標準のHT-03A付属のUSBケーブルで接続し、「adb devices」で接続を確認する

 

参考となる情報

  • プログラマの実態: Ubuntu で HT-03A を認識させる
    http://dotred5.blogspot.com/2009/07/ubuntu-ht-03a.html
  • Linux環境でのHT-03A + EclipseのUSB接続 - 日本Androidの会 | Google グループ
    http://groups.google.co.jp/group/android-group-japan/browse_thread/thread/93f5e7ca26aa6f71?pli=1

2009年6月9日に開催された「Google Developer Day 2009」のAndroid関連動画です。

※全動画は、「http://www.youtube.com/view_play_list?p=D9BEC0DBDB742F54」から参照できます

 

  • 【MB-1】Android のデータ共有(安生先生)
  •  

  • 【MB-2】Android でリアルタイムゲームの開発方法(クリス プルエット先生)
  •  

  • 【MB-3】Android 高度方法指(ジェイソン チェン先生)
  •  

    ※おまけ:GDDのオープニング

    [Android] Android 1.5 SDK, Release 3

    | トラックバック(1) |

    「Android 1.5 SDK, Release 3」がリリースされました。

     

    以下のサイト(ページ)が参考になります(有り難うございます)。

    ※[ ] 内の時刻は、リリース当日(2009/07/17)にポストされた時刻

     

    また、参考までにAndroid 1.5 SDK r2 と r3 のファイルの差分を(Windowsベースで)比較してみると、
    差分の大部分はバイナリファイル(exe, img, jar)であり、
    テキストファイル(inf, ini, java, txt)の変更は、ごくわずかということがわかりました。

    ※ただし、ファイルの末端の改行の差違のみのファイルと docs フォルダは除く

     → ここから

    add-ons

    • google_apis-3\manifest.ini ・・・ version=2 → revision=3
    • google_apis-3\images\NOTICE.txt, ramdisk.img, system.img, userdata.img
    • google_apis-3\libs\maps.jar

     

    platforms

    • platforms\android-1.1\tools\aapt.exe, aidl.exe, dexdump.exe
    • platforms\android-1.1\tools\lib\dx.jar
    • platforms\android-1.5\android.jar, build.prop
    • platforms\android-1.5\data\layoutlib.jar, widgets.txt
    • platforms\android-1.5\data\res\values-*-pt ・・・ 追加
    • platforms\android-1.5\images\NOTICE.txt, ramdisk.img, system.img, userdata.img
    • platforms\android-1.5\samples\Home\src\com\example\android\home\ApplicationsStackLayout.java, Home.java
    • platforms\android-1.5\tools\aapt.exe, aidl.exe, dexdump.exe
    • platforms\android-1.5\tools\lib\dx.jar

     

    tools

    • platforms\android-1.5\tools\acp.exe, adb.exe, dmtracedump.exe, emulator.exe, fastboot.exe, hprof-conv.exe, mksdcard.exe, NOTICE.txt, sqlite3.exe
    • platforms\android-1.5\tools\lib\androidprefs.jar, anttasks.jar, apkbuilder.jar, ddmlib.jar, ddms.jar, ddmuilib.jar, draw9patch.jar, hierarchyviewer.jar, jarutils.jar, sdklib.jar, sdkmanager.jar, sdkstats.jar, traceview.jar

     

    usb_driver

    • amd64\android_usb.inf 
    • x86\android_usb.inf

    ← ここまで

     

    最後に、Android 1.5 SDK r3 から(MaxOSX/Linux向けに)用意された「android update adb」を Linux で試してみました。

    android_update_adb.png

    キャプチャが小さいですが赤枠のとおり「android update adb」「android kill-server」「android start-server」「adb devices」を実行しています。

    試した環境は、既に ADP1 を接続したことがある環境で、/etc/udev/rules.d 下を編集済でしたが、クリーン環境でどうなるかは未確認です^^;

    また、Androidデバイス(ここでは、HT-03A)側の「設定」アプリケーションで、以下の設定も必要です。
    → 「設定」 > 「アプリケーション」 > 「開発」 > 「USBデバッグ」 を 「ON」にする。

     

    2009/7/20追記:
    当方の環境では、/etc/udev/rules.d下の編集は必要であり、また、ADP1やHT-03Aに関しては、「android update adb」も不要でした
    詳細は、「[Android] クリーンなUbuntu8.04環境にAndroidSDK1.5r3をインストールしてHT-03Aを接続するまで - adakoda」に書き込みました。

     

    [Android] Android で Google Analytics - adakoda」の書き込みのとおり、
    Google Analytics では、Android 1.5 標準のブラウザからのアクセスは、Safari / Android と認識されるのですが、
    プログラム的にもユーザーエージェントを調べてみました。

     

    UserAgentを取得するには、
    android.webkit パッケージ - WebSettings クラスを使用することで、UserAgent を取得することができます。
    具体的なサンプルソースコードは、以下のとおりです。

    WebView webView = new WebView(this);
    WebSettings webSettings = webView.getSettings();
    String userAgentString = "";
    userAgentString = webSettings.getUserAgentString();
    Log.v("UserAgent", userAgentString);
    

    上記のコードを実行すると、UserAgent は、

    Mozilla/5.0 (Linux; U; Android 1.5; ja-jp; HT-03A Build/CDB72) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1

    のような結果でした。

    haru-komugi先生(http://d.hatena.ne.jp/haru-komugi/20090713/1247483849)のとこでも書かれています。

     

    で、ここからが面白い。。。

    Android 1.5 から非推奨APIとなった setUserAgent() を使用すると、定義済みの UserAgent に変更できます。

    例えば、setUserAgent(1) とすると・・・ 

    // 1 if the WebView should use a desktop user-agent string
    webSettings.setUserAgent(1);
    userAgentString = webSettings.getUserAgentString();
    Log.v("UserAgent(1)", userAgentString);
    

    結果は、

    Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1

    のように Macintosh に早変わり。。。

     

    続けて、setUserAgent(2) とすると・・・

    // 2 if the WebView should use an iPhone user-agent string
    webSettings.setUserAgent(2);
    userAgentString = webSettings.getUserAgentString();
    Log.v("UserAgent(2)", userAgentString);
    

    結果は、

    Mozilla/5.0 (iPhone; U; CPU iPhone 2_1 like Mac OS X; en) AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile/5F136 Safari/525.20.1

    のように、今度は iPhone に早変わり。。。

     

    ちなみに、Android 1.5 からは、同クラスに setUserAgentString() が追加されていましたので、
    以下のように任意の UserAgent を設定することもできます。

    webSettings.setUserAgentString("hogehoge");
    userAgentString = webSettings.getUserAgentString();
    Log.v("UserAgent(hogehoge)", userAgentString);
    

    Android とタグを打っておきながら申し訳ないですが、Biz・ホーダイ ダブルの話です。

    HT-03A 購入時、Biz・ホーダイ ダブルの契約をしたのですが、発売当日ということもあって、店員の方も慣れない対応だったようで、諸々の手続きに2時間かかって手続きを終えましたorz...

    また、その後も、お店の方から連絡があり、必要な手続きが不足していたとか、そもそもプランを間違えていたとか・・・ということで、何日か後にDSにお邪魔して、ようやく手続きを完了しました。

    今回、パケット定額のサービスを契約していたのですが、これも間違っていたら・・・と不安になり、契約の確認方法を教えていただいたところ、以下のページから確認できることを教えていただきました。

    →「My docomo ホームページ」

    このMy docomoのページにアクセスするにはは、docomo IDが必要とのことでしたが、

    「IDとパスワードを覚えていません。。。」

    という話をすると、親切にも、即日IDを再発行、パスワードリセットしていただき、無事、同ページへアクセスすることができました。

    同ページにアクセスすると、翌日の請求予定金額やポイント情報などを確認することができ、気になっていた契約内容を見ると、ちゃんと「MoperaUライト」+「Biz・ホーダイ ダブル定額」になっておりました。

     

    ちなみに6日間(7/10~7/15)のパケットを確認すると、以下の結果に。。。

    my_docomo_packet.png

    カンマがないので、瞬間的に判断できなかったのですが、33万パケットということでした(思ったより少ない?)。

    ※表示は、~7/31となっていますが、この記事を書いている7/16の前日までの記録です

     

    実は、ここのところ忙しくて、HT-03A にあまり触れておらず、インターネットはもちろんのこと、Android Marketなど、ほとんど利用していなかったので、上記のパケット数となったようです。

    では、仮にBiz・ホーダイ ダブルに申し込んでいなかった場合、どうなっていたかというと、

    71,250[パケット] x 0.08[円/パケット] + 266,982[パケット] x 0.02[円/パケット] = 11,039[円](税抜き)

    くらいになっていたと思われます。。。

    ということで、次月の請求額が、ちゃんと定額になっていたので、今後も安心して使用できそうです。

    (既に上限超えているので、気兼ねなくつかうぞー。)

    ちなみに料金の参考にしたページは、以下のページです。

    →「Biz・ホーダイ ダブル : Biz・ホーダイ ダブルとは | 料金・割引 | NTTドコモ」

    HT-03Aから普段使用しているGoogle Analyticsへアクセスしてみました。

    結果としては、数値と一部の(JavaScriptで描画されている?)グラフは見れましたが、Flashで描画されているグラフは(当然ですが)見れませんでした。。。
    ※もしかして、モバイル用のURLとかあるんでしょうか?

     

    ちなみに、当サイトの最近1ヵ月のブラウザとOSのアクセスは、以下のとおりです(数値は削っています)。

    GoogleAnalytics.png

    表の1列目が「ブラウザおよびOS」列ですが、残念ながら文字切れしています。。。

    わかりにくいですが、9行目(番目)の0.34%というのが、「Safari / Android」で、Android端末からのアクセスです。

    iPhoneは、「Safari or Mozilla Compatible Agent / iPhone or iPod」の組み合わせでわかれて集計されていますが、数値的には、Androidと同じくらいです。

     

    と、話がそれましたが、Google携帯はシングルサインオンで、様々なGoogleサービスが、どこにいても使えるので、大変便利です(特にPCとの連携)。

    まだアクセスしにくいサービスもありますが、外部APIも公開されているサービスも多いので、Androidアプリとして作成してみても面白そうです。

    当方では、AIRでFlickr、Picasa、YouTube、その他もろもろのREST系アプリを実装したことがあるのですが、RESTプログラミングは面白いので、お勧めです。

    <<前のページへ 1718192021222324252627

    Android 楽しいよ!

    2010年11月

      1 2 3 4 5 6
    7 8 9 10 11 12 13
    14 15 16 17 18 19 20
    21 22 23 24 25 26 27
    28 29 30        

    自作フリーソフトウェア