2010年12月3日金曜日

Android 親和性と新しいタスク

Android アクティビティとタスクで、アクティビティのタスク管理について基本は説明したが、
デフォルトではアプリケーション内のActivityはできる限り同じタスクに属そうとする。これを
「親和性」と呼ぶ。しかし、この「親和性」も設定によって変更できる。以下それについて説明する。

関係するものは、以下のIntentフラグ。
 FLAG_ACTIVITY_NEW_TASK
 FLAG_ACTIVITY_CLEAR_TOP
 FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
 FLAG_ACTIVITY_SINGLE_TOP

また、以下の<activity>属性も関係。
 taskAffinity
 launchMode
 allowTaskReparenting
 clearTaskOnLaunch
 alwaysRetainTaskState
 finishOnTaskLaunch

■FLAG_ACTIVITY_NEW_TASK
startActiviyのパラメータにFLAG_ACTIVITY_NEW_TASKを指定すると、新しい
タスクとして起動させることができる。


例)a⇒b⇒c(FLAG_ACTIVITY_NEW_TASK)

タスク タスク タスク タスク
    |c| ← ここが表示
     ̄
| | | | | | | |
| |⇒|b|⇒|b|⇒|b|
|a| |a| |a| |a|
  ̄   ̄    ̄   ̄
■allowTaskReparenting
allowTaskReparentingがtrueになっていると、そのアクティビティと親和性のあるアプリがフォアグランドに来た際に、呼び出し元のアクティビティからそのアプリのタスクに移動できる(らしい)



例)アプリ①cb(allowTaskReparenting)⇒ホーム画面⇒アプリ②a⇒b


==フォアグラウンド====================================================
タスク       タスク タスク
| |        | | | |
|b|⇒ホーム画面⇒| |⇒|b|←ここが表示
|c|       |a| |a|
  ̄          ̄   ̄
==バックグラウンド====================================================
              ↑↑↑
タスク       タスク     
| |        | |     
|b|⇒ ⇒ ⇒ ⇒| | 
|c|       |c|    
  ̄          ̄      
======================================================================

Android アクティビティとタスク

Androidでは画面(Activity)はスタックとして管理される。
例えば画面a、b、cで構成されるアプリがあるとしa⇒b⇒cと画面を開くと
内部では以下のようにタスクに積まれていく。


例) a⇒b⇒c



タスク タスク タスク タスク
| | | | | | |c|← ここが表示
| |⇒|b|⇒|b|⇒|b|
|a| |a| |a| |a|
  ̄   ̄    ̄   ̄


タスクはオブジェクトを保持するので、複数おなじ画面を開いても基本は
別々にインスタンスがタスクに格納される。


例) a⇒b⇒b



タスク タスク タスク タスク
| | | | | | |b|← ここが表示
| |⇒|b|⇒|b|⇒|b|
|a| |a| |a| |a|
  ̄   ̄    ̄   ̄


まあタスクはプッシュ・ポップ型になっており、startActivity()を呼ぶとタスクに
プッシュされ、戻るボタンを押下するとタスクからポップされる。


例) a⇒b⇒c⇒「戻る押下」



タスク タスク タスク タスク タスク
| | | | | | |c| | |
| |⇒|b|⇒|b|⇒|b|⇒|b|← ここが表示
|a| |a| |a| |a| |a|
  ̄   ̄    ̄   ̄    ̄


さらにタスクのアクティビティは1つのユニットとして移動する。
例えばa、b、cで構成されたアプリ①があり、ホーム画面を押し別のx、y、zで
構成されるアプリ②を呼び出すと、①アプリ1つのユニットとしてバックグラウンド
に一旦引っ込み、②のタスクユニットがフォアグラウンドに呼ばれる。そのあと
またホーム画面を表示し①のアプリをよんで戻るボタンを押下しても②のアプリ
は表示されず、b画面が表示される。



例)アプリ①(abc)⇒ホーム⇒アプリ②(xyz)⇒ホーム⇒アプリ①(abc)⇒戻る

==フォアグラウンド====================================================
タスク       タスク タスク タスク
|c|        |z|        |c| | |
|b|⇒ホーム画面⇒|y|⇒ホーム画面⇒|b|⇒|b|←ここが表示
|a|       |x|       |a| |a|
  ̄          ̄   ̄   ̄
==バックグラウンド====================================================
タスク            
|c|            
|b|⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ↑↑↑
|a|           
  ̄             
タスク     
      |z|
|y|⇒ ⇒ ⇒ ⇒ ⇒
      |x|
         ̄ 
======================================================================
上記は基本だが、ほとんどの状態を変更できる。親和性と新しいタスクで説明。

2010年12月1日水曜日

Android 最初の一歩

いろいろAndroid情報があるけど、googleサイトを熟読することが大切。
最近、日本語訳も進んでいるのでまずはここを見る。



情報源としては「日本アンドロイドの会」ってのがあるのでそのサイトに登録しておけば、いろいろ
メールが飛んでくる。また勉強会やイベントもやっているのでそこに参加するのもよいかも。
(まだ行ったことないけど)


androidをダウンロードしたらJavaDocがついているのでそれを見たり、最初からデモ
アプリがあるのでそれを動かすことでイメージをつかむ。

開発環境は、EclipseをダウンロードしてあとはAndroidプラグインをインストールすれば
誰でも簡単に構築できる。

ただ、デバッグはエミュレータがついているけど、結構重たいので、できれば実機でやるほうが
効率がいい。(自身もエミュレータの遅さに嫌気が差してXPERIA買うまでほとんどやってなかった)




Androidで日本語を話させる

現在のAndroid(2.3)ではテキスト読み上げは、英語、スペイン語、フランス語、ドイツ語、イタリア語には対応しているが、日本語には対応していない。

でも世の中には以下のような日本語音声補完のための仕組みがあるらしい。

・Android JaTTS
Android用にカスタマイズされた音声合成アプリおよびライブラリ。
修正BSDライセンス

・ToSpeak
東芝さんの音声合成サイト。
サイトにログインして音声を作成し、ローカルにダウンロードもできる。
現在は無料期間中だが、いずれ課金される感じ。

・おしゃべりっち
無料で使える音声読み上げAPI。
JavaScript使用できる環境が必要。結構流暢に話す。

・ドキュメント・トーカ
Windows上やモバイル上で動かせる音声合成アプリ、およびライブラリ。
Android版も最近登場。有料と無料あり。


で、Androidって名前とwikiがすでに立ち上がっていたので
今回はAndroid JaTTSを使ってみる。

1)以下からjarをダウンロード

2)AndroidManufest.xmlにINTERNETパーミッションを追加
Android JaTTSの仕組みが、サーバ側でGalatea Talk (デモ)というものを動かしたものを再生しているので、Internet接続必要。






3)Activityソース作成
基本は以下で音声でる。



import net.gimite.jatts.JapaneseTextToSpeech;


public class DemoActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tts.speak(kuku[0], TextToSpeech.QUEUE_FLUSH, null);
}

第三引数はHashMapで音声を女性に変えたりできるみたい。


実際動かしてみたけど「は」を「わ」と認識されたりした。これはこのアプリとかではなく
音声合成ではよくあることなんかはわからんが、子供向けアプリを作りたいので
もうすこし流暢なほうがいいな。。

でも簡単に組み込めるのでおすすめです。

FreeMindをWebで公開する方法

以下のサイトを参照。

http://r-o-y.info/mt/job/2008/04/freemindweb.html

表示された画面では枝を閉じたりできるので、すごくよい!

ただレンタルサーバ(JavaScript認識可)ではうまく表示できたけど、
bloggerではうまく表示されなかった。JavaScriptを認識しないのかな!?



Android EclipseでLogCatのログが出なくなった場合。

Android開発をしてて、急にログが出なくなった(invalid~)場合の対処方法。

①コンソールを開き、androidがインストールされているディレクトリから/tools/adb.exe
に移動。
例)cd C:\develop\android-sdk_r06-windows\android-sdk-windows\tools\adb.exe

②「adb logcat -c」と打つことでlogをクリア

2010年11月30日火曜日

bloggerにsyntaxhighlighterでソースコード貼り付け

ソースコードをブログに表示するには、syntaxhighlighterが使いやすい。
ただしファイルbloggerの場合はjsファイル等をアップするところがないので、
別途ファイルをアップしてアクセスできる場所が必要!!

自分の場合は、フリーのWebサイトがあるのでそこにFTPでファイルをあげて使ってます。

以下、方法

①以下サイトの下部にある2.oをクリックし、右のdownloadからファイルをダウンロード。

②解凍したstylesとscriptsのフォルダごと任意のサーバにアップ

③bloggerにログインし、デザインページで「HTML編集」表示

④html形式で表示されるので、以下の内容を追記(自分はheadタグの一番最後に追加しました)

<link href="http://www.xxx/styles/shCore.css" rel="stylesheet" type="text/css">
<link href="http://www.xxx/styles/shThemeDefault.css" rel="stylesheet" type="text/css">
<script src="http://www.xxx/scripts/shCore.js" type="text/javascript">
<script src="http://www.xxx/scripts/shAutoloader.js" type="text/javascript"/>
<script src="http://www.xxx/scripts/shBrushJScript.js" type="text/javascript"/>
<script src="http://www.xxx/scripts/shBrushCss.js" type="'text/javascript"/>
<script src="http://www.xxx/scripts/shBrushXml.js" type="text/javascript"/>
<script src="http://www.xxx/scripts/shBrushJava.js" type="text/javascript"/>
<script language="javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>

⑤テンプレートを保存

⑥実際の投稿文書で「HTMLの編集」を押下し、ソースコードを貼り付け。
その際<pre class="brush:java"></pre>でソースをはさむ。
※xmlの場合は”brush:xml"とかに変更。

<pre class="brush:java">
public static void main(args[]){
System.out.println("hoge");
}
</pre>

⑦保存
以下、実際の表示
public static void main(args[]){
System.out.println("hoge");
}

2010年11月29日月曜日

AndroidでGoogle Mapを使う注意点

以前、XPERIAでGoogleMapを実装したときに引っかかったメモ書き。

①以下のエラーが出たときー

[2010-09-28 01:56:01 - HelloMap] 警告: Application does not specify an API level requirement!

[2010-09-28 01:56:01 - HelloMap] Device API version is 4 (Android 1.6)

[2010-09-28 01:56:01 - HelloMap] Device 'CB511KEFGF' requires that applications explicitely declare themselves as debuggable in their manifest.

[2010-09-28 01:56:01 - HelloMap] Application 'com.kekenzy.map' does not have the attribute 'debuggable' set to TRUE in its manifest and cannot be debugged.


これは以下をmanifestfileに記載すればOK。。

<uses-sdk minsdkversion="4"></uses-sdk>

②ClassNotFoundException

これはプロジェクトの指定をGoogleAPIsにしなかったときに起こった。

GoogleAPIを使うときは、libraryだけもってくるんじゃなくて、プロジェクト作成時にGoogleAPIsで作成しないとだめっぽい。


③uncaught handler thread main exiting due to uncaught exception

XMLのスペルミスでおきることがあるよう。

何かのサンプルでスペルミスしてて、そのまま使用しようとして失敗した。


④実際にAndroidアプリとしてアップしたときに、地図が表示されなかったとき

これは、GoogleMapを正式アプリで使うときは、APIキーも正式版じゃないとだめなため。

やり方は以下を参照

http://android.roof-balcony.com/category/view/mapview/

AndroidでGoogle Mapを使う

GoogleMapAPIを使うと、簡単にアプリに地図を表示できるので便利。
以下使うまでの流れ。


1)Google Maps のKeyを申請
2)Keyを使用してアプリ作成


1)Google Maps のKeyを申請

①証明書のフィンガープリントを作成
keytool -list -keystore "%USERPROFILE%\.android\debug.keystore"

②以下にアクセスし、

 http://code.google.com/intl/ja/android/maps-api-signup.html

①のフィンガープリントを入力指定APIキー取得


2)Keyを使用してアプリ作成
①Google APIsとしてプロジェクトを作成


②レイアウトファイル作成

1)で取得したキーをapiKeyに指定する。

layout/map.xml








③ソースコード作成
Activityはこんな感じ。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map);

MapView mapView = (MapView)findViewById(R.id.mapView);
mapView.setEnabled(true);


MapController controller = mapView.getController();
GeoPoint point = new GeoPoint(latitude,longitude);
controller.setCenter(point);
controller.setZoom(INITAL_ZOOM_LEVEL);

Bitmap arrow = BitmapFactory.decodeResource(getResources(),R.drawable.arrow06);

}

//    private void setOverlay(GeoPoint point){
//
//    }

@Override
protected boolean isRouteDisplayed() {
// TODO 自動生成されたメソッド・スタブ
return false;
}



④AndroidManifest.xmlに権限追加

AndroidManifest.xmlに以下を追加
・users-library "com.google.android.maps"
・users-permission "android.permission.INTERNET"











Android Elipseでのデバッグモード

Eclipseをステップ実行するには「AndroidManifest.xml」のandroid:debuggable="true"
にすればよい。


icon="@drawable/couponpon_icon3"
label="@string/APP_NAME"
debuggable="true">



あとは、実行->デバッグの構成のAndroidアプリケーションに新規でデバッグを
追加し、ターゲットを指定すればOK。