●端末の電流を取得

この方法で正しいかどうが不明ですので、解る方がいましたら是非とも教えてください。
BatteryManagerでは電流を取得することができませんでした。
いろいろ探しても見つかりませんでした。
調べていくうちに、Linuxのデバイスファイルを直接アクセスすれば現在の値を読み取れるらしいことが判明
対象のデバイスファイルはプラットフォーム毎に場所とファイル名がコロコロ変わるらしいです。

そこで、./sys 以下から次のファイルを検索して、ヒットしたファイルを開くとそれらしい値が取得できました。

batt_current
getcurrent
current_now
batt_chg_current
charger_current

ファイルの値を読んで1000で割ったらmAっぽいです。
測定して確認する方法が無いのが痛いですが、他のアンドロイドの電流測定ソフトと似たような値を示します。

androidターミナルエミュレータで対象ファイルを検索して、ファイルの内容を表示しています。


つまり、次の3つの過程を経れば電流が読み出せるかもしれないという事だと考えられます。

1、./sys以下から対象のファイルを検索する
2、ファイルを開いて値を読み出す
3、値を1000で割って表示する

次のプログラムを作って電流を読み出してみます
ただし、ファイルにアクセスするため、実行するには権限を追加する必要があります権限を追加するにはこちらへ

public class MainActivity extends AppCompatActivity {

    String filename;
    android.widget.TextView view;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        view=new android.widget.TextView(this);

        setContentView(view);

        filename=search(new File("sys"));

        java.util.TimerTask timertask = new java.util.TimerTask(){
            android.os.Handler handler = new android.os.Handler();
            @Override
            public void run() {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        if(filename!=null) {
                            try {
                                java.io.File file = new java.io.File(filename);
                                java.io.FileReader filereader = new java.io.FileReader(file);
                                StringBuffer sb=new StringBuffer();
                                int c;
                                while((c = filereader.read()) != -1){
                                    sb.append((char)c);
                                }
                                String str = sb.toString();
                                str=str.trim();
                                int i=Integer.parseInt(str)/1000;
                                view.setText(Integer.toString(i)+" mA");
                            }catch(Exception e){
                                view.setText("ERROR");
                            }
                        }
                    }
                });
            }
        };
        java.util.Timer timer = new java.util.Timer(true);
        timer.schedule(timertask,(long)2000,(long)1000);
    }

    //検索するファイルの正規表現パターン
    Pattern p = Pattern.compile("batt_current|getcurrent|current_now|batt_chg_current|charger_current");

    private String search(File file) {
        // ファイル一覧取得
        File[] files = file.listFiles();
        if (files == null) {
            return null;
        }

        for (File tmpFile : files) {
            // ディレクトリの場合
            if (tmpFile.isDirectory()) {
                try {
                    if(tmpFile.getAbsolutePath().equals(tmpFile.getCanonicalPath())) {
                        String pos = search(tmpFile);
                        //ファイルが見つかったら検索をやめる
                        if(pos != null) return pos;
                    }
                }catch(Exception e){}
            } else {
                // ファイルの場合
                if(p.matcher(tmpFile.getName()).matches()){
                    return tmpFile.getPath();
                }
            }
        }
        return null;
    }
このプログラムを実行するとそれらしい電流値が表示されます。

ただ、この方法だとsysディレクトリ自体に読み込み権限が付与されてないと動作しないのが問題ですね。

▲トップページ > android