⚙️

BenesseExtension を使ってみよう

に公開
2026/07/27

今回は、以前の 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形式) の場合、以下の形式で使用を宣言します。

app/build.gradle
dependencies {
    compileOnly files('libs/BenesseExtension.jar')
}

先程生成したライブラリを app/libs/BenesseExtension.jar に配置している前提です。

Javaコード内での使い方

めっちゃ楽です(笑)

app/src/main/package/DchaStateChanger.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 が如何に煩わしいかが分かるでしょう。

ちなみに、サービスコールで使うこともできます。

app/src/main/package/DchaStateChanger.java
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