2012年8月20日月曜日

EclipseでAndroid Support Library のソースを見られるようにする

Android Support Library のソースは(SDK ManagerでDLしていれば)
<android-sdk-dir>/extras/android/support/v4/src にある。

Eclipseで見れるようにするにはこれをattachすれば良いだけ。
 ・・・のはずが、ADT20では正攻法ではできない。 

 解決策は
libs/android-support-v13.jar.properties
なるファイルを作り、この中に下記の様に1行書く。

src=<android-sdk-dir>/extras/android/support/v4/src

あとは、プロジェクトを閉じる⇛開くするだけ。
これでソースが見れるようになる。

参考:http://code.google.com/p/android/issues/detail?id=28658


2012年8月14日火曜日

非root環境でADB経由でアプリを終了する

アプリをADB経由で終了するには
adb shell kill <PID>
とすれば良い。

しかし、これにはroot権限が必要なので、非root端末には使えない。

だが非root端末でも、ユーザーがアプリ情報画面から強制終了ボタンを押せば終了することはできる。
以下は、それをmonkeyrunnerで実施するコードだ。

UIを占有する必要があるが、一応アプリを終了する事ができる。

monkeyrunner killhoge.py

from com.android.monkeyrunner import (
        MonkeyRunner, MonkeyDevice, MonkeyImage )
import time

device = MonkeyRunner.waitForConnection()

#対象のアプリのパッケージ名
package = 'com.sample.hoge'

#強制終了ボタンの位置と、OKボタンの位置。デバイス依存
exitButton = [130, 180]
okButton = [130, 550 ]

#アプリ情報画面を呼び出し
device.startActivity(
        action='android.settings.APPLICATION_DETAILS_SETTINGS',
        uri='package:'+package)
time.sleep(1)
device.touch( exitButton[0], exitButton[1], MonkeyDevice.DOWN_AND_UP)
time.sleep(1)
device.touch( okButton[0], okButton[1], MonkeyDevice.DOWN_AND_UP)


2012年8月1日水曜日

Androidでキーボードが表示された時のイベントを発生させる

Androidにはソフトウェアキーボードの表示/非表示のを検出するようなイベントは用意されていない。
調べてみると、ソフトウェアキーボードが表示された時にActivityのサイズが変わることを使ってそのON/OFFを検知するのが一般的なようだ。

ありがたいことに、以下のページで、ソフトキーボードの表示/非表示を検出するクラス(DetectableKeyboardEventLayoutクラス)が公開されている。
Android のソフトウェアキーボード表示・非表示を検出する

このDetectableKeyboardEventLayoutクラスはLinearLayoutを継承しているので、キーボードのON/OFFを検知するクラスのレイアウトのルートにこのクラスを挿入してやれば簡単にキーボード表示/非表示時のイベントを取得できる。


<package.DetectableKeyboardEventLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:id="@+id/root" >
  <!-- main layout -->
</package.DetectableKeyboardEventLayout>
DetectableKeyboardEventLayout root = (DetectableKeyboardEventLayout)findViewById(R.id.root);
root.setKeyboardListener( new KeyboardListener() {

    @Override
    public void onKeyboardShown() {
        Log.d(TAG, "keyboard shown");
    }

    @Override
    public void onKeyboardHidden() {
       Log.d(TAG, "keyboard hidden");
    }
});