2010年5月31日月曜日

AIR on Android apk の作り方

Adobe AIR on Android 事始め ~ その1 ~

*注:
 ここでは、すでにPCに Android SDK が入っていて、
 adb コマンドが使えるようになっていることを前提としています
 = Android は初心者じゃないけど、Flash/AIR は初心者の人を想定してます


1. AIR を作れる環境を作る

 方法はいくつかあって、
  * Flash CS5 / Flash CS4 を入れる
  (AIRが作れるやつ、CS3はアップデートすればできるみたい )

  * Flash Builder 4 / Flex Builder 3 を入れる
  (これも AIR が作れるやつならOK)

  * Flex SDK を落としてきて、コンソールから AIR アプリをビルドする
  (これなら無料よ)

  * Flash Develop を入れる
  (無料のツール。オープンソース。Windows のみ)
  (直接は AIR は作れない。FlashDevelop が生成したバッチファイルから
   AIR が作れるらしい)

 こんな感じ

2. AIR アプリを作る

 各ソフトウェアで AIR アプリを作る方法は、いろんなサイトや書籍があるので、
 ここでは触れません。ActionScript 3.0 & AIR で出力できれば OK です

 注意!!!:現状では mxml ベースの AIR アプリは対応してません。
 mxml のコンポーネントに対応すると runtime が重くなっちゃうから
 みたいです。でも、mxml のコンポーネントのうち、デバイスに特化
 したものだけ対応するなど今後まだまだ変わっていくそうです。
 だってまだベータ版だしね。


 ただし、デスクトップ用の AIR アプリならできるけど、現状では
 AIR on Android で対応していない機能があります

 対応していない機能については、また別のエントリーで書きます。

3 AIR 2.5 SDK を入れる

  ここから、プレリリースプログラムに参加すると、
  Adobe® AIR® - Android Developer Prerelease
  SDK を落とすことができます。
  適当なディレクトリに展開して、パスを通せばOKです。

4. AIR アプリから .apk を作る

 4.1 AIR の設定ファイルを編集する

  Flash CS5 や Flash Builder CS5 で AIR を作成すると、
  ***-app.xml という設定ファイルが生成されます。
  これを apk を作る用に変更します。

  最終的にはこんな感じ


<?xml version ="1.0" encoding="utf-8" ?>
<application xmlns="http://ns.adobe.com/air/application/2.5">
<id>myairapp.example.helloworld</id>
<version>1.0</version>
<filename>HelloWorld</filename>
<description>My First HelloWorld</description>
<name>HelloWorld</name>
<supportedProfiles>mobileDevice</supportedProfiles>
<copyright></copyright>
<initialWindow>
<content>HelloWorld.swf</content>
<systemChrome>standard</systemChrome>
<transparent>false</transparent>
<visible>true</visible>
<fullScreen>true</fullScreen>
<autoOrients>false</autoOrients>
<aspectRatio>portrait</aspectRatio>
<renderMode>auto</renderMode>
</initialWindow>
<customUpdateUI>false</customUpdateUI>
<allowBrowserInvocation>false</allowBrowserInvocation>
<icon>
<image36x36>icon36.png</image36x36>
<image48x48>icon48.png</image48x48>
<image72x72>icon72.png</image72x72>
</icon>
</application>


  Flash CS5 などでAIRを作ったときに出力される
  ***-app.xml だと、air のバージョンが 2.5 には
  なっていません。
  なので、


<application xmlns="http://ns.adobe.com/air/application/2.5">
← ここを 2.5 にする
<fullScreen>true</fullScreen> ← フルスクリーンモードの設定

<icon>
<image36x36>icon36.png</image36x36>
<image48x48>icon48.png</image48x48>
<image72x72>icon72.png</image72x72>
</icon>
← アイコン画像の設定
 (注:現在(2010/5/31) 36x36 は設定しても反映されないらしい)


 4.2 署名ファイルを作る

  > adt -certificate -cn mycert 1024-RSA codesigningCert.p12 123456

  一番最後の引数はパスワードです。
  (つまり、この例ではパスワードは123456)
  この例だと codesigningCert.p12 が作られます。

 4.3 AIRアプリから *.apk を作る

  > adt -package -target apk -storetype pkcs12 -keystore ../codesigningCert.p12 HelloWorld.apk HelloWorld-app.xml HelloWorld.swf
 
  -keystore には、4.2 で作った署名ファイルを指定します。
  パスワードを聞かれるので、署名ファイルを作ったときの
  パスワードを入力します。
  これで *.apk ができる(この場合だと HelloWorld.apk)ので、
  あとは、 adb install HelloWorld.apk とかで端末に
  インストールすれば OK です。

Android Android 2.2 データバックアップ

これを書いた 2010/5/31 にはなかった Registering for Android Backup Service という項が追加されていたので、追記しました。 2011/1/1


Android - Froyo - Data Backup

Android 2.2 からアプリケーションのデータのバックアップができるようになりました。
これまでは、アプリケーションのデータベースなどに保存されていたデータは、アプリケーションをアインストールすると削除されていました(アップデート時は保持される)。そのため、再インストール時(一度アインストールしてから、再びインストール)や、別の端末に切り替えたとき、そのデータを移行することができませんでした。
Froyo からはそれができるようになります。




元の記事はこちら↓
http://developer.android.com/intl/ja/sdk/android-2.2.html#api


Android 2.2 から、プラットフォームは 一般的なバックアップサービスを提供するようになりました。
これにより、ユーザーがデバイスを切り替えたり、アプリケーションを再インストールしたときに、ユーザーのデータを維持できるように、アプリケーションはユーザのデータをバックアップしリストアできるようになりました。
Backup Manager はアプリケーションのデータを、クラウド内のバックアップストレージ領域へ/から転送する動作を処理します。
Backup Manager は任意のデータからファイルまで、どんなタイプのデータも保存でき、バックアップと復元操作を管理します。
より詳しい情報は Data Backup を参照してください。




Data Backup

元の記事はこちら↓
ttp://developer.android.com/guide/topics/data/backup.html

Android's backup serveice によって、アプリケーションのデータをリモートの "cloud" ストレージにコピーすることができます。この "cloud" ストレージは、アプリケーションデータや設定情報のリストアポイントを提供するためのものです。
もし、ユーザーがファクトリーリセットをしたり、新しい Android デバイスに切り替えた場合、システムはアプリケーションのインストール時に、自動的にユーザーのバックアップデータをリストアします。
この方法によって、ユーザーはそのアプリケーションの以前のデータや設定情報を再生成する必要がなくなります。
このプロセスはユーザーに完全に透明で、アプリケーションの機能やユーザーエクスペリエンスに影響をあたえることはありません。


backup service が提供されている Android搭載デバイスは、アプリケーションのバックアップデータを保存するためのクラウドストレージ領域と、データをストレージ領域に届けデバイスに戻すためのバックアップ転送を提供します。
バックアップ操作の間、Android's Backup Manager はアプリケーションからバックアップデータを要求し、それをバックアップ転送を使ってクラウドストレージへ届けます。
リストア操作の間は、Backup Manager はバックアップ転送からバックアップデータを受け取り、それをアプリケーションに返します。そのため、アプリケーションはデバイスにデータをリストアできます。
backup service はデータ同期用にデザインされていません。
(デバイスへのリストア処理時以外は、バックアップデータへのアクセス権はありません)


バックアップに使われるクラウドストレージは必ずしも全ての Android 搭載デバイス上で同じである必要はありません。クラウドストレージとバックアップ転送は複数のデバイスとサービスプロバイダーの間で異なることがあります。
保存されたバックアップデータは、そのアプケーションに対して透明ですが、そのアプリケーションのデータは他のアプリケーションから読めないことが保証されています。


注意:クラウドストレージと転送サービスはデバイス間で異なることがあるので、Android はバックアップされるデータのセキュリティについて保障しません。あなたは、ユーザー名やパスワードのような機密データを保存する場合、バックアップの使用について慎重になる必要があります。



The Basics

アプリケーションのバックアップをするためには、backup agent を実装する必要があります。

Backup Manager から呼ばれる backup agent はユーザーがバックアップしたいデータを提供します。また、アプリケーションが再インストールされたときに、バックアップデータをリストアするためにも呼ばれます。Backup Manager はクラウドストレージでの全てのユーザーデータトランザクションを処理します。一方、backup agent はデバイス上での全てのユーザーデータトランザクションを処理します。

backup agent を実装するには

 1. AndroidManifest.xml の android:backupAgent 属性で
  backup agent を宣言する

 2. backup agent を定義する(方法は次のいずれか)

  a. BackupAgent を拡張する   
    BackupAgent クラスは、アプリケーションが BackupManager と
    通信するための中心的インタフェースを提供します。もし、
    このクラスを直接拡張したいなら、データのバックアップと
    リストアを処理するための onBackup()onRestore()
    オーバーライドしなければなりません。

  b. BackupAgentHelper を拡張する   
    BackupAgentHelper クラスは BackupAgent クラスの便利な
    ラッパーを提供します。これにより、書くべきコード量が
    最小化できます。 BackupAgentHelper 内で、特定のタイプの
    データを自動でバックアップ・リストアするために、1つ以上の
    "helper" オブジェクトを使う必要があります。
    この場合、onBackup() と onRestore() を実装する必要は
    ありません。

  Android で現在提供されている backup helper は、SharedPreferencesinternal storage の完全なファイルをバックアップ・リストアします。



Declaring the Backup Agent in Your Manifest

まず、backup agent のクラス名を決めます。
次に、AndroidManifest.xml の <application> タグ内の android:backupAgent 属性でそのクラスを宣言します。

例えば、

<manifest ... >
<application android:label="MyApplication"
android:backupAgent="MyBackupAgent">
<activity ... >
...
</activity>
</application>
</manifest>


これ以外に関係ある属性として、android:restoreAnyVersion があります。
この属性は boolean値をとり、バックアップデータを生成したときのアプリケーションのバーションと、現在のバーションの比較に関係なくアプリケーションのデータをリストアしたいかどうかを表します。(デフォルトは "false")より詳しい情報は Checking the Restore Data Version を見てください。

注: backup service とその API は API Level 8 (Android 2.2) もしくはそれ以上で走っているデバイス上でのみ使用可能なため、"android:minSdkVerions" 属性は 8 に設定すべきです。しかし、もしアプリケーションで適切な後方互換性を実装するなら、古いデバイスとの互換性を維持しながら、API Level 8 以上のデバイスに対してこの機能をサポートすることができます。


Registering for Android Backup Service

Android 2.2 以上が走っているデバイスに対して、Google は Android Backup Service を使った backup 転送を提供します。

Android Backup Service を使った backup をアプリケーションで行うために、Backup Service Key を受信するためのサービスにアプリケーションを登録しなければなりません。受け取った Backup Service Key はアプリケーションの Android manifest で定義します。

Backup Service Key を取得するには、Android Backup Service に登録します。登録すると、Backup Service Key が提供されるので、適切な <meta-data> XML コードとともに Android manifest の <application< エレメント内に定義します。


<application android:label="MyApplication"
android:backupAgent="MyBackupAgent">
...
<meta-data android:name="com.google.android.backup.api_key"
android:value="INSERT YOUR API KEY HERE" />
</application>


android:name には "com.google.android.backup.api_key" を指定し、android:value には Android Backup Service 登録で受け取った Backup Service Key を指定します。

注意: Android Backup Service によって提供される backup 転送は、backup をサポートする全ての Android 搭載デバイスで使用できることを保証しません。いくつかのデバイスは異なる転送を使ったバックアップをサポートし、いくつかのデバイスはバックアップ自体をサポートしないでしょう。デバイスがどの転送を使っているのかアプケーションから知る方法はありません。アプリケーションがバックアップを実装するなら、常に Backup Service Key を含むことで、デバイスが Android Backup Service 転送を使う場合にバックアップを実行することができます。デバイスが Android Backup Service を使わない場合は、Backup Service Key 用の <meta-data> エレメントは無視されます。


Extending BackupAgent

 一般的ではないので、後回し
 いずれ書きます。。。




Extending BackupAgentHelper

BackupAgentHelper の実装では、1つ以上の backup helpers を使う必要があります。
backup helper は BackupAgentHelper が特定のタイプのデータをバックアップ・リストアするために召喚する専用のコンポーネントです。
現在のフレームワークでは次の2つが提供されています。

 ・SharedPreferencesBackupHelper
    SharedPreferences のファイルをバックアップする

 ・FileBackupHelper
    internal storage のファイルをバックアップする


BackupAgentHelper には複数の helper を持たせることができますが、各データタイプに対して helper が1つあれば十分です。つまり、もし複数の SharedPreferences ファイルを持っていても、必要な SharedPreferencesBackupHelper は1つだけです。


BackupAgentHelper に追加したい各 helper に対して、 onCreate() で以下の処理が必要です。

  1. 必要な helper クラスのインスタンスを作成し、クラスの
   コンストラクタで、バックアップしたい適切なファイルを指定する


  2. addHelper() を呼んで、 helper を BackupAgentHelper に
   追加する



例1 Backing up SharedPreferences

こんな感じ


public class MyPrefsBackupAgent extends BackupAgentHelper {
// The name of the SharedPreferences file
static final String PREFS = "user_preferences";

// A key to uniquely identify the set of backup data
static final String PREFS_BACKUP_KEY = "prefs";

// Allocate a helper and add it to the backup agent
public void onCreate() {
SharedPreferencesBackupHelper helper = new SharedPreferencesBackupHelper(this, PREFS);
addHelper(PREFS_BACKUP_KEY, helper);
}
}


ここで、 "user_preferences" が SharedPreferences ファイルの名前です。
これで全体の backup agent は完成です。
Backup Manager が onBackup() や onRestore() を読んだとき、BackupAgentHelper はバックアップ・リストア処理を行うために backup helpers を呼びます。

注: SharedPreferences はスレッドセーフなので、backup agent と 他のアクティビティの間で安全に shared preferences の読み・書きができます。


例2 Backing up other files

FileBackupHelper のインスタンスを作成する場合、アプリケーションの internal storage に保存されている1個以上のファイル名を含める必要があります。
(internal storage は、getFilesDir() で指定されたディレクトリで、openFileOutput() でファイルが書き込まれる場所と同じです。)

こんな感じ


public class MyFileBackupAgent extends BackupAgentHelper {

// The name of the file in internal storage
static final String TOP_SCORES = "scores";
static final String PLAYER_STATS = "stats";

// A key to uniquely identify the set of backup data
static final String FILES_BACKUP_KEY = "myfiles";

// Allocate a helper and add it to the backup agent
public void onCreate() {
FileBackupHelper helper = new FileBackupHelper(this, TOP_SCORES, PLAYER_STATS);
addHelper(FILES_BACKUP_KEY, helper);
}
}


ここで、"scores" と "stats" は internal storage 内のファイル名です。

FileBackupHelper は アプケーションの internal storage 保存されたファイルをバックアップ&リストアするのに必要な全コードを含みます。

しかし、internal storage のファイルへの書き込み/読み出しはスレッドセーフではありません
backup agent はアクティビティと同時に読み/書きしないことを保証するために、読み/書きを実行するごとに同期された状態を使わなければなりません。
例えば、あるファイルを読み/書きするアクティビティでは、同期された状態のために intrinsic lock として使うオブジェクトが必要です。

こんな感じで定義

// Object for intrinsic lock
static final Object[] sDataLock = new Object[0];


Interesting Fact:
長さ 0 の配列は、通常のオブジェクトよりも軽い、なので intrinsic lock に最適!

そして、ファイルを読み/書きする毎にこの lock を使って同期された状態を生成します。

例えば、こんな感じ

try {
synchronized (MyActivity.sDataLock) {
File dataFile = new File(getFilesDir(), TOP_SCORES);
RandomAccessFile raFile = new RandomAccessFile(dataFile, "rw");
raFile.writeInt(score);
}
} catch (IOException e) {
Log.e(TAG, "Unable to write to file");
}


同じ lock を使って、読み込み状態も同期します。

そして、 BackupAgentHelper で、同じ intrinsic lock を使ってバックアップとリストア操作を同期させるために onBackup() と onRestore() を Override しなければなりません。

例えば、こんな感じ

@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
ParcelFileDescriptor newState) throws IOException {
// Hold the lock while the FileBackupHelper performs backup
synchronized (MyActivity.sDataLock) {
super.onBackup(oldState, data, newState);
}
}

@Override
public void onRestore(BackupDataInput data, int appVersionCode,
ParcelFileDescriptor newState) throws IOException {
// Hold the lock while the FileBackupHelper restores the file
synchronized (MyActivity.sDataLock) {
super.onRestore(data, appVersionCode, newState);
}
}


サンプルプロジェクトはこちら
http://developer.android.com/resources/samples/BackupRestore/index.html




Checking the Restore Data Version

Backup Manager がデータをクラウドストレージに保存した時、自動的にアプリケーションのバージョン(AndroidManifest.xml の android:versionCode 属性の値)も一緒に保存されます。
データをリストアするために backup agent を呼ぶ前に、Backup Manager は、インストールされているアプリケーションの android:versionCode を見に行き、リストアされるデータセットに記録されているバージョン値と比較します。
もし、記録されているバージョン値がデバイス上のアプリケーションのバージョンよりも新しい場合、ユーザーはアプリケーションをダウングレードしていることになります。この場合、Backup Manager はリストア操作を中止し、onRestore() を呼びません。なぜなら、リストアセットは古いバージョンには無意味と考えられるためです。

android:restoreAnyVersion 属性を設定することで、この振舞を override することができます。
この属性は "true" もしくは "false" を取り、リストアセットのバージョンにかかわらずアプリケーションのデータをリストアするかどうかを示します。
デフォルトの値は "false " です。もし、この属性を "true" に設定した場合、Backup Manager は android:versionCode の値を無視し、いつでも onRestore() を呼びます。そうすると、onRestore() でバージョンの違いをマニュアル的にチェックすることができ、バージョン競合の場合にデータ互換性を保つために必要な処理を行うことができます。

リストア操作のときに異なるバージョンを扱う手助けとして、onResotre() の第2引数で、リストアデータにセットされたバージョンコードを取得することができます。
onRestore (BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)

アプリケーションの現在のバージョンは PackageInfo.versionCode で取得できる。
こんな感じ

@Override
public void onRestore (onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState) {
super.onRestore(data, appVersionCode, newState);

PackageInfo info;
try {
String name = getPackageName();
info = getPackageManager().getPackageInfo(name,0);
} catch (NameNotFoundException nnfe) {
info = null;
}

if (info != null) {
if (appVersionCode != info.versionCode) {
....
}
else
....
}
}
}


注意:android:restoreAnyVersion 設定を "true" にした場合の特定の結果について理解してください。もし、バックアップをサポートしているアプリケーションの各バージョンにデータフォーマットの変動がある場合を onResore() 内で適切に扱わない場合、、デバイス上のデータは、現在インストールされているバージョンと非互換の形式で保存されます。




Requesting Backup

バックアップ操作は dataChanged() を呼ぶことでいつでも要求できます。このメソッドは Backup Manager に backup agent を使ってデータをバックアップしたいことを知らせます。そうすると、Backup Manager は呼び出しが可能になった時点で、backup agent の onBackup() を呼び出します。 典型的に、データが変化した毎にバックアップを要求すべきです。(例えば、ユーザーがバックアップしておきたいアプリケーションの設定を変更したときなど)
もし、複数回連続して dataChanged() を呼び出すと、Backup Manager が agent からバックアップを1回要求する前に、agent はまだ onBackup() を1回だけ受け取ります。

Note: アプリケーションを開発している間は、 bmgr tool を使うことで、バックアップを要求することができ、すぐにバックアップを開始することができます。




Requesting Restore

通常のライフサイクルでは、リストア操作要求する必要はありません。システムが自動的にバックアップデータをチェックして、アプリケーションのインストール時にリストアを実行します。しかし、もし必要ならば requestRestore() を呼ぶことで、マニュアル的にリストア操作を要求することができます。この場合、 Backup Manager は onRestore() 実装を呼び、バックアップデータの現在のセットからデータを渡します。




Developing and Testing Your Backup Agent

backup agent の 開発とテスト :

 Backup Agent をテストするには、bmgr toolを使って、次の手順を行ないます。

 1. アプリケーションを適切な Android system image にインストールする

  ・ エミュレータを使う場合は Android 2.2 (API Level 8)
    以上のAVDを作成する

  ・ デバイスを使う場合は、Android 2.2 以上が走っていて、
    かつビルトインの Android Market がインストールされている
    デバイスが必要


 2. バックアップを有効にする

  ・ エミュレータを使う場合、SDK tools/ 内の adb コマンドを使う

  ・ デバイスを使う場合、設定(Setting) → プライバシー(Privacy) で
    データのバックアップ(Back up my data) と 自動復元
    (Automatic restore) を有効にする

< adb shell bmgr enable true


 3. アプリケーションを起動して、いくつかのデータを初期化する

  データの変化時に dataChanged() メソッドを呼ぶなど適切に
  バックアップ処理が実装されている場合は、Backup Manager
  キューにバックアップリクエストが追加される。
  テストを目的として次のコマンドでリクエストを生成することができる


< adb shell bmgr backup your.package.name


 4. バックアップ処理を初期化する

  Backup Manager にキュー内の全てのバックアップリクエストを処理させる


< adb shell bmgr run


 5. アプリケーションをアンインストールする


< adb uninstall your.package.name


 6. アプリケーションを再インストールする

backup agent が成功していれば、step 4 で初期化したデータがリストアされる

AIR on Android 女子部イベント

Adobe AIR on Android 日本Androidの会 女子部コラボイベント

CS5Seminar で発表しました~

5月26日(水)に
原宿の station 5 (http://station5.jp/
で Adobe と 日本Androidの会 女子部の
コラボイベントがありました。
http://station5.jp/seminar/archive.php?sid=19
その名も

「Andronjoの夕べ」

Google I/O (2010/5/19 - 5/20)で Android が Flash に
対応する!ということで、
Flash 10.1 と AIR on Android が Adobe から発表されました。
(http://cuaoar.jp/2010/05/google-io.html とか)

Flash 10.1 は、Android 2.2 (Froyo) から対応する
Full Flash を見れる plug-in playerです。Android 2.2 の端末なら
マーケットから落とせます。
これを入れると、ニコニコ動画のような、これまでの Flash Lite では
みれなかった、Flash コンテンツが見れるようになります。
YouTube : Android2.2(Froyo)でニコニコ動画を再生してみた。

AIR on Android は、AIRアプリを Android で実行するための
runtime です。
http://labs.adobe.com/technologies/air2/android/
まだベータ版ですが、プレリリースプログラムに参加すると、
落として端末に入れることができます。
対応している端末は Android 2.1 or Android 2.2 で
ARM アーキテクチャが v7 の端末です。
N1, Desire, Droid (Milestone), EVO などが対応してます。
(2.1 にあげれば Liquid もOKなんだけどね)

プレリリースプログラムへの参加はこちらから
Adobe® AIR® - Android Developer Prerelease
このプログラムは英語のみでの提供です

今回のイベントでは、女子部で AIR アプリを作成し、
端末で動かしてみよう!
ということで、2チームに分かれて「より弁」と「にゃんこあつめ」という
アプリを作りました。



イベントの ust はこちら(注:なぜか途中までしかありません ><)
http://station5.jp/seminar/archive.php?sid=19
(そのうちアーカイブが出るらしいが出ないかもしれない)

スライドはこちら(今、公開してOKか確認中です。。。)

にゃんこ集めのスタート画面はこんな感じ
癒されるわー。



*どうもプレリリースプログラム内で入手できる情報を一般に公開することはできないそうです。誰でも参加はできるのですが、プライベートなプログラムなので、情報共有は参加者間のみに限定されるみたいです(今確認中)。

 ↓

Adobe さんからOKでたので、apk の作り方書いちゃいまーす。
AIR on Android apk の作り方 Adobe AIR on Android 事始め ~ その1 ~

2010年5月27日木曜日

AIR on Android メモ

初めてAS3でAIRアプリを作成して、Android 上の runtime で動くまでをやりました。

そのために、いろいろ参考にしたサイトの一覧です。

Adobe AIR on Android については、いずれ別のエントリで書きます。

Loader class
LoadMovie & MovieclipLoaderのような外部画像の読み込みをAS3

MovieClip

AIR
「Building ADOBE AIR Applications」(pdf)

Adobe AIR on Android
「Tips for mobile development using Adobe AIR」(pdf)
AIR 2.0

AS3
ActionScript 3.0 API support for mobile devices

PhoneGap (for FlashPlayer 10.1)
Flash Player 10.1 – Camera support with PhoneGap

2010年5月24日月曜日

Android Android 2.2 外部メディア (SDcard) へのインストール指定

Android - Froyo - App installation on external storage media

Android 2.2 (Froyo) から、アプリケーションはどこにインストールされるかを指定することができるようになりました。
つまり、マーケットからインストールするときに、内部メモリではなく SDcard のような外部メディアにインストールさせることが可能になりました。
*あくまでのアプリ側が自分がどこにインストールされるかを指定できるということです。ユーザーが指定できるわけではありません。

元記事はこちら↓ (誤訳の責任はとりません)
http://developer.android.com/intl/ja/sdk/android-2.2.html#api

具体的には、AndroidManifest.xml の
< manifest > タグに

 android:installLocation

を設定します。
設定できる値は

 ・"internalOnly"
 ・"preferExternal"
 ・"auto"

の3つです。
こんな感じ


<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="preferExternal"
... />


by App Install Location

インストール時にシステムは "android:installLocation" の値を参照して、(可能な場合は)適切な位置にインストールします。
もし、アプリケーションが外部メディアにインストールするように要求している場合、システムはアプリケーションを外部メディアのプライベートな暗号化パーティションにインストールします。
一度アプリケーションが外部にインストールされると、ユーザーはそのアプリケーションの保存場所を内部メモリに移動させることが可能になります(ユーザー設定のアプリケーションの管理で行う)。

デフォルトでは、明示的に外部メディアへのインストールを要求する場合以外は、システムはすべてのアプリケーションをデバイスの内部メモリにインストールします。
これは、システムは常に内部メモリに従来のアプリケーションをインストールすることを意味します。なぜなら、従来のアプリケーションには "android:installLocation" 属性へのアクセスがないからです。
しかし、もし必要ならば、古いバーションのプラットフォームでは内部メモリにインストールし、Android 2.2 とそれ以降のプラットフォームでは外部メディアにインストールするように、従来のアプリケーションを設定し、コンパイルすることは可能です。

デバイスの外部メディアにインストールを要求することは、すべてのアプリケーションにとって適していないことに注意してください。特に、外部メディアは取り外しが可能で、アンマウント/再マウントによってユーザ経験やシステム設定を混乱させる可能性があります。

適切なインストール場所についての詳しい情報は
 App Install Location
を参照してください。
どんなアプリケーションが外部メディアへのインストールに適しているかの議論が含まれています。






App Install Location

元記事はこちら↓ (誤訳の責任はとりません)
http://developer.android.com/intl/ja/guide/appendix/install-location.html

*上記とかぶっている部分は除いてあります。

"android:installLocation" 属性が宣言されていない場合は、アプリケーションは内部ストレージにだけインストールされます(外部ストレージに移動はできません)。

アプリケーションを外部ストレージにインストールする場合は、"android:installLocation" に "preferExternal" もしくは "auto" を指定します。

"preferExternal" を宣言した場合、アプリケーションは外部ストレージへのインストールを要求しますが、システムはそのアプリケーションが外部ストレージにインストールされるかどうかは保証しません。
例えば、外部ストレージが満杯の場合、システムは内部ストレージにインストールします。ユーザーはアプリケーションの場所を(内部と外部ストレージの間を)移動することができます。

"auto" を宣言した場合、アプリケーションが外部ストレージにインストールされる可能性を示しますが、インストール場所の優先順位は持っていない。システムがいくつかのファクターをもとにどこにインストールするかを決定します。この場合もユーザーはアプリケーションの場所を移動することができます。

外部ストレージにアプリケーションがインストールされた場合

 ・外部ストレージがデバイスにマウントされている限り、
  アプリケーションのパフォーマンスには影響しない

 ・.apk ファイルが外部ストレージに保存されていても、
  プライベートユーザーデータ、データベース、
  最適化された .dex ファイル、引用されるネイティブコードは
  全て内部デバイスメモリに保存される

 ・アプリケーションが保存される一意のコンテナは、
  ランダムに生成されたキーで暗号化されており、
  アプリケーションをインストールしたオリジナルのデバイスだけが
  複合化できる。つまり、SD card へのアプリケーションの
  インストールは単一のデバイスに対してのみ働く

 ・ユーザーはシステム設定で、アプリケーションの保存先を
  内部ストレージに移動できる

*警告:PCとファイルを共有するためにUSBマスストレージを有効にした場合や、SD card をアンマウントした場合、外部ストレージで走っているすべてのアプリケーションはただちに kill されます




Backward Compatibility

外部ストレージへのインストールを許可し、API Level 8 よりも下のバージョンとの互換性を残す方法

 1 android:installLocation 属性を含み、"auto" もしくは
  "preferExternal" を宣言する

 2 android:minSdkVersion 属性を残し("8" より小さいなにか)、
  アプリケーションのコードがそのレベルと互換性のあるAPIだけ
  使っていることを確かめる

 3. アプリケーションをコンパイルするときにビルドターゲットを
  API Level 8 にする。これは、Level 8 よりも古い Android
  ライブラリが android:installLocation を理解できないため、
  前のバージョンではコンパイルできない。

この方法でコンパイルしたアプリケーションは、API Level が 8 よりも小さいプラットフォームでは "android:installLocation" 属性は無視されて内部ストレージにインストールされ、8 より大きいプラットフォームでは外部ストレージにインストールされる。

*注意: minSdkVersion が "8" より小さい場合、後方互換性を保つため、API Level 8 で紹介されたAPI は使ってはいけない




Applications That Should NOT Install on External Storage

外部ストレージがアンマウントされた場合、外部ストレージで走っているアプリケーションは kill される。よって、次のような特徴をもつアプリケーションは外部ストレージに保存すべきではない。

・Services
  ただし、ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
  broadcast Intent をトリガーとして登録し、再スタートできる

・Alarm Services
  Service と同じ方法で再マウント時に再登録できる

・Input Method Engines
  アンマウントされた場合、IME はデフォルトに置き換えられる。
  再マウント時にユーザーが再設定する必要がある

・Live Wallpapers
  アンマウントされた場合、Live Wallpaper はデフォルトに
  置き換えられる。再マウント時にユーザーが再度選択する必要がある

・Live Folders
  アンマウントされた場合、ホームスクリーンから Live Folder
  は削除される。再マウント時にユーザーが再度ホームスクリーンに
  追加する必要がある

・App Widgets
  アンマウントされた場合、ホームスクリーンから App Widget は
  削除される。再マウント時にユーザーがホームアプリケーションを
  システムリセットするまで(通常はリブートするまで)、
  ユーザーは App Widget を選択できない

・Account Managers
  AccountManager によって作成されたアカウントは外部ストレージが
  再マウントされるまで見えなくなる

・Sync Adapters
  AbstractThreadedSyncAdapter とその全同期機能は外部ストレージが
  再マウントされるまで働かなくなる

・Device Administrators
  DeviceAdminReceiver とその全ての管理能力は無効になり、
  デバイスの機能に対して予測不可能な結果を持つ可能性があり、
  外部ストレージが再マウントされた後も続く可能性がある


デフォルトでは内部メモリインストールされるため、特にすることはないが、外部ストレージに保存すべきでないことを明示する場合は "android:installLocation" に "internalOnly" を宣言してください。




Applications That Should Install on External Storage

簡単にいえば、上記であげた特徴を持たないアプリケーションは外部ストレージに保存しても安全である。サイズの大きいゲームなどは、外部ストレージに保存すべきアプリケーションのタイプの1つである。なぜなら、ゲームは典型的にアクティブではない場合に追加のサービスを提供しないため。
外部ストレージにアクセスできなくなり、ゲームのプロセスは kill された後、ストレージが再び使用可能になった場合目に見える効果はなく、ユーザーはゲームを再起動する必要があります。(通常の Activity lifecycle で適切にゲームが保存されていると仮定)

もし、アプリケーションが APK ファイルとして数メガバイトを要求する場合、ユーザーが内部ストレージのスペースを確保するために、アプリケーションが外部ストレージに保存できるようにするかどうか慎重に検討する必要がある。

Android Android 2.2 Platform Highlights

Android 2.2 Platform Highlights
を訳してみました。

*誤訳があっても責任はとりません。





このページは Android 2.2 のハイライトなので、より詳しい内容はこちらを
参照してください
Android 2.2 version notes.




New User Features

Home

新しいホームスクリーンにはチップスウィジェットが配置されるようになりました。
これは、新しいユーザーにショートカットやウィジェットをホームスクリーンに設置する方法や、複数のホーム画面を使用する方法をアシストします。

電話、アプリケーションランチャー、ブラウザのショートカットがホームスクリーンに配置されるようになりました。
5画面すべてに表示されるので、これらのアプリへのアクセスが簡単になりました。



Exchange support

端末のロック解除に数字ピンまたは英数字のパスワードオプションを追加して、セキュリティを強化しました。
Exchange管理者はデバイス間でパスワードポリシーを強制することができます。

リモートワイプ: Exchange管理者はリモートで端末をファクトリーリセットすることができます。これにより、紛失・盗難した場合に端末内のデータを保護することができます。

Echangeカレンダーがカレンダーアプリケーションでサポートされるようになりました。

Auto-discovery: 自分のユーザ名とパスワードを知っているだけで、Exchange アカウントとの同期が簡単にセットアップできます。(Exchange 2007および以降で可能)

グローバルアドレスリストのルックアップが、メールアプリケーションで利用できるようになりました。
これにより、ディレクトリから、受信者の名前の自動補完ができるようになりました。



Camera and Gallery

ギャラリーで、ズームジェスチャーを使って、ピクチャ集をのぞき込めるようになりました。

カメラの画面上のボタンでは、ズーム、フラッシュ、ホワイトバランス、ジオタグ、フォーカス、露出を簡単に設定できます。
ビデオカメラでは、サイズ/品質をMMSおよびYouTube用に簡単に設定できます。

LED フラッシュがビデオカメラでも使えるようになりました。
これにより、夜や低照度でも撮影することができるようになりました。



Portable hotspot

Nexus One のような一部のデバイスは、最大8つのデバイスが共有することができるWi-Fiホットスポットになることができます。

コンピュータにUSBケーブルでAndroid搭載携帯電話を接続することにより、WindowsまたはLinuxラップトップの3G接続として使用することができます。接続は、2つのデバイス間で共有されます。



Multiple keyboard languages

多言語のユーザーは、キーボードに複数の言語を追加することができます。
また、スペースバーをスワイプすることで、複数のラテンベースの入力言語を切り替えることが可能です。にこれは、auto-suggest dictionary と同じようにキーを切り替えます。



パフォーマンスの向上
V8エンジンを使用することで、JavaScript重いページの読み込みを高速化することが可能になり、ブラウザのパフォーマンスが改善しました。

Dalvik Performance Boost: Dalvik JIT によって、Android 2.1 に比べて、CPU-heavy code が 2~5倍パフォーマンスがスピードアップしました。

Kernel Memory Management Boost: メモリの再利用が最大20倍改善しました。つまり、デバイスにメモリが制約される状況で、アプリの切り替えがより速く、パフォーマンスがスムーズになりました。






New Platform Technologies

Media framework
・新しいメディアフレームワーク(Stagefright)は、ローカルファイルの再生とHTTPストリーミングをサポートしています
・Android 2.2 でも OpenCoreのサポートは継続します

Bluetooth
・Bluetooth からの音声ダイアル
・他の携帯電話とコンタクトを共有できる
・車およびデスクドックで Bluetooth を有効にするためのサポート
・カーキットやヘッドセットとの互換性の向上

2.6.32 kernel upgrade
・RAM >256MB に対して HIGHMEM をサポート
・SDIO スケジューリング と BT の改善




New Developer Services

Android Cloud to Device Messaging
アプリは Device Messaging に Android クラウドを利用することができます。
これにより、端末アラート、携帯電話への送信、双方向のプッシュ同期機能が可能になります。

Android Application Error Reports
Androidマーケットアプリケーションのための新しいバグレポート機能によって、開発者がユーザーからクラッシュやフリーズのレポートを受け取ることができます。レポートはデベロッパーコンソールで確認できます。




New Developer APIs

Apps on external storage
共有外部メモリ(例えば SD card)からアプリケーションをインストールできる

Media framework
新しいAPIは、オーディオフォーカス、SCOへのオーディオルーティング、およびファイルのメディアデータベースへの自動スキャンを提供します。
また、アプリケーションが、サウンドの読み込み、自動停止、自動プレイバックによる再開を検出できるようなAPIを提供します。

Camera and Camcorder
新しいプレビューAPIはフレームレートを2倍(~10FPSから~20FPSへ)にします。
カメラは、縦向き(portrait)、ズームコントロール、露出データへのアクセス、サムネイル設定をサポートしています。
新しいビデオカメラのプロファイルは、アプリケーションがデバイスのハードウェア能力を決定することを可能にします。

Graphics
OpenGL ES 2.0 の新しい API は YUV画像形式、および ETC1 のテクスチャ圧縮で動作します。

Data backup
アプリのデータがバックアップおよび復元できるようになりました。
ユーザーがファクトリーリセットを実行した後や、デバイスを切り替えた後も、
データが維持されます。

Device policy manager
新しいデバイスのポリシー管理APIによって、開発者は"デバイス管理"アプリケーション作成することができます。
これは、デバイス上のセキュリティ機能(例えば、最小パスワード強度やデータワイプなど)を制御できます。
ユーザーは自分のデバイスで有効になっている管理者を選択することができます。

UI framework
新しい"car mode"と"night mode"のコントロールと設定は、アプリケーションがこのような状況のためにUIを調整することを可能にします。
スケールジェスチャー検出APIは、改善されたマルチタッチのイベントの定義を提供します。
アプリケーションは、TabWidget の下部にあるストリップ(bottom strip)をカスタマイズできます。



新しい developer APIs のより詳しい情報は
Android 2.2 version notes
API Differences Report
を見てください。

Google I/O のメモ

Google I/O のメモ(というかリンク集)です。
関係あるような、ないようなのも含まれてたり、なかったり。。。

---

公式ページ
http://code.google.com/intl/ja/events/io/2010/

発表の目玉

WebMプロジェクト: MozillaおよびOperaと共同で推進する新たなビデオフォーマット

Google App Engine for Business: PaaSの企業向けバージョン。管理・サポート機能などを追加し、米VMwareとの提携でポータビリティを強化

Google Storage for Developers: 100Gバイトのストレージと月間300Bバイトまでの帯域を無料で利用できる、開発者向けのオンラインストレージサービス

Google Waveの一般公開: Google Labsのプロジェクトのままだが、招待が必要なくなった

Chrome App Store: Webアプリのオンラインストア。サードパーティーはここでWebアプリを販売できる

Google Font API: オープンソースのWeb向けフォント


Google Strage
http://code.google.com/intl/ja/apis/storage/


Google Font API
http://code.google.com/webfonts
http://code.google.com/intl/ja/apis/webfonts/
http://www.ideaxidea.com/archives/2010/05/font_previewer.html
http://code.google.com/intl/ja/apis/webfonts/docs/getting_started.html


Google Latitude API
http://googlecode.blogspot.com/2010/05/with-new-google-latitude-api-build.html


webM
http://www.webmproject.org/
http://nightly.mozilla.org/webm/
http://hacks.mozilla.org/2010/05/firefox-youtube-and-webm/
http://labs.opera.com/
http://tsushima.dat2ch.net/test/read.cgi/news/1274307850/l50
http://es.prit.jp/php-rss/gadget.php
http://d.hatena.ne.jp/ampll/20100519/1274295134
http://www.streamingmedia.com/Articles/Editorial/Featured-Articles/First-Look-H.264-and-VP8-Compared-67266.aspx
http://x264dev.multimedia.cx/?p=377


Chrome Web Store
https://chrome.google.com/webstore


HTML5
http://labs.adobe.com/technologies/html5pack/


device's pictures
http://www.flickr.com/photos/androidandme/sets/72157623971136149/detail/


Wave
https://wave.google.com/wave/#restored:wave:googlewave.com!w+v7BXJrZkBJT


Android
http://www.itmedia.co.jp/enterprise/articles/1005/21/news029.html
http://code.google.com/intl/ja/android/c2dm/
http://www.google.com/mobileads/


その他
http://replicaisland.net/
http://www.thespeechsource.com/cart.asp

2010年5月21日金曜日

Android froyo のエミュレータを起動してみた

ホーム画面



Launcher 画面




Car Home の画面




Speech Recoder の画面




Custom Locale の画面






Dev Tools の画面



なんかいろいろテストできるぽい。
Media Scanner とか気になる。

Package Browser は各アプリの Process とか Affinity とかみれるのか。
これなら、同じ Affinity を別の人が作ったアプリを
同じにできなくもない。とか。。。
アクティビティごとのも見れるのね。

Package Brower の画面



あとは、Pointer Location とか Sync Tester とかも楽しそう。

でもエミュレータ遅すぎて、実機無いとやる気が。。。

Terminal まで入ってる。さすが。


Terminal Emulator の画面

2010年5月17日月曜日

Android 自動でソフトキーボードが出るのを防ぐ

Activity を起動したときに
EditText にフォーカスがあたるようになっていると
自動でソフトキーボードが出ることがあります。

これを防ぐには Window の setSoftInputMode() で
SoftInputMode を設定します。

こんな感じ


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);  
this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
setContentView(R.layout.main);
}


ここでは、SOFT_INPUT_STATE_ALWAYS_HIDDEN を使っていますが、
SOFT_INPUT_STATE_HIDDEN でも大丈夫かも(確認してません)


他にも Visibility state に以下の値が設定できます。
WindowManager.LayoutParams

SOFT_INPUT_STATE_ALWAYS_HIDDEN
window がフォーカスを受けたときに常に soft input area を隠す

SOFT_INPUT_STATE_ALWAYS_VISIBLE
window がフォーカスを受けたときに常に soft input area を表示する

SOFT_INPUT_STATE_HIDDEN
通常、適切なとき(ユーザが window を全面に持ってきたとき)に soft input area を隠す

SOFT_INPUT_STATE_UNCHANGED
soft input area の状態を変更しないでください

SOFT_INPUT_STATE_UNSPECIFIED
状態は指定されていない

SOFT_INPUT_STATE_VISIBLE
通常、適切なとき(ユーザが window を全面に持ってきたとき)に soft input area を表示する

2010年5月14日金曜日

Android 端末のCPU情報を取得

端末をUSBで繋いで、adb shell コマンドでOK


$ adb shell
$ cat proc/cpuinfo
Processor : ARMv7 Processor rev 3 (v7l)
BogoMIPS : 249.96
Features : swp half thumb fastmult vfp edsp neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x1
CPU part : 0xc08
CPU revision : 3

Hardware : mapphone_UMTS
Revision : 0000
Serial : 0000000000000000
$ exit

2010年5月13日木曜日

Android Intent に Bitmap を渡す方法

Bitmap クラス は Parcelable を implement してるので、

こんな感じで Intent に渡せます。

Intent intent = new Intent(this, ResultActivity.class);
intent.putExtra("data", bmp);
startActivityForResult(intent, SHOW_RESULT);


もしくは

Intent intent = new Intent(this, ResultActivity.class);
Bundle b = new Bundle();
b.putParcelable("data", bmp);
intent.putExtras(b);
startActivityForResult(intent, SHOW_RESULT);


受け取るときは、こんな感じ

Intent intent = getIntent();
Bundle b = intent.getExtras();
Bitmap bmp = (Bitmap) b.get("data");


もしくは

Intent intent = getIntent();
Bitmap bmp = (Bitmap) intent.getParcelableExtra("data");

2010年5月5日水曜日

Android ColorPickerDialog を作った

Android にはユーザーに色(Color)を選択してもらうための
デフォルトのUIが用意されていません。

ApiDemo のなか(com.example.android.apis.graphics)
には ColorPickerDialog.java があるのですが、
選択できるのは色相だけです。

なので、彩度と明度も選択できるように
カスタマイズした my ColorPickerDialog を
恥ずかしながら公開します。

HSV色空間 by wikipedia

Dialog を継承したクラスなので、こんな感じで使います。
第1引数は Context, 第2引数は色が選択された時の listener,
第3引数はダイアログに渡す初期色です。


int selectColor;

ColorPickerDialog mColorPickerDialog;

mColorPickerDialog = new ColorPickerDialog(this,
new ColorPickerDialog.OnColorChangedListener() {
@Override
public void colorChanged(int color) {
selectColor = color;
}
},
Color.BLACK);

mColorPickerDialog.show();


source はこちら

ColorPickerDialog


2010年5月3日月曜日

Android タイトルバーをカスタマイズ

アプリの上部に表示されるタイトルバー(Title Bar) の色とか
をカスタマイズするには、自分でカスタムテーマを作って、
AndroidManifest.xml で theme="MyCustomTheme" とか
指定します。

んで、

タイトルバーに関係あるカスタマイズはこんな感じ
でします。

・theme.xml とか style.xml とか









上記だと、タイトルバーの背景画像は title_bar.png
文字の大きさとかは、android で定義されている TextAppearance.WindowTitle
というスタイルを指定しているが、もちろん自分で設定した
スタイルを指定できる。

ちなみに、TextAppearance.WindowTitle の中身はこうなってる




shadowColor, shadowRadius は影の色は半径

windowTitleSize でタイトルバーの幅を指定します。

2010年5月1日土曜日

Android 画面サイズに応じて layout を変える

解像度ごとにレイアウトを変える場合は

layout-hdpi
layout-mdpi
layout-ldpi


にそれぞれ、layout.xml などを入れればOKですが、

画面サイズ
(例えば、 320x480(HT-03A etc), 480x854(Droid)とか)
に応じてレイアウトを変えたい場合はどうすればいいんでしょう?

なんと、画面サイズを入れた layout フォルダを作ればいいのです。
つまり、

layout-480x320
layout-854x480


とかのディレクトリを作って、ここにそれぞれ layout.xml
などれ入れればOKです。

320x480 ではなく、480x320 なところに注意!

各端末の画面サイズなどはこちらをどうぞ
Android 画面サイズ一覧