load_average.png

Android 4.0 から標準の設定アプリに「CPU使用状況を表示」機能が追加されました。

この機能を有効にすると、画面右上に「現在のCPU使用状況」がオーバーレイ表示されます。

 

はっきり言って使われない機能だと思うのですが、以下の 2点 が気になったので調べてみました。

1. オーバーレイ表示される ○ / △ / □  の3つの数値の意味

2. オーバー例の方法

 ※最前面のオーバーレイ表示のレイヤーは、タッチしてもイベントを受け取らないようになっている

 

1. オーバーレイ表示される ○ / △ / □ の数値の意味

Linux における /proc/loadavg で表示される最初の3つの情報であり、

1つ目が「過去1分間」、2つ目が「過去5分間」、3つ目が「過去15分間」のCPU使用率となります。

 ※「adb shell cat /proc/loadave」でも表示可

 

2. オーバーレイの方法

com.android.systemui.LoadAverageService クラスに実装コードがありましたが、

通常のアプリでは、WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY を使用する権限がないため、

以下の実装を真似しても動作しませんでした。。。

package com.android.systemui;

// ・・・省略・・・

public class LoadAverageService extends Service {

    private View mView;
    
    // ・・・省略・・・
    
    private class LoadView extends View {

        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            // ここでオーバーレイしたい情報を描画
        }
    }

    // ・・・省略・・・

    @Override
    public void onCreate() {
        super.onCreate();
        mView = new LoadView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY, // <-
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.RIGHT | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        ((WindowManager)getSystemService(WINDOW_SERVICE)).removeView(mView);
        mView = null;
    }

    // ・・・省略・・・

}

 

ちなみに、TYPE_SECURE_SYSTEM_OVERLAY のコメントは、以下のとおりです。

 ※hide を無視して定数あわせても駄目です

/**
 * Window type: secure system overlay windows, which need to be displayed
 * on top of everything else.  These windows must not take input
 * focus, or they will interfere with the keyguard.
 *
 * This is exactly like {@link #TYPE_SYSTEM_OVERLAY} except that only the
 * system itself is allowed to create these overlays.  Applications cannot
 * obtain permission to create secure system overlays.
 * @hide
 */
public static final int TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+15; 

 

公開 API として一般のアプリ権限で使用できれば、使い道もあると思うのですが^^;

sample.png

先日の以下のエントリの続きです。

 

その後、「新スクリーンセーバー?(DREAM)」について調べていたところ、

以下のソースツリーに、起動コード、サンプルコードを見つけました。

  • packages\experimental\DreamTheater

 

早速、起動コードだけ実行してみた

インストール済のアプリで、"android.intent.category.DREAM" に対応するアプリが列挙されるようで、

任意の項目をタップすると、スクリーンセーバーが起動しました^^;

dream.png

 

ソースコード(起動コード抜粋)

package com.adakoda.android.hellodreamtheater;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class HelloDreamTheaterActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        startActivity(Intent.createChooser(new Intent(Intent.ACTION_MAIN)
                .addCategory("android.intent.category.DREAM"),
                "Choose a screen saver:"));
        finish();
    }
}

 

ちなみに本エントリ冒頭の変なドロイド君(Android Roboto)画像は、

先の DreamTheater プロジェクトに収録されていた BouncyDroid というスクリーンセーバーです^^;

いち早くスクリーンセーバーに対応したい開発者は、同サンプルコードを読んで準備しておくと幸せかもしれません(棒

Android 標準ブラウザの HTML5 & CSS3 対応状況をバージョン毎に調べ、表にまとめてみました。

 

※2011/12/7 追記:
 「
はてブ」で御指摘いただきましたとおり、色でしか識別できない図になっておりましたので修正いたしました。
 配慮が不足しており申し訳ありませんでした。 m_ _m

 

調査に使用したサイト

 

調査に使用した Android 端末

  • Android 1.6 (Donut) / HT-03A
  • Android 2.1 (Eclair) / Xperia
  • Android 2.2 (Froyo) / HTC Desire
  • Android 2.3.6 (Gingerbread) / Nexus S
  • Android 3.1 (Honeycomb) / Galaxy Tab
  • Android 4.0.1 (Ice Cream Sandwich) / Galaxy Nexus

 

調査結果

 

 

 

 

 

 

 

 

 

RocketLauncher.png Nyandroid.png

Android 4.0 の将来のバージョンでは「Dream」(※1)と呼ばれる新しいスクリーンセーバーが搭載されるようです。

国内版の Galaxy Nexus (Android 4.0.1)で確認したところ、

同スクリーンセーバー用と思われる画面が、既に 2 つほど組み込まれていました。

  • RocketLauncher ※2
  • Nyandroid ※3

 

現状、これらの画面を呼び出すための管理画面は搭載されていないようですが(※4)、

アクティビティーで実装されているため、以下のようなインテントを発行することで、画面を表示することができます。

 

adb 経由で RocketLauncher を起動する方法

adb shell am start -n com.android.launcher/com.android.launcher2.RocketLauncher

 

adb 経由で Nyandroid を起動する方法

adb shell am start -n com.android.systemui/com.android.systemui.Nyandroid

 

ソースコードを書いてアプリ(apk)から起動する方法

package com.adakoda.android.hellorocketlauncher;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;

public class HelloRocketLauncherActivity extends Activity {

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

        Intent intent = new Intent();
        // RocketLauncher
        {
            intent.setComponent(new ComponentName(
                "com.android.launcher",
                "com.android.launcher2.RocketLauncher"));
        }
        // Nyandroid
//      {
//          intent.setComponent(new ComponentName(
//              "com.android.systemui",
//              "com.android.systemui.Nyandroid"));
//      }
        startActivity(intent);
        finish();
    }

}

ちなみに、Android Market には、すでに RocketLauncher を呼び出すだけのアプリが公開されていました^^;

 

Android Market

 

Dream (新スクリーンセーバー?)について

新しいスクリーンセーバーのベースクラスは、

 frameworks\support\v13\java\android\support\v13\dreams\BasicDream.java

に準備されており、

RocketLauncher では、BasicDream クラスを継承して実装されています(仕組みは意外と単純)。

 packages\apps\Launcher2\src\com\android\launcher2\RocketLauncher.java

 

Nyandroid の方は、BasicDream クラスを継承していないようですが、

AndroidManifest.xml に、Dream 用と思われるカテゴリが定義されているため、Dream コンテンツの一種ではないかと思われます。

android.intent.category.DREAM

 

今後のバージョンアップが楽しみですね!

 

※1 : HTC Dream (Android Dev Phone 1)でも電脳羊でもありません

※2 : アイコンタップでタップしたアイコンを起動できるスクリーンセーバー兼ランチャー

※3 : 「設定アプリ > 端末情報 > Android バージョン連打 > NyanCat 超長押し」でも起動できます

※4 : 正確には、管理画面は実装されていますが、一部のコードがコメントアウトされていたり、完全なソースコードは提供されていませんでした

GalaxyNexuSpec.png

Galaxy Nexus では、気圧計センサー(Sensor.TYPE_PRESSURE)を搭載しているようです。

早速、気圧の値を取得するソースコードを書いてみました。

 

ソースコード

package com.adakoda.android.sensortest;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;

import com.adakoda.android.sensortest.R.id;

// ※紙面の都合上、エラー処理などは省略しています
public class SensorTestActivity extends Activity implements SensorEventListener {

    private TextView mTextView;
    private SensorManager mSensorManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 結果を表示するためのテキストビュー
        mTextView = (TextView) findViewById(id.value);
        // センサーマネージャー取得
        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        // センサーリスナー登録
        mSensorManager.registerListener(this,
                mSensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE),
                SensorManager.SENSOR_DELAY_NORMAL);
    }

    @Override
    protected void onPause() {
        // センサーリスナー登録解除
        mSensorManager.unregisterListener(this);
        super.onPause();
    }

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

    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_PRESSURE) {
            // 例えば小数点以下3桁表示
            String value = String.format("%.3f hPa (millibar)", event.values[0]);
            mTextView.setText(value);
        }
    }

}

 

リソース

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/value"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>

 

結果

SensorTypePressure.png

 

手元に気圧計がなかったので、値の正確性は不明なのですが、

気象庁 | アメダス(表形式)

などで、ご近所を見た限りでは、なんとなく近い値でした。

 

誰か、Twicca プラグイン作ってくれないかなぁ~^^;』(ぼそっ

 

あわせて読みたい

<<前のページへ 1234567891011

Android Advent Calendar 2011

2012年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29