Android‎ > ‎

覚書

目次

  1. 1 OpenWnnの内部辞書
  2. 2 ローカルフォルダ名からパッケージ名だけ入れ替える。
  3. 3 独自ライブラリの作成
  4. 4 試験的な例外の入れ方
  5. 5 MACアドレスの取得
  6. 6 アクティビティ間のプロセス間通信
  7. 7 OS1.6のプリファレンスアクティビティの格納場所
  8. 8 mopitaマーケット
  9. 9 モジュールを他のパッケージに移動するときの作業
  10. 10 BIND_INPUT_METHODパーミッションのサービスは・・・
  11. 11 Activity以外でWindowを表示させるには
  12. 12 タッチ時の接地面積を求める
  13. 13 起動画面のGoogle検索入力におけるBACKキーの検出
  14. 14 setOnTouchListenerでACTION_UPが反 応しない オプション
  15. 15 半透明の背景
  16. 16 非互換API情報
  17. 17 プリファレンスへの書き込みがアプリケーション管理のデータ保存量に反映されない
  18. 18 New > "Android Project" が表示されない
  19. 19 日本語文字列リソースを編集した結果起きた現象。
  20. 20 ViewSwitcher.ViewFactoryのインポート参照が解決しない
  21. 21 obtainStyledAttributesの参照が解決している理由が不明
  22. 22 Genericタイプからの派生実験
  23. 23 TwoLineListItemの使い方
  24. 24 アプリの再インストールを検知する方法
  25. 25 アクティビティのライフサイクルにおける検索ダイアログの影響
  26. 26 ExpandableListViewについての解説
  27. 27 SimpleCursorTreeAdapterについての解説
  28. 28 OnPauseの問題
  29. 29 Fileクラスメソッド
  30. 30 OBBファイル解析
  31. 31 Contextクラスの外部アクセス関連メソッド
  32. 32 Contextクラスのデーターベース関連メソッド
  33. 33 ApplicationInfo
  34. 34 Contextクラスのメソッド一覧
  35. 35 コンテンツプロバイダ
  36. 36 共有すべきファイルの保存
  37. 37 対象CPU
  38. 38 ListView
  39. 39 AppiDemos


まとめる前のメモを記述します。




OpenWnnの内部辞書



そろそろ、なにか書かないとというけどつまってますので、そんなネタ。
Android 上には日本語入力としてOpenWnnがついてます。
Openってプレフィックスなのでソースコードは公開されておりライセンスもApacheです。
そんなOpenWnnですが、実際の使ってみるとちょとしょぼい、ですのでちょと中身をのぞいてみました。
まずは日本語入力といえば辞書にどれだけ語彙か入っているかというのがポイントです。
OpenWnnの辞書は、C のバイナリ配列になっていてアクセス関数もCで作られたもので呼び出します。
AndroidはJavaがメインですが、ライブラリ化していてJNI経由での呼び出しとなっています。
libWnnJpnDic/WnnJpnDic.c ここに dic_01_data - dic_07_data までありこれを配列
dic_data としてあります。
あと con_01_data が配列 con_data にあります。
各データの中身を見てみます。
先頭が 0x4e,0x4a,0x44,0x43 で始まっていますがこれはアスキーコードで NJDC これは配列末尾にもあり辞書の識別子です。
フォーマットはどうだろうということでアクセス関数の実装を調べてみます。
辞書のアクセス部分の実装は libs/libwnnDictionary/engine にある c のファイルをみることになります。
ndapi.c が辞書アクセスAPIとなっており、njd_check_dic で上の識別子のチェックやバージョンなどをみています。
このあたりで、辞書にはさらに種別がいくつかあることがわかります。
実際、上記の dic_01_data - dic_07_data con_01_data
を上記の関数でしらべてみるとトータル8万語って、やはりちょっと少ないです。
品詞体系は 251 x 294 ということで、IMEの品詞体系というよりはmecabとか形態素辞書の品詞体系でしょうか?
でもmecabのmatrix.defは1300くらいだったので、比較するとだいぶコンパクトです。
というかmecabの辞書をそのまま突っ込んだら動きそうな作りですけど、チャレンジャーいませんかね?



IS01のユーザー辞書

2chでCSVからユーザー辞書を取り込めるツールを作る、
と言ったは良いけど、土日で形にできなかったので、
分かっている範囲でフォーマット情報を開示しておきます。

ツール作ろうって方は参考にしてください。
参考にした資料もありますが、あくまで個人で解析した結果で、
正しいものとは限りませんが…

バックアップされる4つのファイルのうち、
ユーザー辞書は拡張子がudcの2つ、頭がEの方は英語のもの
拡張子がldcのものは学習辞書

全体ではヘッダ、インデックス、単語ブロックの繰り返し、フッタの形になっています。

ヘッダ
00000000~00000004:[NJDC]識別子
0000000F~0000000F:ヘッダを覗いたファイルサイズ?(104508)
00000020~00000023:単語ブロックの開始位置(2076)
00000026~00000027:登録されている単語の数
00000028~00000029:単語ブロックの数(500)
00000034~00000035:登録されている単語の数(00000026~00000027と同じ)
00000036~00000037:最後に編集した単語ブロックの位置
0000003C~0000003F:インデックス1のアドレス(72)
00000040~00000043:インデックス2のアドレス(1074)

インデックス
インデックス1は読み、インデックス2は表記の昇順で、
単語ブロックの位置が2バイトずつ500個並んでいる
最後に2バイト00がついていて、それぞれ1002バイト

単語ブロック
1ブロック205バイト*500ブロック
00000000~00000002:01 63
00000003~00000003:読みのバイト数
00000004~00000004:32
00000005~00000005:表記のバイト数&0x80
00000006~ :読み、表記が詰めて設定されている
読み、表記はそれぞれ最大100バイト
文字コードはUNICODE

フッタ
[NJDC]識別子

・途中の単語を削除した場合、詰められずに空きができ、
次に登録されたものがそこに入るみたい。
・必要かどうかはわからないけど、絵文字も設定できる。
(標準の登録画面からはクリップボードから貼り付け無いと無理)



WIKI    WILLCOM/WX310K/DICTIONARY



全体はおよそ3つのパートに分かれている 

  • 前部はバイナリとなっており、いくつかのブロックに分かれるがごく一部を除いて不明
    • 00002C-2E:辞書本体の先頭アドレス(027CC2)
    • 000053-55:辞書本体の次のデータの先頭アドレス(0785BB)
    • チェックサムの類は含まれていない(一部を書き換えて有効だったため)
    • 他機種の辞書を入れた時の動作からみて、この領域は予測変換用か?
  • 中央部は辞書本体。読みと変換結果が読みのあいうえお順に並ぶ
  • 後部はバイナリで、辞書本体へのポインタが3バイトごとに並んでいる
  • 番地0785BBから終端記号"NJDC"の直前までが、すべて変換した単語への相対ポインタで、変換した単語の文字コード順に並んでます(3バイトずつ)。

辞書本体は{変換結果1,変換結果2,...,変換結果n,読み}という並び。 

  • 読みは文字の並びをコード化したもの(01からアスキーコード順「ぁあぃい…」に対応)
  • ([3バイト][漢字])の繰り返し+読み仮名というデータの並びで、[3バイト]の最初のバイトが0x80以上なら、漢字の次に読み仮名、そうでないなら次の漢字以降に読み仮名。3バイト目が0xabとするとa/2が漢字の文字数、bが読み仮名の文字数。
    • アルファベットの候補もあるので、a/2を文字数とするのではなく、aを変換後の文字のバイト数として扱うべき。
    • 1バイト目の最上位ビットは漢字の次に読み仮名が含まれる事を示すフラグ。
    • 1バイト目の最上位から2ビット目はカタナカの候補である事を示すフラグ、このフラグが1の場合、変換後の文字列は読みから求まるので存在していない(変換後の文字のバイト数が0となる)。
  • あと、2バイト目は品詞っぽい?0x3Cだと名前、0x36だと普通名詞?
  • 2バイト目には(文字数が16バイト以上になった場合のために)3バイト目の情報がある程度含まれるかも
    • 2バイト目の最下位ビットをtとした時に、t-16+aを変換後の文字のバイト数として扱うと、現在の辞書に含まれる全ての文字を復元できた。
  • 単語長・読み長共に0のものは平仮名のままの候補
    • 正確には、変換後の文字のバイト数が0、かつ、カタカナフラグが立っていない場合に平仮名のままの候補となる。読み長が0である事は必須条件ではない。



・ヘッダ部(0x0000-0047) 
0x0000-0003 NJDC 
0x0005 02 (A-Wnnのバージョン?) 
0x000C-000F ヘッダ部を除いたサイズ 
0x0020-0023 辞書本体の開始アドレス 
0x0024-0027 辞書本体の登録単語数 
0x0028-002b 辞書本体の使用テーブル数 
0x0034-0035 辞書本体の登録単語数(0x0024-0027と同じ) 
0x0036-0037 辞書本体のテーブル番号の上限(0x0028-002bより1少ない) 
0x003C-003F インデックス1の開始アドレス 
0x0040-0044 インデックス2の開始アドレス 

・インデックス1 
2バイトずつ単語のテーブル番号が入っている。読み仮名のアスキー順にソート 

・インデックス2 
2バイトずつ単語のテーブル番号が入っている。変換後の単語のアスキー順にソート 

・辞書本体 
32バイトずつテーブルになっている。 
81 63 [読み仮名のバイト数] 32 [変換後の単語のバイト数 & 0x80] [読み仮名] [変換後の単語] 

こんな感じです。 

そしてA5502K形式では、いくつかの数字が異なる他、ヘッダ部の0x0038-0047とインデックス2がありません。 






ローカルフォルダ名からパッケージ名だけ入れ替える。


     File file = context.getFilesDir();
    String packageName = context.getPackageName() ;
    String [] p = file.getAbsolutePath().split(File.separator) ;
    String name = "" ;
    for( String a : p )
    {
    if(a.length()==0) continue ;
    if(a.equals(packageName))
    {
    a = "com.cobsproducts.cobime.pm" ;
    }
    name+= File.separator + a ;
    }
file = new File( name+ File.separator + "key.bin" ) ;




独自ライブラリの作成


Androidでライブラリプロジェクトを作成する


手順をメモ。

  • Androidプロジェクト作成
    • 新規→Androidプロジェクト選択
    • Create Activity:チェック外す
  • プロパティ設定
    • TestLibで右クリック→プロパティー→Android→Is Libraryにチェックいれる
    • default.propertiesで右クリック→リフレッシュ選択(非同期といわれてしまうため)
  • (ライブラリに含めるソースファイルを作成する)
  • マニフェストファイル設定
  • 不要なリソース関連フォルダ、ファイルを削除
    • resフォルダの中(iconやlayoutなど)を全て削除 →resフォルダは消さない。
    • gen-com.testにあるR.javaを削除
アプリとの参照関係
  • 連携するアプリのプロジェクトのプロパティ (Properties) を表示
  • Android > Library > Add..ボタン
  • ライブラリを指定 > OKボタン
  • OKボタン
→特にいらない

試験的な例外の入れ方


こう書くとthrowの後の実行文がエラーになるので、


try
{
    throw new Exception() ;
    a=1 ;  // エラー
}
catch( Exception e )
{
}


こう書く。警告のみ。


try
{
    if(true)
    {
        throw new Exception() ;
    }
    a = 1 ;
}
catch( Exception e )
{
}






MACアドレスの取得


WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
WifiInfo info = wifi.getConnectionInfo();
String macAddress = info.getMacAddress();

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>







<blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div class="sites-codeblock sites-codesnippet-block;" style="line-height:1.5;font-size:10pt"><pre><code>

</code></pre></div></blockquote>



アクティビティ間のプロセス間通信


キーワード
  • AIDL
  • Binder


OS1.6のプリファレンスアクティビティの格納場所


Android OS1.6では、プリファレンスアクティビティをパッケージのサブフォルダに置いてはいけない。
起動されない。




mopitaマーケット




モジュールを他のパッケージに移動するときの作業

ファイル名の変更
refacter > rename...で行う。

package文
→ Eclipse上でコピーすれば、自動的に行われる。

AndroidManifest.xml
<manifest>タグの package属性
<service>タグの android:name属性
→実在するクラス名にする。

JNI
メソッド名に含まれるパッケージ名の変更
android-ndk-???/Appsに新規アプリケーションを追加
NDK中のapplication.mkの作成
ビルド  make APP=new_app (android-ndk-???直下で実行)





BIND_INPUT_METHODパーミッションのサービスは・・・

  • システムはこのパーミッションがないサービス(IME)を起動しない・・・
  • サービスからIntentによるアクティビティの起動は可能だが、終了待ちは出来ない。
  • ActivityからサービスにIntent経由でデータを渡す手段は無い・・・
  • startService、bindServiceはパーミッションではじかれる。AndroidManifestにBIND_INPUT_METHODを追加しても。
      →システム以外からはアクセス出来ない仕様らしい・・・
    07-19 10:08:16.155: ERROR/AndroidRuntime(2687): java.lang.SecurityException: Not allowed to start service Intent { cmp=com.example.imesample/.ImeSample (has extras) } without permission android.permission.BIND_INPUT_METHOD
  • サービス内でダイアログやビューを表示できない・・
    →IBinderクラス情報が隠されているため。(IBinderクラスのインスタンスがnullで以下のエラー)
  • 07-19 22:57:52.996: ERROR/AndroidRuntime(4620): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application




Activity以外でWindowを表示させるには


WindowManagerImplを使うらしい・・・







タッチ時の接地面積を求める



GDDフォンにApiDemoをインストールして遊んでいるうちに、Touch Paintが面白い処理をしていることに気づいた。

押す力が弱くても強くてもあまり差はない。これは、Dev ToolsのPointer Locationで表示されるPressureの値が0 - 0.7くらいでしか変化せず、しかも割と指数関数的な反応をするので、そんなもんだろう。で、これ。


上は指先でドラッグしたとき。下は親指の腹でぐいっと払ったとき。つまり指の接地面積を知ることができるようだ。TouchPaintのコードでは、

        @Override public boolean onTouchEvent(MotionEvent event) {
            int action = event.getAction();
            mCurDown = action == MotionEvent.ACTION_DOWN
                    || action == MotionEvent.ACTION_MOVE;
            int N = event.getHistorySize();
            for (int i=0; i<N; i++) {
                //Log.i("TouchPaint", "Intermediate pointer #" + i);
                drawPoint(event.getHistoricalX(i), event.getHistoricalY(i),
                        event.getHistoricalPressure(i),
                        event.getHistoricalSize(i));
            }
            drawPoint(event.getX(), event.getY(), event.getPressure(),
                    event.getSize());
            return true;
        }

となっていて、event.getHistoricalSize(), event.getSize()でfloat値が返ってくるようだ。APIのドキュメント*1では

Returns a scaled value of the approximate size, of the area being pressed when touched with the finger. The actual value in pixels corresponding to the finger touch is normalized with the device specific range of values and scaled to a value between 0 and 1. The value of size can be used to determine fat touch events.

0 - 1で正規化された値となっている。デブタッチ検出に使ってくれとのこと。


なにに使えるかと言えば、書道とか面白そうだけど、それよりもタッチされた位置を点で検出するのでなく、面積の重なり具合で当たり判定すると、より人間臭い処理ができるんじゃないかと思うわけで。


起動画面のGoogle検索入力におけるBACKキーの検出


1.6
onKeyDownで検出される

2.1以上
onKeyDownで検出されない





setOnTouchListenerでACTION_UPが反 応しない オプション


こんばんは、CLERKです。 
onTouch で自分で処理した場合は、「true」を返す必要があります。 
「return false」としていますが「return true」にして下さい。 
「false」を返した場合は、フレームワークの中でViewツリーに従って以降の 
Viewにイベントが流れていきます。 
この場合、DOWN処理を行い true を返した他のViewに対してUPイベントが流れ 
てきます。 
「true」を返した場合は、自ら処理した事となり処理したView移行へはイベント 
が流れません。 
この場合、trueを返したViewにUPイベントが流れてきます。 
On 10月25日, 午後7:26, Stone <ish...@cap.bekkoame.ne.jp> wrote: 

http://groups.google.com/group/android-group-japan/browse_thread/thread/b1e5200b82c738f8/acd4343a5da510ee?pli=1


半透明の背景

Paint#setAlpha()とsetColor()の順番

メモAndroidのPaint#setAlpha()とPaint#setColor()は順番を守らないとsetAlpha()の設定が無効になってしまう。

        // 半透明の背景
        p.setColor(Color.BLACK) ;
        p.setAlpha(128) ;
        c.drawRect( new RectF(0, 0, width, height), p ) ;
        p.setAlpha(255) ;
        
これは、setColorで設定する色に、Alphaが含まれているため。



スクリーン座標の論理⇒物理変換

        int logicalSize = 10 ;   // 10mm
        DisplayMetrics metrics = context.getResources().getDisplayMetrics() ;
        pixelSize = (int)( TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, logicalSize, metrics)+0.5f) ;



View.onMeasure でウィンドウサイズを取得

onMeasure内でView.MeasureSpec.getSizeでウィンドウサイズを取得

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
int x = View.MeasureSpec.getSize( widthMeasureSpec ) ;
int y = View.MeasureSpec.getSize( heightMeasureSpec ) ;
                // ToDo:  Measure dimension here.
                setMeasuredDimension(resolveSize(x, widthMeasureSpec), resolveSize(y, heightMeasureSpec)); 
}


非互換API情報

プリファレンス   

API 11 より フラグメントへ移行
PreferenceActivity.getPreferenceManager () 等。
People

AbsoluteLayout

全API レベルにおいて推奨されない。(使うことはできる)
Use FrameLayoutRelativeLayout or a custom layout instead.


public void String.getBytes (int start, int end, byte[] data, int index)

This method is deprecated.
Use getBytes() or getBytes(String)


コンテンツプロバイダからカーソルを取得
  • CursorLoader - コンテンツプロバイダからクエリを行うクラス (Since API 11)

// Since API 11
CursorLoader cl = new CursorLoader(this, Phone.CONTENT_URI, null, null, null, null);
Cursor c = cl.loadInBackground() ;



プリファレンスへの書き込みがアプリケーション管理のデータ保存量に反映されない

Galaxy S
強制停止するとプリファレンスの内容が消える
電源をOFFにするとプリファレンスの内容が消える
キャッシュで管理されてる?
HT-03A + AppWidgetSample はOK。


New > "Android Project" が表示されない

インストール直後。




日本語文字列リソースを編集した結果起きた現象。

AppFramework1
res/values-ja/strings.h

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="menu_help">ヘルプ</string>
    <string name="menu_setup">設定</string>
    <string name="hello">Hello World, Application Framework 1 !</string>
    <string name="app_name">AppFramework1</string>
    Hello World, Application Framework 1 !
    <string name="pref_category1">カテゴリ1</string>
    Hello World, Application Framework 1 !
    <string name="pref_1_1_key">item_1_1</string>
    Hello World, Application Framework 1 !
    <string name="pref_1_1_title">項目1-1</string>
    Hello World, Application Framework 1 !
    <string name="pref_1_1_summary">これはチェックボックスのプリファレンスです。</string>
</resources>




ViewSwitcher.ViewFactoryのインポート参照が解決しない

ViewSwitcher.ViewFactoryのインポート参照が自動的に解決しない場合があります。

この場合は、以下のインポート文を手動で記述します。


import android.widget.ViewSwitcher;



obtainStyledAttributesの参照が解決している理由が不明


以下のようなコードにおいて、obtainStyledAttributesはBaseAdapterの関連メソッドではないにも関わらず、参照できている。その理由が不明。

    public class ImageAdapter extends BaseAdapter 
    {
        private Context context ;


        public ImageAdapter(Context context) 
        {
            this.context = context ;

            TypedArray a = obtainStyledAttributes(R.styleable.GallerySample);
            a.recycle();
        }
    }




SimpleDateFormatクラス・・・時間を指定書式に加工するクラス
http://developer.android.com/intl/ja/reference/java/text/SimpleDateFormat.html


Genericタイプからの派生実験

serialVersionUID って何?

    public class a extends HashMap<String,String>
    {

        /**
         * これを入れろとサジェストされた。
         */
        private static final long serialVersionUID = 1L;
    }
    


TwoLineListItemの使い方


http://d.hatena.ne.jp/rso/20110114/1295018140




アプリの再インストールを検知する方法

http://d.hatena.ne.jp/ekrea/20101023/1287845881




アクティビティのライフサイクルにおける検索ダイアログの影響

検索ダイアログは、画面のトップに浮かぶ Dialog である。それはアクティビティスタックの中にどんな変化も起きない。だから、検索ダイアログが表示されたら、onPauseのようなライフサイクルは呼ばれない。入力フォーカスは検索ダイアログに与えられるので、アクティビティが入力フォーカスを失なう。

もし検索ダイアログがアクティベートされたときに通知が欲しければ、onSearchRequested()メソッドをオーバーライドしなさい。システムがこのメソッドを呼ぶとき、それはアクティビティが検索ダイアログへの入力フォーカス失っていることを示しているので、ゲームを一時停止するような、イベントに適したどのような作業もできる。後述の検索コンテキストデータを渡している場合を除き、スーパークラス実装を呼ぶことによってそのメソッドを終了すべきである。例えば、

@Override
public boolean onSearchRequested() {
    pauseSomeStuff
();
   
return super.onSearchRequested();
}

ユーザーがBACKボタンによって検索をキャンセルする場合、検索ダイアログはクローズし、アクティビティは入力フォーカスを取り戻す。 setOnDismissListener() と setOnCancelListener() の両方かどちらかがクローズされるときの通知を登録できる。あなたは唯一OnDismissListener を登録する必要がある。なぜならば、検索ダイアログが閉じるたびに呼ばれるからである。OnCancelListenerは、そのユーザーが明示的に検索ダイアログを終了したイベントのみに関係する。なので、それは検索が実行されたときには呼ばれない(この場合、検索ダイアログは自然に消滅する)。

もしカレントアクティビティがsearchableアクティビティでない場合、通常のアクティビティライフサイクルイベントは、ユーザーが検索を実行する度にトリガーされる。(Activitiesドキュメントに記述されているように現在のアクティビティが onPause() 等を受信する)。しかしながら、カレントアクティビティは searchableアクティビティならば、2つの事のうちの一つが起こる。

  1. デフォルトでは、searchableアクティビティはonCreateへのコールとともにACTION_SEARCHインテントを受信する。そして新しいアクティビティのインスタンスは、アクティビティスタックのトップに持っていかれる。現在、アクティビティスタックの中に2つのsearchableアクティビティインスタンスがある。(なので、BACKボタンを押すと、終了する検索のアクティビティではなく、検索アクティビティの前のインスタンスに戻る)
  2. android:launchModeを"singleTop"に設定した場合、そのときsearchableアクティビティは新しいACTION_SEARCHを渡すonNewIntent(Intent)へのコールとともにACTION_SEARCHインテントを受信する。例えば、これは searchableアクティビティのラウンチモードが"singleTop"である場合の処理方法である。
@Override
public void onCreate(Bundle savedInstanceState) {
   
super.onCreate(savedInstanceState);
    setContentView
(R.layout.search);
    handleIntent
(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    setIntent
(intent);
    handleIntent
(intent);
}

private void handleIntent(Intent intent) {
   
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
     
String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch
(query);
   
}
}

Performing a Search についてのセクションにおける例題コードと比べると、onCreateとonNewIntent()の両方がそれを実行できるように検索インテントを処理するためのすべてのコードは、現在、handleIntent() メソッドの中にある。システムがonNewIntent(Intent)を呼ぶとき、アクティビティは、すでに再スタートしているので、getIntent()メソッドはonCreate()で受信されたのと同じインテントを返す。これがonNewIntent(Intent)内部でsetIntent(Intent)を呼ぶべき理由である。(アクティビティによって保存されたインテントが将来的にgetIntent()を呼ぶケースにおいて更新されるように)


"singleTop"ラウンチモードを使う2番目のシナリオは、通常、最適である。なぜならば、一度の検索が優れている可能性があるからである。ユーザーが追加の検索を行い、そして、もしあなたのアプリケーションがsearchableアクティビティの複数のインスタンスを作成するなら、それは悪い経験である。だから、我々は、アプリケーションマニフェストにおいて、searchableアクティビティに"singleTop"ラウンチモードをセットすることを推奨する。例えば、

<activity android:name=".SearchableActivity"
         
android:launchMode="singleTop" >
   
<intent-filter>
       
<action android:name="android.intent.action.SEARCH" />
   
</intent-filter>
   
<meta-data android:name="android.app.searchable"
                     
android:resource="@xml/searchable"/>
 
</activity>



ExpandableListViewについての解説

垂直スクロールし、2レベルのリストによって項目を表示するビューです。その子供を表示するためにグループを展開表示できる、2レベル表示が可能な点においてListViewとは異なります。項目は、このビューに関連する ExpandableListAdapter で持ってくることができます。

折りたたみ可能なリストは、項目の脇に現在の状態を表示するインジケーターを表示することができます。状態には、通常、展開されたグループ、折りたたまれたグループ、子供、もしくは最後の子どもの1つがあります。それらのインジケータをセットするには、setChildDivider(Drawable childDivider) もしくはsetGroupIndicator(Drawable groupIndicator)を使います。(各Drawableが持つことのできる追加的な状態を知る方法については、文書を参照)  ExpandableListView のデフォルトスタイルではExpandableListViewに与えられたビューの隣に表示するインジケータを与えます。SimpleCursorTreeAdapter とともに使われる レイアウトの android.R.layout.simple_expandable_list_item_1 とandroid.R.layout.simple_expandable_list_item_2には、インジケータの適切な位置情報を含みます。

ExpandableListView によってセットされたコンテキストメニューは、getPackedPositionType(long packedPosition) やその他の同様な方法で使用できるパックされた位置 packedPositionとともにExpandableListView.ExpandableListContextMenuInfoオブジェクトになります。

Note:

親のサイズが厳密に指定されない場合、XMLでExpandableListView のandroid:layout_height属性としてwrap_content 値を使用しできません。例えば、親がScrollViewの場合、それはまたどんな長さにでもできるのでwrap_contentを指定できません。しかしながら、ExpandableListView の親が100pixelのようなサイズが指定されていれば、wrap_contentを使用できます。

SimpleCursorTreeAdapterについての解説

XMLファイルに定義されたTextViewやImageViewへのカーソル空のカラムをマップするための簡単なアダプターです。あなたが欲するカラムやカラムを表示したいビュー、そしてそれらのビューの外観を定義した XMLファイルを指定出来ます。子やグループのために個別にXMLを用意することが可能です。バインディングは2つのフェーズで起こります。最初は、SimpleCursorTreeAdapter.ViewBinder が存在するとき、setViewValue(android.view.View, android.database.Cursor, int) が起動されます。復帰値が true ならば、バインディングはすでに行われています。復帰値がfalseでバインドするビューがTextViewならば、setViewText(TextView, String) が起動されます。復帰値が false でバインドするビューがImageViewならば、setViewImage(ImageView, String) が起動されます。適切なバインディングが見つからなければ、 IllegalStateException がスローされます。



OnPauseの問題


「Activity pause timeout for HistoryRecord 」は、Androidのsystem processから呼び出した、起動元Actiivty のonPause の応答がない場合にでます。 
Androidでは、onPauseの一定時間応答がない場合は、system processはひとまずtimeoutとして、処理を続行しますので、「Intentに指定したActivityがStart」します。
しかし、起動元のonPauseは、引き続き動作はしており、「Intentに指定したActivityがStart」後にエラーとなるので、このような動作になるのだと思います。

  https://groups.google.com/group/android-group-japan/browse_thread/thread/b9a9d44e54d52f3f?hl=ja&pli=1




Fileクラスメソッド

  • static File createTempFile(String prefix, String suffix) Creates an empty temporary file using the given prefix and suffix as part of the file name.
  • boolean delete() Deletes this file.
  • void deleteOnExit() Schedules this file to be automatically deleted once the virtual machine terminates.
  • boolean equals(Object obj) Compares obj to this file and returns true if they represent the same object using a path specific comparison.
  • boolean exists() Returns a boolean indicating whether this file can be found on the underlying file system.
  • File getAbsoluteFile() Returns a new file constructed using the absolute path of this file.
  • String getAbsolutePath() Returns the absolute path of this file.
  • File getCanonicalFile() Returns a new file created using the canonical path of this file.
  • String getCanonicalPath() Returns the canonical path of this file.
  • long getFreeSpace() Returns the number of free bytes on the partition containing this path.
  • String getName() Returns the name of the file or directory represented by this file.
  • String getParent() Returns the pathname of the parent of this file.
  • File getParentFile() Returns a new file made from the pathname of the parent of this file.
  • String getPath() Returns the path of this file.
  • long getTotalSpace() Returns the total size in bytes of the partition containing this path.
  • long getUsableSpace() Returns the number of usable free bytes on the partition containing this path.
  • int hashCode() Returns an integer hash code for the receiver.
  • boolean isAbsolute() Indicates if this file's pathname is absolute.
  • boolean isDirectory() Indicates if this file represents a directory on the underlying file system.
  • boolean isFile() Indicates if this file represents a file on the underlying file system.
  • boolean isHidden() Returns whether or not this file is a hidden file as defined by the operating system.
  • long lastModified() Returns the time when this file was last modified, measured in milliseconds since January 1st, 1970, midnight.
  • long length() Returns the length of this file in bytes.
  • String[] list() Returns an array of strings with the file names in the directory represented by this file.
  • String[] list(FilenameFilter filter) Gets a list of the files in the directory represented by this file.
  • File[] listFiles() Returns an array of files contained in the directory represented by this file.
  • File[] listFiles(FilenameFilter filter) Gets a list of the files in the directory represented by this file.
  • File[] listFiles(FileFilter filter) Gets a list of the files in the directory represented by this file.
  • static File[] listRoots() Lists the file system roots.
  • boolean mkdir() Creates the directory named by the trailing filename of this file.
  • boolean mkdirs() Creates the directory named by the trailing filename of this file, including the complete directory path required to create this directory.    
  • boolean renameTo(File newPath) Renames this file to newPath.
  • boolean setExecutable(boolean executable) Equivalent to setExecutable(executable, true).
  • boolean setExecutable(boolean executable, boolean ownerOnly) Manipulates the execute permissions for the abstract path designated by this file.
  • boolean setLastModified(long time) Sets the time this file was last modified, measured in milliseconds since January 1st, 1970, midnight.
  • boolean setReadOnly() Equivalent to setWritable(false, false).
  • boolean setReadable(boolean readable) Equivalent to setReadable(readable, true).
  • boolean setReadable(boolean readable, boolean ownerOnly) Manipulates the read permissions for the abstract path designated by this file.
  • boolean setWritable(boolean writable, boolean ownerOnly) Manipulates the write permissions for the abstract path designated by this file.
  • boolean setWritable(boolean writable) Equivalent to setWritable(writable, true).
  • String toString() Returns a string containing a concise, human-readable description of this file.
  • URI toURI() Returns a Uniform Resource Identifier for this file.
  • URL toURL() This method is deprecated. use toURI() and toURL() to get correct escaping of illegal characters.

OBBファイル解析

frameworks/base/tools/obbtool に OBB ファイルを作成するツールがある。ここにある mkobb.sh を見ると、コンテンツ部分のファイルシステムは vfat, 暗号化する場合は twofish らしい。

フィールド名 フィールドサイズ(octet) 説明
signature version 4 footer 形式のバージョン(1)
package version 4 パッケージバージョン(?)
flag 4 OBBファイルのフラグ。現状定義されているのはオーバーレイパッチかどうかのフラグ
salt 8 コンテンツの暗号化に使用されているソルト
package name size 4 パッケージ名のオクテット数(> 0)
package name package name size の値 パッケージ名のUTF-8表現。パッケージ名はオーバーレイに関係する情報か?
footer size 4 footer の先頭から、footer size フィールド直前までのサイズ(> 32)。
footer marker 4 このファイルが OBBファイルであることの目印(0x01059983 で固定)。


Contextクラスの外部アクセス関連メソッド


abstract File getExternalCacheDir() Returns the absolute path to the directory on the external filesystem (that is somewhere on  Environment.getExternalStorageDirectory() where the application can place cache files it owns.
abstract File getExternalFilesDir(String type) Returns the absolute path to the directory on the external filesystem (that is somewhere on  Environment.getExternalStorageDirectory()) where the application can place persistent files it owns.



Contextクラスのデーターベース関連メソッド


abstract String[] databaseList() Returns an array of strings naming the private databases associated with this Context's application package.
abstract boolean deleteDatabase(String name) Delete an existing private SQLiteDatabase associated with this Context's application package.
abstract File getDatabasePath(String name) Returns the absolute path on the filesystem where a database created with  openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory) is stored.
abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) Open a new private SQLiteDatabase associated with this Context's application package.
abstract SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) Open a new private SQLiteDatabase associated with this Context's application package.


ApplicationInfo



String backupAgentName Class implementing the Application's backup functionality.
String className Class implementing the Application object.
String dataDir Full path to a directory assigned to the package for its persistent data.
int         descriptionRes A style resource identifier (in the package's resources) of the description of an application.
boolean enabled When false, indicates that all components within this application are considered disabled, regardless of their individually set enabled status.
int f      lags Flags associated with the application.
String manageSpaceActivityName Class implementing the Application's manage space functionality.
String nativeLibraryDir Full path to the directory where native JNI libraries are stored.
String permission Optional name of a permission required to be able to access this application's components.
String processName The name of the process this application should run in.
String publicSourceDir Full path to the location of the publicly available parts of this package (i.e.
String[] sharedLibraryFiles Paths to all shared libraries this application is linked against.
String sourceDir Full path to the location of this package.
int         targetSdkVersion The minimum SDK version this application targets.
String taskAffinity Default task affinity of all activities in this application.
int         theme A style resource identifier (in the package's resources) of the default visual theme of the application.
int         uid The kernel user-ID that has been assigned to this application; currently this is not a unique ID (multiple applications can have the same uid).


Contextクラスのメソッド一覧




コンテンツプロバイダ


連絡先リストへのアクセス 方法を調べる。


共有すべきファイルの保存

アプリケーションに特化せず、アプリケーションがアンインストールされたときでも削除すべきでないファイルを保存したい場合は、それらを外部保存域の公開ディレクトリのどこかに保存します。それらのディレクトリは Music/Pictures/Ringtones/、およびその他の外部保存域のルートに用意されています。

API レベル 8 またはその上位レベルでは、getExternalStoragePublicDirectory() を使用して DIRECTORY_MUSICDIRECTORY_PICTURESDIRECTORY_RINGTONES などの使用したい公開ディレクトリタイプをそれに渡します。このメソッドは必要に応じて適切なディレクトリを作成します。

API レベル 7 またはその下位レベルを使用している場合は、getExternalStorageDirectory() を使って外部保存域のルートを示すFile をオープンし、その後対象の共有ファイルを以下のディレクトリのいずれかに保存します。

  • Music/ - メディアスキャナーはここで見つかったすべてのメディアをユーザ音楽として分類します。
  • Podcasts/ - メディアスキャナーはここで見つかったすべてのメディアを podcast として分類します。
  • Ringtones/ - メディアスキャナーはここで見つかったすべてのメディアを着信音として分類します。
  • Alarms/ - メディアスキャナーはここで見つかったすべてのメディアをアラーム音として分類します。
  • Notifications/ - メディアスキャナーはここで見つかったすべてのメディアを通知音として分類します。
  • Pictures/ - すべての写真 ( カメラで撮影したものは除く ) 。
  • Movies/ - すべての動画 ( ビデオで録画したものは除く ) 。
  • Download/ - 多種のダウンロードファイル。


対象CPU

  • ARMv5TE
  • ARMv7-A


ListView


ListViewがタップで選択できない。トラックボールではできる。


AppiDemos


App
Activity
Animation
Curstom Dialog
Custom Title
Dialog
Forwarding
Hello World
Persistent State
QuickContactsDemo
Receive Result
Redirection
Reorder Activities
Save & Restore State
SetWallpaper
Translucent
Translucent Blur
Wallpaper
Alarm
Alarm Controller
Alarm Service
Device Admin
Dialog
Intents
Launcher Shortcuts
Menu
Inflate from XML
Notification
IncomingMessage
Notifying Service Controller
NotifyWithText
Status Bar
Preferences
Preferences from XML
Launching preferences
Preference dependencies
Default values
Preferences from code
Advenced preferences
Search
Invoke Search
Query Search Results
Service
Foreground Service Controller
Local Service Binding
Local Service Controller
Messenger Service
Remote Service Binding
Remoe Service Controller
Service Start Arguments Controller
Text-To-Speech
Voice Recognition

Content
Assets
Read Asset
Resources
Resources
Styled Text
Storage
External Storage

Graphics
AlphaBitmap
AnimateDrawbles
Arcs
BitmapDecode
BitmapMesh
BitmapPixels
CameraPreview
Clipping
ColorFilters
ColorMatrix
Compass
CreateBitmap
Density
Drawble
FingerPaint
Layers
MeasureText
OpenGL ES
PathEffects
PathFillTypes
Patterns
Pictures
Points
PolyToPoly
PurgeableBitmap
Regions
RoundRects
ScaleToFit
SensorTest
SurfaceView Overlay
Sweep
Text Align
Touch Paint
Typefaces
UnicodeChart
Vertices
Xfermodes

Media
MediaPlayer
VideoView
OS
Morse Code
Sensors
SMS Messaging
Text
Linkify
LogTextBox
Marquee
Views
Animation
3D Transition
Interpolators
Push
Snake
Auto Complete
Screen Top
Screen Botoom
Scroll
Contacts
Contacts with Hint
Multiple items
Buttons

Chronometer
Controls
Light Theme
Default Theme
Custom

Date Widgets
Dialog
Inline
Expandable Lists
CustomAdapter
Cursor (People)
Simple Adapter
Focus
Vertical
Horizontal
Circular
Internal Selection
Gallery
Photos
People
Grid
Icon Grid
Photo Grid
ImageButton
ImageSwitcher
ImageView
Layout Animation
Grid fade
List Cascade
Reverse Order
Randomize
Grid Direction
Wave Scale
Nested Animations
Layouts
Baseline
LinearLayout
RelativeLayout
ScrollView
TableLayout
Lists
Array
Cursor (People)
Cursor (Phones)
ListAdapter
Separators
ListAdapter Collapsed
Cursor (Phones)
Photos
Array (Overlay)
Single choice list
Multiple choice list
Transcript
Slow Adapter
Efficient Adapter
Progress Bar
Incremental
Smooth
Dialogs
In Title Bar
Radio Group
Rating Bar
ScrollBars
Basic
Fancy
Style
Seek Bar
Spinner
Tabs
Content By Factory
Content By Id
Content By Intent
TextSwitcher
Visibility
WebView






Comments