2009年7月アーカイブ

Donutでは、標準の設定(Settings)アプリに、
トグル(toggle)系の電源管理ウィジェット(Power Control Widget)が含まれていました。

 

このウィジェットでは、以下のとおり、5種類の設定を簡単に変更することができます。

  1. Wifi の On/Off 切り替え
  2. Bluetooth の On/Off 切り替え
  3. GPS の On/Off 切り替え
  4. バックグランドデータの同期(Sync)の On/Off 切り替え
  5. 画面の明るさ(Brightness)の 3段階切り替え

 

ごにょごにょっと入れてみると、以下のような感じでした。

donut_power_control.png

[Android] simple で BASIC

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

simple - Project Hosting on Google Code
http://code.google.com/p/simple/

 

ネタ元は、こちら。

  1. [N] 「Simple」Androidアプリを開発できるBASICのようなプログラミング言語
  2. akaiho St. » Androidアプリケーション用開発&実行環境 simpleを使ってみる・・・安生先生
  3. Flex、AIR、Java、Androidなど » Android用のアプリをBASICで書けるようになったようです

 

安生先生のブログを読むこと、5分後、BASICで書かれたテトリスが動作!

昨日も感じたのですが、Android ブロガーって素晴らしい。。。

tetris.png

※上記ブログでは、Mac 環境をベースに解説されていましたが、Win 環境でも適宜読み替えることで同じ手順でできます。

 

上手くいかなかった場合

  • 「JAVA_HOME」「ANDROID_HOME」「SIMPLE_HOME」の環境設定変数が正しいことを確認すること
    ※Win 環境の場合、コマンドラインから「set」コマンドを実行して確認できます
  • Java の bin フォルダ、Android SDK の tools フォルダ、simple フォルダにパスが通っていることを確認すること
    ※コマンドラインから「keytool」「adb」「simplec」コマンドを実行できるかどうかで確認できます

 

最後に、落としてきたソースコードをみて気づいたのですが、simple の BASIC は、VB/VBA ライクですね。

simple のプロジェクトホームでも下記のように書かれていました。

In the 90s, a big company from up north was extremely successful with a dialect of the programming language BASIC (acronym for Beginner's All-purpose Symbolic Instruction Code). 

・・・。

90年代ですか・・・。

てっきり、80年代の MSX の BASIC とか、PC98 の N88BASIC を期待したのですが。。。

行番号書いていた時代が懐かしい。

AppWidgets と省電力化について、下記リンク先に興味深いトライアル記事がありました。

「思ったより、省電力対応の作りにするのに時間かかっている件 - 闘争より逃走したい日記」
http://d.hatena.ne.jp/TAKAOMAYA/20090728/1248751971

※この記事は、複数のエントリに分割されているので、いったん RSS でフィードした方が読みやすいです
 ブラウザから読むには、リンク先内の左方向へのリンクの順に読むのが正解

 

本題に戻ると、同関連エントリの最後で、onReceive() から AppWidgetManger の取得方法が・・・という書き込みで終了していました。。。

関係ないかもしれないですが、Context から AppWidgetManager のインスタンスを取得する方法を以下に書いておきます。。。

public void onReceive(Context context, Intent intent) {
    ・・・省略・・・
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    ・・・省略・・・
}

 

ところで、その後のエントリで、Widget はリリースされていましたで、さっそくインストールしてみました。

Minutes Widget for Android (初音ミクVer) 、1.0.2 リリースしました。 - 闘争より逃走したい日記
http://d.hatena.ne.jp/TAKAOMAYA/20090728/1248785866

 

ダウンロードは、Android Market から、「Minutes」で検索して辿り着きました。

MinutesWidgetForAndroid.png

 

省電力化の際、「Spare Parts」や「Battery Graph」(どちらも Android Market からDL化)で得られる情報も役に立つので、
今後に期待したいですね。

省電力化については、いづれまとめる予定(のつもり)。

android.graphics パッケージ Bitmap クラスの static メソッドである createBitmap() を使用すると、動的に Bitmap を作成することができます。

Bitmap を編集する場合、getPixels() / setPixels() を呼び出すことで、ピクセル操作することができるのですが、この方法だと、直線や円など、複雑な描画をするのは、少々面倒です。

そういった場合、BItmap と Canvas クラスをあわせて使用すると、Canvas クラスの高度な描画メソッドが利用できるため、複雑な描画を簡単にすることができます。

具体的には、描画したい Bitmap を Canvas クラスのコンストラクタに渡し、Canvas クラスの描画メソッドを呼び出すだけです。

サンプルソースコードは、以下のとおりです。

 

サンプルソースコード

Bitmap bitmap = Bitmap.createBitmap(72, 72, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);

// ここから、Canvas に対して、直線、円、矩形、塗りつぶし、回転・・・などの呼び出しをすると、
// 描画結果は、Bitmap に反映される
// 以下は、パスを描画する例
Paint paint = new Paint();

paint.setAntiAlias(true);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.FILL);

Path path = new Path();

path.moveTo();
path.lineTo();
// ...
path.close();

canvas.drawPath(path, paint);

 

あわせて読みたい

ADP1 のイメージを、Android 1.5 SDK, Release 3 に対応するバージョンに更新してみました。

※ADP1(HTC Dream)の話であり、HT-03A(HTC Magic)の話ではないので、ご注意ください

adp1_1.5r3.png

今回の更新により、Kernel version が 2.6.27-00393、Build number が 1.5 CRC1 150275 へ更新されました。

※更新前(Android 1.5 SDK, Release 1)は、Kernel version が  2.6.27-00392、Build number が 1.5 CRB21 147201

 

以下、更新手順です。

前提条件として、既に Android 1.5 SDK, Release 1 当時のイメージに書き換えてある前提で書いておりますので、そうでない方は、まずは、「[Android] 続Android Dev Phone システムイメージ書き換え(Android1.5編) - adakoda」の前半(Update the Device Radio Firmware)の記事も参考にしてください。

前提条件を満たしている場合、Android 1.5 SDK, Release 1 から Release 3 への更新で、Radio Firmware に変更はありませんので、下記の Recovery Image の更新だけ実行していただければよいです。

また、手順については、これまでに紹介してきた手順と同じですので、以前の記事の signed-dream_devphone_userdebug-ota-xxxxxx.zip の xxxxxx を、最新のバージョンに読み換えてもらってもOKです。

 

Android1.5r1からr3への更新手順

事前準備

http://www.htc.com/www/support/android/adp.html
から、バージョン毎の Recovery Image をダウンロードする。

※ここでは、signed-dream_devphone_userdebug-ota-150275.zip のみ使用

 

Copy the Recovery Image Package to the Device

  1. デバイスにSDカードが挿入されていることを確認する
  2. デバイスを通常どおり起動する
  3. デバイスとPCをUSBで接続する
  4. コマンドラインから「adb devices」を実行し、デバイスと接続できていることを確認する
    ※「List of devices attached」の出力に続けて、デバイスのシリアル番号が表示されればOK
  5. コマンドラインから「adb push signed-dream_devphone_userdebug-ota-150275.zip /sdcard/update.zip」を実行し、
    1~2分待った後、「adb shell sync」を実行する。
    ※ota~zipは、必要なバージョンに応じて適宜読み替えてください、ここでの例は、Android1.5に書き換える場合の例
    ※しばらく待つのは、コピーしたバイト数が表示されていても、バックグランドでコピーが実行されていて、完了していない場合があるため
  6. (家のマークの)HOMEキーを押したままリブートし、いつものDroid君のあとに、
    (びっくりマーク)!アイコンが表示されるまで(押したまま)待つ
    ※リブートは、「adb shell」「su」「reboot」、もしくは、電源長押し後、電源を切って、入れ直す
  7. キーボードを出して、ALT + l キーを押し、Android system recovery utilityを起動させる
    ※ここでの l キーは、エルキーです、アイキーでも、数字の1キーでもないです
  8. ALT + s キーを押し、(先の5でコピーしておいた)update.zipの書き込みを実行させる
  9. 「Install from sdcard complete」が表示されたら、
    (家のマークの)HOMEキー + (戻るマークの)BACKキーを押し、
    radio imageの書き込みを実行させると、矢印のイメージのあとに、自動的に再起動され、
    さらに、別のイメージ(ROMに矢印)が表示された後、通常どおり起動されます

日本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」で接続を確認する

 

参考となる情報

123

2016年8月

  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 31