2013年7月27日土曜日

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

Android4.3で追加されているAppOpsを確認しました。
アプリケーションのパーミッションの管理ができるかもしれません。


ポイント

AppOpsのポイントです。
  • AppOpsManager、AppOpsServiceが追加された
  • アプリケーションで使うには、getSystemService(Context.LAYOUT_INFLATER_SERVICE)をコール
  • アプリケーションのパーミッションの抑制ができる
  • framewokrs内の各サービスは、AppOpsServiceから設定値を取得して動作ON/OFFを決定
(AppOpsManager.MODE_ALLOWED / MODE_IGNOREDなどでgrepすればOK)


簡易クラス図



AppOpsServiceが生成されるタイミング

ActivityManagerServiceのコンストラクタで、AppOpsServiceが生成されます。

 
    private ActivityManagerService() {
        File systemDir = new File(dataDir, "system");
            :
        mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"));
            :
    }


AppOpsManagerの設定データ

AppOpsの設定値は次のように保存されています。
格納ディレクトリは上記のとおり、Systemディレクトリでファイル名はappops.xmlです。
設定値のR/Wは次のように、AppOpsServiceで処理されています。詳しく知りたい方はソースを確認しましょう。

 
public class AppOpsService extends IAppOpsService.Stub {
    public AppOpsService(File storagePath) {
        mFile = new AtomicFile(storagePath);
        mHandler = new Handler();
        readState();
    }

    void readState() {

    }
    void writeState() {

    }
}


ソース

android-4.3_r2.1のソースを確認すると、次のソースがAppOpsに該当します。
以下のソースは要チェックです。

Settingsアプリ
packages/apps/Settings/src/com/android/settings/applications
- AppOpsCategory.java
- AppOpsDetails.java
- AppOpsState.java
- AppOpsSummary.java


Frameworks
frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/android/app/AppOpsManager.java
frameworks/base/services/java/com/android/server/AppOpsService.java
frameworks/base/services/java/com/android/server/am/ActivityManagerService.java


『プロの力が身につく Androidプログラミングの教科書』が発売されました

執筆に参加

『プロの力が身につく Androidプログラミングの教科書』は6人のAndroiderによって、書かれています。
私も執筆に参加させていただきました。


こんな方へ

Androidをこれからはじめようとする方&脱初心者を望んでいる方に、是非、手に取っていただきたい本です。
本書HPから熱い思いをお伝えします。
引用元:http://android-textbook.com/android-programming-textbook/
※ここから引用
本書は、Android のことを「知る」「学ぶ」「考える」「使う」「守る」「試す」ための入門書になります。 Androidのことをより深く知ってもらうための書籍でもあり、Androidアプリケーションの開発をはじめたばかりの方でも、本書を順番に読み進めながら学べる学習スタイルを採用しています。初心者の方だけでなく、Androidアプリケーションを開発された経験がある方でも、Androidのことをより深く知ってもらうための要素を含んでいます。最終的にはオリジナルのアプリケーションを開発し、世の中に公開できるようになることを目標にしています。また本書は、Androidアプリケーションの開発方法のみならず、執筆者の経験から得たノウハウを詰め込んでいますので、すべての開発者が「Android」というものを深く知ることができます。
※ここまで引用

本書の目次が上記HPに公開されています。是非、ご覧ください。



プロの力が身につく Androidプログラミングの教科書
藤田 竜史 要 徳幸 住友 孝郎 日高 正博 小林 慎治 木村 尭海
ソフトバンククリエイティブ
売り上げランキング: 38,541

2013年7月16日火曜日

バッテリーの情報を取得する

アプリで端末のバッテリー情報を取得します。
以下のWebAPIを使用します。

Battery Status API
https://developer.mozilla.org/ja/docs/WebAPI/Battery_Status


取得可能な情報:
バッテリの残量(レベル)、
充電中かどうか
充電中完了までの時間
電池が空っぽになるまでの時間


アプリの表示部分

次のようにHTMLで表示します。

 
<body onload="onLoad()">
  <div id="charging">(charging state unknown)</div>
  <div id="chargingTime"></div>
  <div id="dischargingtime"></div>
  <div id="level"></div>
</body>



JavaScriptでWebAPIを使う

HTMLのbodyタグから、次のJavaScriptを実行させるようにしました。


 
// <body>のonloadにセット
/*
interface BatteryManager : EventTarget {
    readonly    attribute boolean             charging;
    readonly    attribute unrestricted double chargingTime;
    readonly    attribute unrestricted double dischargingTime;
    readonly    attribute double              level;
                attribute EventHandler        onchargingchange;
                attribute EventHandler        onchargingtimechange;
                attribute EventHandler        ondischargingtimechange;
                attribute EventHandler        onlevelchange;
};
*/
function onLoad(){
    var battery = navigator.battery;

    updateBatteryInfo();
    // add Listener
    battery.addEventListener("chargingchange", updateBatteryInfo, false);
    battery.addEventListener("chargingTime", updateBatteryInfo, false);
    battery.addEventListener("dischargingtimechange", updateBatteryInfo, false);
    battery.addEventListener("levelchange", updateBatteryInfo, false);

    // set text
    function updateBatteryInfo(){
        document.querySelector('#charging').textContent = battery.charging ? 'charging' : 'not charging';
        document.querySelector('#chargingTime').textContent = battery.chargingTime;
        document.querySelector('#dischargingtime').textContent = battery.dischargingTime;
        document.querySelector('#level').textContent = battery.level * 100 +"%";
    }
}


不要になったタイミングで、battery.removeEventListenerをコールし、リスナー解除を行いましょう。
FirefoxOs内の次のプログラムが非常に参考になります。

Gaia層(Settingアプリのソース)
 \gaia\apps\settings\js