Android ダイレクトブートを検知する

Android

Android N (7.0)以降から、ダイレクトブートという仕組みが取り入れられました。
普通に電源をつけた起動と、ユーザーが起動後ロックを外す時点が変わります。

Android公式 ダイレクトブートのサポート

開発者視点、何が困るかっていうと、今までインテントフィルタで

 <action android:name="android.intent.action.BOOT_COMPLETED" />

を検知していればよかったのですが、Android N (7.0)以降からはただ単に起動した場合は、BOOT_COMPLETEDを検知できません。(>_<)

 <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />

というのを検知する必要があります。

ユーザーがロックを解除してから動作して十分なアプリならいいんですが、例えば目覚まし時計や、メッセージング的なアプリだとユーザーがロックを外す前に動作する必要がありますよね。

なので、LOCKED_BOOT_COMPLETEDを検知する必要があります。

AndroidManifest.xmlは次のようにします。

 <receiver android:name=".receivers.BootReceiver"
            android:exported="false"
            android:directBootAware="true">
   <intent-filter>
      <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
      <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
 </receiver>

下記もわすれずにつけましょう!

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

そして、この起動検知でわかりにくい部分は下記のストレージのことだと思います。(´・ω・)
それを書きたいがために、これを書いたようなものです。

それは、

Android公式 ダイレクトブートのサポート

のページにありますが、この仕組みのために、「認証情報暗号化ストレージ」と「端末暗号化ストレージ」という仕組みができました。
名称、わかりにくっ!!
今までの、普通に使っていたプリファレンスファイルなどが「認証情報暗号化ストレージ」です。
「端末暗号化ストレージ」が新しくできた仕組みですが、これはダイレクトブートのために、できたんですかね??

「認証情報暗号化ストレージ」はユーザーがロックを外してからアクセスできるストレージです。
「端末暗号化ストレージ」はユーザーがロックを外さないでもアプリがアクセスできるストレージです。

なので、ダイレクトブートで使う情報を格納しておくには、「端末暗号化ストレージ」に保存しないといけません。
「認証情報暗号化ストレージ」のほうが、ユーザーがロックを外してからアクセスできる場所なので、秘匿性の高い情報はこちらに格納しましょう。

情報の保存の仕方や、従来のプリファレンスファイルからの移動は長くなるので、下記のGoogleさんが配布しているサンプルコードを見たほうがいいでしょう。

Android DirectBoot Sample

端末暗号化ストレージに保存したpreferenceファイルを見る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です