ADT R20で新規Android Application Projectを作成できない

ADTを20にアップデートしました。

新規でアプリケーションプロジェクトを作成しようとしたところ、
下記のダイアログから進めなくなりました。

"You can install or upgrade it by clicking the Install button below, or alternatively, you can install it outside of Eclipse with the SDK Manager, then click on "Check Again" to proceed."
と表示されていますが、サポートライブラリをインストールしても、Finishを選択できません。


調べてみるとIssueにあがっていました。


対処方法は下記
1、サポートライブラリをアンインストール
2、新規アプリケーションパッケージの作成を選択
3、進めなくなったダイアログからサポートパッケージをインストール。

ここに書いてありました。
http://code.google.com/p/android/issues/detail?id=33859

以上です。

Android4.1の外部ストレージパスについて

ICSからJBへの差分を確認していると、外部ストレージのパスが変更されていることに気がつきました。

確認バージョン

Android 4.1

外部ストレージのFileオブジェクトは下記のクラスを使用して取得します。

android\os\Environment.java
パッケージ名:android.os
クラス名:Environment
メソッド名:getExternalStorageDirectory()

上記のメソッドで取得するPathがICSまでは「/mnt/sdcard」ですが、JBからは「/storage/sdcard0」となっていました。

SDカードをマウントするパスが変わっているようです。

ただ、4.1のエミュレータで確認したところ、Environment#getExternalStorageDirectory()にて「/mnt/sdcard」が取得できました。

Galaxy NexusのJB版 実機では「/storage/sdcard0」が取れるとのことです。


Environmentクラスを使用せずに「/mnt/sdcard」をハードコーディングするのは避けるべきです。

AndroidのFramework調査 第4回 InputManager

 アプリ開発者にはなじみ深いキーやタッチイベントですが、いったいどこから飛んでくるのでしょうか。
今回はキーイベントや、タッチイベントをフレームワーク側で取得するまでの部分を記載します。

確認バージョン

Android 2.3.5

イベントの取得に関することは、InputManagerにて行われています。
Key、Touch、Trackball、Switch(スライドキーボードのオープン・クローズ)など、さまざまなデバイス
イベントを取得し、正しい配信先に配信するのが仕事です。

InputManagerの実体はNative層に存在し、InputReaderThreadとInputDispatcherThreadの二つのThreadを持っています。
それぞれ、イベントの読み込み、イベントの配信を行うThreadです。

記載するのはInputReaderThread側の処理です。

クラス図

Androidのビルド環境について

ソースコード中に日本語のコメントを挿入しても警告が出なくする方法を紹介する。

ANDROID_ROOT/build/core/definitions.mk

上記ファイルにソースの文字コードの指定がされている。
asciiという文字列が2回ほど出てきているので、それをutf-8に書き換えれば、日本語コメントで警告がでることはなくなる。
# UTF-8以外の文字コードのソースがあれば、それは警告がでる。

AndroidのFramework調査 第3回 ConnectivityManager

Wi-Fi接続が完了したかどうかなどの通知をBroadcast Intentにて通知する。
また、Wi-Fiに接続した状態から、3Gへ再接続させることができる。
繋ぎ替えAPIは標準のMMSアプリから使用されている。

確認バージョン

Android 2.3.4r1

ConnectivityManagerの役割

ネットワークの接続状態を知るために使用するクラス。
また、ネットワークの接続状態が変更された時、アプリケーションに通知を行う。
ContextクラスのgetSystemService(Context.CONNECTIVITY_SERVICE)をコールすることで、このクラスのインスタンスを取得できる。

このクラスの主な役割は以下の通り

  1. ネットワーク接続の監視(Wi-Fi,GPRS,UMTSなど)
  2. ネットワーク接続変更時、ブロードキャストIntentを配信
  3. ネットワーク接続が失われたとき、他のネットワークへのフェイルオーバーの実施。
  4. アプリケーションが利用可能なネットワークの粗粒または細粒度の状態を照会するためのAPIを提供する。

使用方法

ネットワークの接続状態が変更されたときの通知受信方法について記載する。

Android標準アプリでは、DownloadProviderが使用している。

  1. ブロードキャストIntent「android.net.conn.CONNECTIVITY_CHANGE」を受信するBroadcastReceiverを用意。
  2. ブロードキャストの受信時に、intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)にてNetworkInfoを取得。
  3. NetworkInfo#getType()もしくは、getTypeName()にて、MOBILE、WIFIのどちらかを判定。
  4. NetworkInfo#isConnected()にて接続状態を確かめる。
AndroidManifest.xml
        <receiver android:name=".ConnectivityActionReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
ConnectivityActionReceiver.java
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) {
            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            if (info != null) {
                String type = info.getTypeName();
                boolean isConnected = info.isConnected();
                Log.e(TAG, String.format("NetworkType = %s, isConnected = %b", type, isConnected));
            }
        }
    }

クラス図

startUsingNetworkFeature()とかの使い方も記載するかも。

次回はキーイベントやタッチイベント周り、EventHubやInputDispatcherからPhoneWindowManagerあたりを予定

AndroidのFramework調査 第2回 DownloadManager

Gingerbreadから追加されたもので使ったことがなかったので調査。
FroYo以前から存在したDownloadProviderへのインターフェースとして追加された。

使用するには、「android.permission.INTERNET」の権限が必要である。

確認バージョン

Android 2.3.4 r1

DownloadProviderの役割

ダウンロードマネージャは、長時間実行されているHTTPダウンロードを処理するシステムサービスである。
クライアントは、特定の宛先URIのファイルをダウンロードするよう要求できる。

ダウンロード マネージャーは HTTP の相互作用を処理し、障害後または接続の変更、システムの再起動時のダウンロードを再試行、バック グラウンドでのダウンロードを行う。
このクラスのインスタンスはgetSystemService(Context.DOWNLOAD_SERVICE)をコールすることで取得できる。
このクラスのAPIを使用してダウンロード要求を行うアプリケーションは、通知エリアやダウンロードUIをユーザーがクリックしたことを知るために「ACTION_NOTIFICATION_CLICKED」を受信するブロードキャストレシーバーを登録する必要がある。

使い方

執筆中

クラス図

DownloadProviderについては追々

AndroidのFramework調査 第1回 TelephonyManager

何かで使うかもしれないので調査してみる。
SIMの固有情報や、IMEIなどの端末の固有番号を取得するためのクラス。
また、電界強度や回線の接続状況もモニターできる。

確認バージョン

Android 2.3.4 r1

TelephonyManagerの役割

バイス上のテレフォニーサービスに関する情報へのアクセスを提供します。
アプリケーションは、このクラスのメソッドを使用し、テレフォニーサービスの状態のほか、いくつかの加入者情報にアクセスすることができる。
また、アプリケーションでは、電話の状態変化の通知を受け取るためのリスナーを登録できる。

このクラスを直接インスタンス化するのではなく、Context.getSystemService(Context.TELEPHONY_SERVICE)を通じてインスタンスへの参照を取得する。

いくつかのテレフォニー情報へアクセスするには適切なPermissionが必要である。
AndroidManifestファイルに適切なPermissionを持っていない限り、アプリケーションは保護された情報にアクセスできない。

使い方

TelephonyManagerのほとんどのAPIはコールして戻り値を取得するものである。
ただし、電界強度や3G回線の接続状況などをコールバックで受け取るlistenメソッドのみ使用方法が少し特殊である。

  1. PhoneStateListenerの継承クラスを作成し、コールバックメソッドをオーバーライドする。
  2. 第一引数にPhoneStateListenerのインスタンス、第二引数にコールバックを受けたい情報のフラグをセットし、listenメソッドをコールする。
  3. 使い終わったら、登録解除したいPhoneStateListenerのインスタンスと第二引数にPhoneStateListener.LISTEN_NONEをセットしlistenメソッドをコールすることでリスナーのアンレジストが出来る。

各メソッドのパーミッションや、受信できるEventの種別など詳しい情報はDeveloperサイト

クラス図

SIMやらRUIM関連は追々追記します。