BenesseExtension を使ってみよう
今回は、以前の DchaService に続いて、BenesseExtension を使う方法を解説していきます。
前提
前回同様ですが、
DchaService は、アプリ であり、
BenesseExtension は、フレームワーク です。
DchaService について知りたい場合は、こちらの記事をご覧ください。
BenesseExtension
これまた Benesse が開発したものですが、実は DchaService より手が凝ってます。
ただ、端末によって使える関数が異なるので、またしても注意が必要です。
パッケージIDは、android.os.BenesseExtension です。
それでは、機能を紹介していきます。
boolean checkPassword(String passwordText)
対象:CT3 (後期) | CTX | CTZ
Benesse が指定したパスワードと一致しているか確認する関数。
/factory/dcha_hash が存在する場合、そちらがパスワードの比較対象として優先される。
一致した場合は true を返し、再起動時に ADB が自動で無効になるフラグを無効にできる。
尚、このフラグは putInt や、ADB から直接設定可能。
boolean checkUsbCam()
対象:CT3
USB にカメラが接続されているかどうかを真偽値で返します。
/dev/video0 が存在するかどうかで判断します。
Point getBaseDisplaySize()
対象:CT2 | CT3
現在のディスプレイのサイズを [width, height] で返します。
int getDchaState()
対象:CT2 | CT3 | CTX | CTZ
System ネームスペースの dcha_state の値を返します。
Point getInitialDisplaySize()
対象:CT2 | CT3
ディスプレイの物理的なサイズを [width, height] で返します。
int getInt(String name)
対象:CTX | CTZ
特定変数の値を返します。
- bc:compatscreen:画面サイズを変更
- 0: [1920, 1200]
- 1: [1024, 768]
- 2: [1280, 800]
- bc:nightmode:active:読書灯の有効状態
- bc:nightcolor:max:読書灯の最大の輝度
- bc:nightcolor:min:読書灯の最低の輝度
- bc:nightcolor:current:読書灯の現在の輝度
- bc_password_hit:再起動時に ADB を自動で無効化するかどうかの判断に用いられる。
- bc:pen:battery:AESペンの大凡のバッテリー残量
- bc:touchpanel:palmreject:size
Point getLcdSize()
対象:CT2 | CT3
getInitialDisplaySize() を実行します。
String getString(String name)
対象:CT3 (後期) | CTX | CTZ
特定変数の値を返します。
- bc:mac_address:Wi-Fi の MAC アドレス
- bc:serial_no:製造番号
- bc:touchpanel:fw_version
- bc:digitizer:fw_version
- bc:touchpanel:nvt:fw_version
- bc:touchpanel:fts:fw_version
- bc:touchpanel:lcd_type"
CT3 の場合は、bc:mac_address のみ有効です。
boolean putInt(String name, int value)
対象:CTX | CTZ
特定変数の値を設定します。
- bc:compatscreen
- bc:nightmode:active
- bc:nightcolor:current
- bc_password_hit
- bc:touchpanel:palmreject:size
boolean putString(String name, String value)
対象:CTX (後期) | CTZ
タッチパネルファームウェアアップデートに使用。
2つ目の引数にファイルを指定。
- bc:touchpanel:fw_update // CTX | CTZ (NVT | FTS) 共通
- bc:digitizer:fw_update // CTX のみ
- bc:touchpanel:nvt:fw_update // CTZ (NVT | FTS) 共通
- bc:touchpanel:fts:fw_update:※処理が実装されていない
void setDchaState(int status)
対象:CT2 | CT3 | CTX | CTZ
System ネームスペースの dcha_state の値を設定。
boolean setForcedDisplaySize(int width, int height)
対象:CT2 | CT3
画面の解像度を強制的に設定します。
一つ目の引数が横、二つ目の引数が縦です。
この関数を実行するアプリに、WRITE_SECURE_SETTINGS の権限の付与が必要です。
ライブラリの作り方
AIDL 自作!以上!
ライブラリの使い方
DchaService とは違い、権限の宣言は不要です。
依存関係の使用を宣言
DchaService とは違いフレームワークなので、このクラスをAPKに含める事無くビルド出来ます。
Gradle(Groovy形式) の場合、以下の形式で使用を宣言します。
dependencies {
compileOnly files('libs/BenesseExtension.jar')
}
先程生成したライブラリを app/libs/BenesseExtension.jar に配置している前提です。
Javaコード内での使い方
めっちゃ楽です(笑)
import android.app.Activity;
import android.os.Bundle;
import static android.os.BenesseExtension.*;
public class DchaStateChanger extends Activity {
public static final int DIGICHALIZE_STATUS_UNDIGICHALIZE = 0;
public static final int DIGICHALIZE_STATUS_DIGICHARIZING = 1;
public static final int DIGICHALIZE_STATUS_DIGICHARIZING_DL_COMPLETE = 2;
public static final int DIGICHALIZE_STATUS_DIGICHALIZED = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
finishAndRemoveTask();
try {
setDchaState(getDchaState() == DIGICHALIZE_STATUS_DIGICHALIZED ? DIGICHALIZE_STATUS_UNDIGICHALIZE : DIGICHALIZE_STATUS_DIGICHALIZED);
} catch (NoClassDefFoundError e) {
// BenesseExtension 未実装の時
} catch (NoSuchMethodError ex) {
// 関数はあるがメソッドが無い時
} catch (SecurityException exc) {
// Android のセキュリティに弾かれた時(主に CT2 | CT3)
}
}
}
import で読み込んで、そのまま関数を使うことが出来ます。
DchaService が如何に煩わしいかが分かるでしょう。
ちなみに、サービスコールで使うこともできます。
import android.app.Activity;
import android.os.Bundle;
import android.os.IBenesseExtensionService;
public class DchaStateChanger extends Activity {
public static final int DIGICHALIZE_STATUS_UNDIGICHALIZE = 0;
public static final int DIGICHALIZE_STATUS_DIGICHARIZING = 1;
public static final int DIGICHALIZE_STATUS_DIGICHARIZING_DL_COMPLETE = 2;
public static final int DIGICHALIZE_STATUS_DIGICHALIZED = 3;
private IBenesseExtensionService mBenesseExtensionService = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
finishAndRemoveTask();
try {
mBenesseExtensionService = IBenesseExtensionService.Stub.asInterface(ServiceManager.getService("benesse_extension"));
} catch (RuntimeException ignored) {
}
try {
mBenesseExtensionService.setDchaState(mBenesseExtensionService.getDchaState() == DIGICHALIZE_STATUS_DIGICHALIZED ? DIGICHALIZE_STATUS_UNDIGICHALIZE : DIGICHALIZE_STATUS_DIGICHALIZED);
} catch (RemoteException ignored) {
}
}
}
Discussion