2013年12月26日木曜日

ステップディテクタ「Sensor.TYPE_STEP_COUNTER」を使ってみる

歩数計"TYPE_STEP_COUNTER"に続き、"TYPE_STEP_DETECTOR"です。 こちらは歩数ではなく、Stepと判定したタイミングで通知を受けます。
http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_STEP_DETECTOR


Initialize Sensor

SensorManagerを使い、Sensorオブジェクトを取得します。
public class StepCounterActivity extends Activity {
    private SensorManager mSensorManager;
    private Sensor mStepSensor;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_step);

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mStepSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);

    }

    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mSensorEventListener, mStepSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(mSensorEventListener);
    }


Create a SensorListener

トリガーはonSensorChangedのコールバックメソッドで取得します。
Stepが発生したタイムスタンプとevent.values[0]に1.0fが格納されています。

    private SensorEventListener mSensorEventListener = new SensorEventListener() {
        private int mStep;

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.values[0] == 1.0f) {
                mStep++;
            }
            mTextView.setText(Integer.toString(mStep));
        }
    };

2013年12月25日水曜日

歩数計「Sensor.TYPE_STEP_COUNTER」を使ってみる

API 19でSensorに歩数計"TYPE_STEP_COUNTER"が追加されました。

http://developer.android.com/reference/android/hardware/Sensor.html#TYPE_STEP_COUNTER


Initialize Sensor

SensorManagerを使い、Sensorオブジェクトを取得します。
public class StepCounterActivity extends Activity {
    private SensorManager mSensorManager;
    private Sensor mStepSensor;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.text_step);

        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        mStepSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

    }

    protected void onResume() {
        super.onResume();
        mSensorManager.registerListener(mSensorEventListener, mStepSensor,
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    protected void onPause() {
        super.onPause();
        mSensorManager.unregisterListener(mSensorEventListener);
    }


Create a SensorListener

歩数はonSensorChangedのコールバックメソッドで取得します。
値はevent.values[0]に格納されています。
端末機起動後から計測した歩数の値を返します。0に戻るときは端末再起動時だけです。

    private SensorEventListener mSensorEventListener = new SensorEventListener() {
        private float mStepOffset;

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (mStepOffset == 0) {
                mStepOffset = event.values[0];
            }
            mTextView.setText(Float.toString(event.values[0] - mStepOffset));
        }
    };

2013年11月17日日曜日

何気なく使っているFramework PrintManager

Android 4.4 KitKatoから追加されたPrint機能。

※調査する時間が取れず、中途半端ですが一旦公開します。


確認しておいた方がいいソース

Print機能を構成するパッケージが4つに分かれています。
すべて重要なので、確認しておきましょう。

\frameworks\base\core\java\android\print
PrintManager.java
IPrintSpooler.aidl

\frameworks\base\core\java\android\printservice
PrintService.java
PrinterDiscoverySession.java
IPrintService.aidl

\frameworks\base\packages\PrintSpooler\src\com\android\printspooler
PrintSpoolerService.java

\frameworks\base\services\java\com\android\server\print
PrintManagerService.java
RemotePrintService.java
RemotePrintSpooler.java
UserState.java



簡易クラス図

2013年11月3日日曜日

Andoird 4.4 KitKat StatusBarの変更点(基本設計編)



システムよりの確認です。


SystemServerをみる

config.disable_systemuiの設定次第で、ステータスバーを非表示にできる。

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/services/java/com/android/server/SystemServer.java
 
        boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);

            if (!disableSystemUI) {
                try {
                    Slog.i(TAG, "Status Bar");
                    statusBar = new StatusBarManagerService(context, wm);
                    ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
                } catch (Throwable e) {
                    reportWtf("starting StatusBarManagerService", e);
                }
            }


SystemUiをみる

そもそも、Tablet用のフォルダがなくなった。すでに、JBでは使われていなかった。(※Nexus系の端末)

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/packages/SystemUI/src/com/android/systemui/statusbar/

TV用は?

相変わらず、スケルトン。モジュールの定義のみ。

https://android.googlesource.com/platform/frameworks/base/+/android-4.4_r1/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java

2013年11月2日土曜日

4.4 KitKatの表示レイヤーについて


android-4.4_r1がAOSP上で公開されました。
毎度おなじみの表示レイヤーのチェックを行いました。

確認OSバージョン

android-4.4_r1 KitKat

表示レイヤー

OSのメジャーアップデートなので、表示レイヤーの変更点があるかどうか確認しました。
ソース
android-4.4_r1/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
(★ = 4.4_r1にて新規追加されたレイヤー)
レイヤー名用途
1TYPE_UNIVERSE_BACKGROUND
2TYPE_PRIVATE_PRESENTATION
2TYPE_WALLPAPER壁紙
3TYPE_PHONE着信などの電話用
4TYPE_SEARCH_BAR検索バー
5TYPE_RECENTS_OVERLAY履歴
5TYPE_SYSTEM_DIALOG電源OFFダイアログなどのシステムダイアログ
6TYPE_TOASTトースト表示
7TYPE_PRIORITY_PHONESIMエラー表示など
8TYPE_DREAMDream用レイヤー
9SYSTEM_ALERT_LAYERANRやLowバッテリー通知
10TYPE_INPUT_METHOD文字入力UI
11TYPE_INPUT_METHOD文字入力UIのダイアログ
12TYPE_KEYGUARD_SCRIM★keyguardが起動するまでの間、Keyguardの後ろに表示する
13TYPE_KEYGUARDキーガード表示
14TYPE_KEYGUARD_DIALOGシャットダウン中やSIMロック表示、キーガード表示中の電源OFFダイアログなど
15TYPE_STATUS_BAR_SUB_PANELPhone用expandしたパネル
16TYPE_STATUS_BARStatusBar
17TYPE_STATUS_BAR_PANELStatusBarをexpandしたパネル
18TYPE_VOLUME_OVERLAYボリューム変更
19TYPE_SYSTEM_OVERLAYキーガードより上位に表示するシステムオーバーレイ
20TYPE_NAVIGATION_BARナビゲーションBar
21TYPE_NAVIGATION_BAR_PANELナビゲーションBarの上に表示するために必要なパネル(searchなど)
22TYPE_SYSTEM_ERRORシステムエラー通知
23TYPE_MAGNIFICATION_OVERLAY拡大表示用
24TYPE_DISPLAY_OVERLAYSecondaryディスプレイ用
25TYPE_DRAGドラッグ&ドロップ操作用
26TYPE_SECURE_SYSTEM_OVERLAY
27TYPE_BOOT_PROGRESSBoot中のDialog表示
28TYPE_POINTERマウスポインター
29TYPE_HIDDEN_NAV_CONSUMERFakeWindow用


大きな変更点は
  1. TYPE_KEYGUARD_SCRIMの追加

アプリケーション開発者にはあまり関係ありませんが、Frameworksのカスタム作業がメインの方、WindowManagerServiceとKeyguard周りを調査しましょう。

2013年9月23日月曜日

IngressのComm風タブを作成してみた

IngressのComm風タブを作成してみました。


画面イメージ

デフェルトは画面下部にタブだけを表示し、タブを引っ張り上げることでViewを表示します。




引っ張り上げると、View内のコンテンツが表示されます。

ソース

以下、Githubにて公開中です。
ライセンスはMITライセンスです。
https://github.com/baroqueworksdev/MyApiDemo/blob/master/src/jp/baroqueworksdev/myapidemo/view/SlidePanelView.java

2013年8月1日木曜日

Android 4.3 で追加されたAppOpsの調査 その2

抑制できるパーミッション

以下のソースチェックしましょう。

frameworks/base/core/java/android/app/AppOpsManager.java

ソースを確認すると、次のような値が宣言されています。
これらの値を引数にして、モジュールをコールします。

 
public class AppOpsManager {
 :

    // when adding one of these:
    //  - increment _NUM_OP
    //  - add rows to sOpToSwitch, sOpNames, sOpPerms
    //  - add descriptive strings to Settings/res/values/arrays.xml
    public static final int OP_NONE = -1;
    public static final int OP_COARSE_LOCATION = 0;
    public static final int OP_FINE_LOCATION = 1;
    public static final int OP_GPS = 2;
    public static final int OP_VIBRATE = 3;
    public static final int OP_READ_CONTACTS = 4;
    public static final int OP_WRITE_CONTACTS = 5;
    public static final int OP_READ_CALL_LOG = 6;
    public static final int OP_WRITE_CALL_LOG = 7;
    public static final int OP_READ_CALENDAR = 8;
    public static final int OP_WRITE_CALENDAR = 9;
    public static final int OP_WIFI_SCAN = 10;
    public static final int OP_POST_NOTIFICATION = 11;
    public static final int OP_NEIGHBORING_CELLS = 12;
    public static final int OP_CALL_PHONE = 13;
    public static final int OP_READ_SMS = 14;
    public static final int OP_WRITE_SMS = 15;
    public static final int OP_RECEIVE_SMS = 16;
    public static final int OP_RECEIVE_EMERGECY_SMS = 17;
    public static final int OP_RECEIVE_MMS = 18;
    public static final int OP_RECEIVE_WAP_PUSH = 19;
    public static final int OP_SEND_SMS = 20;
    public static final int OP_READ_ICC_SMS = 21;
    public static final int OP_WRITE_ICC_SMS = 22;
    public static final int OP_WRITE_SETTINGS = 23;
    public static final int OP_SYSTEM_ALERT_WINDOW = 24;
    public static final int OP_ACCESS_NOTIFICATIONS = 25;
    public static final int OP_CAMERA = 26;
    public static final int OP_RECORD_AUDIO = 27;
    public static final int OP_PLAY_AUDIO = 28;
    public static final int OP_READ_CLIPBOARD = 29;
    public static final int OP_WRITE_CLIPBOARD = 30;
    /** @hide */
    public static final int _NUM_OP = 31;
 :
}


つまり、次のようなことしか抑制できません。
  • 位置情報
  • バイブレーション
  • 電話帳のR/W
  • 電話履歴のR/W
  • カレンダーのR/W
  • WiFiのスキャン
  • ノッティフィケーションのPost
  • 電話発信
  • SMSのR/W
  • SMS/メールの受信
  • SMSの送信
  • 設定のWrite
  • SystemAlertWindowの使用
  • ノッティフィケーションの参照
  • カメラ
  • オーディオの録音/鳴動
  • クリップボードのR/W

Internet、Bluetooth、SDカードなど、アプリケーションの再起動が必要そうな機能の抑制できないようです。
(※なぜアプリケーションの再起動が必要なのかは、frameworksのソースを確認しよう)