sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

うちのNexus7にも Android 4.3が降ってきました

わりと早めだったのは、去年のI/Oで配られたやつだったからなのかもしれません。

f:id:sos_jp:20130730181523p:plain

で、4.3って何ができるようになって何が変わったのかも良く知らないので、せっかくなので実機をつつきつつ、公式サイトを眺めてみることにします。(既にいろんなサイトで4.3の情報はでていますでそっち読んだ方がいいような気もしてます…)

Android 4.3 APIs

Important Behavior Changes

If your app uses implicit intents...

制限付きプロフィール(restricted profiles)では標準アプリの全てが有効になっていないこともある。

ブラウザやカメラアプリがない場合に、それらを暗黙のインテントで呼び出すとアプリがクラッシュするかもしれないから、まずはresolveActivity() や queryIntentActivities() で有効かどうか確かめること。

Intent intent = new Intent(Intent.ACTION_SEND);

if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
} else {
    Toast.makeText(context, R.string.app_not_available, Toast.LENGTH_LONG).show();
}

If your app depends on accounts...

制限付きプロフィールでは、デフォルトではユーザーはアカウントを持っていないため、 ユーザーアカウントに依存したアプリの場合は、アプリがクラッシュしたり、予期しない動作をしたりする可能性がある。制限プロフィールでの実行を除外するには、manifestファイルの要素に android:requiredAccountType属性を追加する必要がある。

こういったアプリを属性を追加せずに制限付きプロフィール下でも動作させる場合は、アカウント情報に依存している機能を使えなくするか、プライマリーアカウントによって作成されたユーザーアカウントにアクセスできるようにする必要がある。

Restricted Profiles

タブレットでは、プライマリーユーザーが制限付きプロフィール(Restricted Profiles)を作成できる。このプロフィールでは、アプリ毎の有効性を設定したりということができる。

また、新しいAPIはアプリの中で細かい制限を指定できるようにもしている。これらの新しいAPIを利用して、制限付きプロフィール下で実行されているアプリ内で、どんな種類のコンテンツを有効にするのかという制御が可能となる。

制限を設定するためのUIは、システムの設定アプリで管理される。 アプリの制限の設定に表示するためには、ACTION_GET_RESTRICTION_ENTRIESを受け取るBroadcastReceiverを実装する必要が有る。システムは、全てのアプリに利用可能な制限を問い合わせるために、このインテントを実行し、プライマリユーザーのために設定用のUIを構築する。

BoradcastReceiverのonReceive()で、あなたのアプリが提供する個々の制限のに対しひとつずつRestrictionEntryを作成しなければならない。RestrictionEntryには、タイトルと説明、そして以下のタイプのうちの一つを定義する。

  • TYPE_BOOLEAN trueかfalse
  • TYPE_CHOICE 複数の中からどれか一つを選択(ラジオボタンでの選択)
  • TYPE_MULTI_SELECT 複数の中から選択(チェックボックスでの選択)

RestrictionEntryオブジェクトを ArrayListオブジェクトに格納し、EXTRA_RESTRICTIONS_LISTのvalueとしてResultを返す。

システムはこれを受け取って設定画面を作成し、ユーザーの設定値を保存するので、アプリが起動された時に、getApplicationRestrictions()を呼び、返ってきたBundleから各RestrictionEntryを取り出せばよい。

Boolやラジオボタン、チェックボックスで扱えない類の設定をさせたい場合、ユーザーによって設定画面から開かれるカスタムのActivityを作成することも可能です。

BroadcastReceiverの結果に、EXTRA_RESTRICTIONS_INTENTのvalueとしてActivityクラスを返せばよい(putParcelable()を使う)。プライマリユーザーがカスタムのActivityで制限をセットしたら、 EXTRA_RESTRICTIONS_LIST か EXTRA_RESTRICTIONS_BUNDLE キーで値を返さなければならない。

Supporting accounts in a restricted profile

プライマリユーザーに追加された全てのアカウントは、制限付きプロフィールを利用できるが、デフォルトではAccount Manager API からはアクセスできない。

制限プロフィール内でAccountManagerを使ってアカウントを追加しようとすると失敗する。

以下の3つの方法がある。

Allow access to the owner’s accounts from a restricted profile.

制限プロフィールからアカウントにアクセスするために、manifestファイルのにandroid:restrictedAccountType属性を追加する。

<application ...
  android:restrictedAccountType="com.example.account.type" >
  • 注意: これはプライマリーユーザーのアカウントへのアクセスを許可するものなので、重要な個人情報(PII)に該当するものの表示は行わない場合にのみ指定するべき。
    システムは、プライマリユーザーに対して、そのアプリが制限プロフィールにアカウントへのアクセスを許可することを提示する。そのため、アプリにとってそれが重要な機能であることを明確にすること。また、可能ならば、プライマリユーザーに対して、どの程度のアクセスを許可するのかを設定する機能を提供するべきである。
Disable certain functionality when unable to modify accounts.

アカウントを使いたいが、それが主要な機能ではない場合、アカウントの可用性をチェックし、無効な時は機能も無効にすればよい。

まずはアカウントが存在するかどうかを調べ、そうでない場合はgetUserRestrictions()の結果にDISALLOW_MODIFY_ACCOUNTSが含まれるかどうかでアカウントの作成が可能かどうかをチェックする。変更禁止の場合、アカウントへのアクセスが必要なアプリの該当機能を無効にするべきである。

UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
Bundle restrictions = um.getUserRestrictions();
if (restrictions.getBoolean(UserManager.DISALLOW_MODIFY_ACCOUNTS, false)) {
  // cannot add accounts, disable some functionality
}
  • この方針の場合、manifestファイルに何か新しい属性を定義するべきではない
Disable your app when unable to access private accounts.

アプリが重要な個人情報を必要とし、制限プロフィール内で新規アカウントを追加できない場合、manifestファイルの要素にandroid:requiredAccountType属性を追加する。

<application ...
  android:requiredAccountType="com.example.account.type" >

たとえば、Gmailアプリは、制限プロフィールで自分自身を無効にするためにこの属性を用いる。なぜなら、オーナーの個人的なemailは、制限プロフィール内では有効になるべきではない。

要するにユーザー毎にアプリとか制限できる機能ってことでしょうか。さっそくNexus7で Restricted Profileを新規で作って遊んでみました。一人で専有しているデバイスだとほとんど有難味はありませんけど…

f:id:sos_jp:20130801050133p:plain


普段タブレット自体を使う事なんてほとんどない(初代iPadをたまに使う程度)のですが、 新しいNexus7はよさげなのでとても欲しい…

次回へ続く