Android 4.2 API

API レベル: 17

Android 4.2(JELLY_BEAN_MR1) は Jelly Bean リリースのアップデートであり、ユーザーとアプリに新機能を提供します。 開発できます。このドキュメントでは、 デベロッパー向けの新しい API を紹介します。

アプリ デベロッパーは、Android 4.2 のシステム イメージと SDK プラットフォームを SDK Manager からダウンロードする必要があります。もし Android 4.2 を搭載し、アプリをテストできるデバイスがない場合は、Android 4.2 システムを使用してください。 イメージを使用して Android Emulator でアプリをテストします。 その後、Android 4.2 プラットフォームに対してアプリをビルドし、最新の API の使用を開始します。

Android 4.2 搭載デバイス向けにアプリを最適化するには、以下を行います。 targetSdkVersion"17"、Android 4.2 システム イメージにインストールし、 そのうえで変更したアップデートを公開できます

マイページ Android 4.2 で API を使用できますが、 実行前にシステムの API レベルをチェックする条件をコードに追加 minSdkVersion でサポートされていない API。 詳細情報 下位互換性を維持する方法については、下位互換性のある UI

API レベルの仕組みについて詳しくは、API とは何かをご覧ください。 レベル

重要な動作変更

以前に Android 向けアプリを公開したことがある場合は、以下の点にご注意ください。 次のような変更を行います。

  • コンテンツ プロバイダはデフォルトでエクスポートされなくなりました。つまり、デフォルト値が android:exported 属性が “false" になりました。他のアプリを安全な状態に維持することが コンテンツ プロバイダにアクセスできないようにするには、android:exported="true" を明示的に設定する必要があります。

    この変更は、android:targetSdkVersion または android:minSdkVersion を 17 以上に設定した場合にのみ適用されます。それ以外の場合、デフォルト値は “true" です。 Android 4.2 以降で実行している場合でも実行できます。

  • 以前のバージョンの Android と比較すると、ユーザーの位置情報の結果の精度が低くなる可能性があります アプリが ACCESS_COARSE_LOCATION 権限をリクエストしても、 ACCESS_FINE_LOCATION 権限をリクエストしない。

    アプリが次の権限をリクエストしたときに、ユーザーのプライバシーの期待に応える おおよその位置情報(精細な位置情報ではない)である場合、ユーザーの現在地の推定値は提供されません。 都市の区画よりも精度が高くなります

  • Settings.System で定義された一部のデバイスの設定 読み取り専用です。Settings.System で定義された設定のうち Settings.Global に移動された変更をアプリが書き込もうとした場合、 Android 4.2 以降で実行する場合、書き込みオペレーションは通知なく失敗します。

    android:targetSdkVersionandroid:minSdkVersion の値が 17 未満であっても、アプリで Android 4.2 以降で実行する場合、Settings.Global に移動しました。

  • アプリで WebView を使用している場合、Android 4.2 では、 セキュリティにより、JavaScript をより安全に Android コード。次のように targetSdkVersion バージョンを 17 以上に設定するには、使用するメソッドに @JavascriptInterface アノテーションを (メソッドは public にする必要があります)。 アノテーションがある場合、WebView 内のウェブページからメソッドにアクセスできません。 Android 4.2 以降で動作している場合。次のように targetSdkVersion 16 以下である場合、アノテーションは必須ではありませんが、ターゲット バージョンを更新することをおすすめします。 アノテーションを追加します。

    バインディングの詳細 JavaScript コードから Android コードへの変換をご覧ください。

Daydream

Daydream は、Android デバイス向けの新しいインタラクティブなスクリーンセーバー モードです。自動的に有効になります デバイスをホルダーに装着しているときや、デバイスを 充電器です。Daydream では一度に 1 つの夢しか表示されませんが、 タッチで消える、純粋に視覚的な受動的なディスプレイであるか、インタラクティブで応答性のあるディスプレイである すべての入力イベントに エクスポートできますアプリのプロセスで夢を実現し、さまざまな機能に ビュー、レイアウト、アニメーションなどの Android UI ツールキットを使うことで、 ライブ壁紙やアプリ ウィジェットよりも強力です。

DreamService のサブクラスを実装することで、Daydream 用のゲームを開発できます。DreamService API は次のとおりです。 Activity と同様の設計になっています。アプリの UI を リクエストした後、いつでもレイアウト リソース ID または ViewsetContentView() に渡します。 ウィンドウ(onAttachedToWindow() や 呼び出すことができます。

DreamService クラスには、他にも重要なライフサイクル コールバックがあります。 メソッド(onDreamingStarted()onDreamingStopped()onDetachedFromWindow() など)をベース Service API の上に実装します。 DreamService を システムによって自動的に起動されます。

ドリームがインタラクティブな場合は、ドリームからアクティビティを開始してユーザーを送り込むことができます。 アプリの UI 全体をカスタマイズしたり、詳細やコントロールを表示したりできます。finish() を使用してドリームを終了し、ユーザーに 作成します。

デイドリームをシステムで使用できるようにするには、<service> 要素で DreamService を宣言します。 指定します。次に、アクション "android.service.dreams.DreamService" を指定したインテント フィルタを含める必要があります。例:

<service android:name=".MyDream" android:exported="true"
    android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
    <intent-filter>
        <action android:name="android.service.dreams.DreamService" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</service>

DreamService には、他にも便利なメソッドがあります。 次の点に留意してください。

  • setInteractive(boolean) は、 ドリームは入力イベントを受け取るか、ユーザー入力と同時に終了します。もし夢が ユーザーは、戻るボタンやホームボタンを使用して夢を見るか、 finish()して夢を止めてください。
  • 完全に臨場感あふれるディスプレイにするには、setFullscreen() を呼び出してステータスバーを非表示にします。
  • スクリーンキャストが開始される前に、ディスプレイは暗くなり、アイドル タイムアウトが終了したことをユーザーに知らせます。 が近づいています。setScreenBright(true) を呼び出すと、ディスプレイを通常の明るさに設定できます。

詳細については、DreamService のドキュメントをご覧ください。

セカンダリ ディスプレイ

Android では、接続されている他の画面に独自のコンテンツを表示できるようになりました ユーザーのデバイスに安全に接続します。 セカンダリ ディスプレイ用に独自のコンテンツを作成するには、Presentation を拡張します。 onCreate() コールバックを実装します。範囲内 onCreate(): セカンダリ ディスプレイの UI を指定します setContentView() を呼び出します。 Dialog クラスの拡張として、Presentation クラスは、アプリが一意の UI を表示できる領域を提供します。 設定されます。

Presentation を表示できるセカンダリ ディスプレイを検出するには、次の手順を行います。 DisplayManager または MediaRouter を使用する API一方、DisplayManager API を使用すると、 複数のディスプレイを一度に接続することもできますが、通常は MediaRouter を使用して、システムのデフォルトのディスプレイにすばやくアクセスできるようにします。 説明します。

プレゼンテーションのデフォルトの表示を取得するには、MediaRouter.getSelectedRoute() を呼び出して、 ROUTE_TYPE_LIVE_VIDEO。システムで現在選択されているルートを表す MediaRouter.RouteInfo オブジェクトが返されます。 動画プレゼンテーション用のものです。MediaRouter.RouteInfo が null でない場合は、次の関数を呼び出します。 getPresentationDisplay(): 接続されたディスプレイを表す Display を取得します。

プレゼンテーションを表示するには、Display オブジェクトを Presentation クラスのコンストラクタに渡します。プレゼンテーションが セカンダリ ディスプレイに表示されます。

新しいディスプレイが接続されたことをランタイムに検出するには、MediaRouter.SimpleCallback のインスタンスを作成し、onRoutePresentationDisplayChanged() コールバック メソッドを実装します。このメソッドは、新しいディスプレイが接続された時点でシステムが呼び出されます。 プレゼンテーション用のディスプレイが接続されています。次に、ROUTE_TYPE_LIVE_VIDEO ルートタイプとともに MediaRouter.addCallback() に渡して、MediaRouter.SimpleCallback を登録します。電話の着信時に onRoutePresentationDisplayChanged(): 前述のように MediaRouter.getSelectedRoute() を呼び出します。

Presentation の UI をさらに最適化するには、 セカンダリ画面では 別のテーマにするには、先ほど作成した <style>android:presentationTheme 属性を指定します。 自動的に適用されます。

ユーザーのデバイスに接続されている画面は多くの場合、画面サイズが大きく、 画面密度が異なる可能性があります。画面の特性は異なる場合があるため、 そのような大きなディスプレイ向けに最適化されたリソースを提供します。機能 Presentation から追加リソースをリクエストするには、getContext().getResources() を呼び出して、ディスプレイに対応する Resources オブジェクトを取得します。これにより、 アプリケーションに最適なリソースを セカンダリ ディスプレイの画面サイズと密度

詳細とコードサンプルについては、Presentation をご覧ください。 クラスのドキュメントを参照してください。

ロック画面ウィジェット

Android では、ユーザーがアプリ ウィジェットをロック画面に追加できるようになりました。アプリ ウィジェットを ロック画面で、AppWidgetProviderInfo を指定する XML ファイルに android:widgetCategory 属性を追加します。この属性には次の 2 つの値がサポートされています: home_screen および keyguard。デフォルトではこの属性は home_screen に設定されており、ユーザーは アプリ ウィジェットをホーム画面に追加できます。ロックでもアプリ ウィジェットを使用したい場合 keyguard の値を追加します。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:widgetCategory="keyguard|home_screen">
</appwidget-provider>

ロック画面にアプリ ウィジェットの初期レイアウトを指定しておくと、 android:initialKeyguardLayout 属性。これは、次のという点で android:initialLayout と同じように動作します。 アプリ ウィジェットが初期化されて できます。

ロック画面用のアプリ ウィジェットの適切な作成方法など、 ロック画面でのアプリ ウィジェットのサイズを調整する方法については、アプリ ウィジェットのガイドをご覧ください。

複数ユーザー

Android では、タブレットなどの共有可能なデバイスで複数のユーザー空間を使用できるようになりました。1 台のデバイスで デバイスには、固有のアカウント、アプリ、システム設定、ファイルなど、 防ぐことができます。

アプリ デベロッパーにとって、アプリを機能させるために何か必要な操作はありません 1 台のデバイスで 複数のユーザーと適切に連携できます1 つのプロジェクトに何人のユーザーが アプリが保存するデータと、アプリが保存するデータと 使用できます。システムは、どのユーザーデータがどのプロセスに属するかを追跡し、 アプリが動作しており、アプリがそのユーザーのデータにのみアクセスできるようにし、 他のユーザーのデータにはアクセスできません。

マルチユーザー環境でのデータの保存

アプリがユーザー設定の保存、データベースの作成、ユーザーのファイルへのファイルの書き込みを行うとき そのデータにアクセスできるのは、そのユーザーとして実行しているときだけです。

マルチユーザー環境でアプリが正しく動作することを確認するには、 ハードコードされたパスを使用して内部アプリ ディレクトリまたは外部ストレージの場所を指定し、代わりに 適切な API:

特定のユーザーのデータを保存するためにこれらの API のどれを使用しても、データは アクセスできます。アプリの視点から見ると、各ユーザーは ダウンロードされます。

マルチユーザー環境でユーザーの識別

アプリでユニーク ユーザーを識別して分析情報を収集したり、他のアカウントを作成したりする必要がある場合 関連付けがある場合は、サービス アカウントを 固有のインストール。アプリの起動時に新しい UUID を作成し、 最初は、ユーザー数に関係なく、各ユーザーをトラッキングするための一意の ID を確実に取得します。 1 台のデバイスにアプリをインストールするユーザー数です。または、取得したローカル トークンを Google Cloud Messaging が提供する登録 ID を使用することもできます。

アプリがハードウェア デバイス識別子(Wi-Fi MAC アドレスなど)のいずれかをリクエストする場合は注意してください。 アドレスや SERIAL 番号など)、これらは同じ値になります。 これらの識別子はユーザーではなくハードウェアに関連付けられるためです。もう一つは言うまでもなく アプリのインストールに関するブログ投稿をご覧ください。

新しい全般設定

Settings.Global の追加により、複数のユーザーがサポートできるようにシステム設定が更新されました。これらの設定は読み取り専用のため Settings.Secure の設定と似ていますが、すべての環境にわたってグローバルに適用されます。 すべてのユーザースペースに適用されます。

既存の設定の一部が、Settings.System または Settings.Secure からここに移動されました。アプリが Settings.System で以前に定義された設定を変更しています (AIRPLANE_MODE_ON など)である場合、 Android 4.2 以降を搭載しているデバイスでは、これらの設定が次のように変更されていた場合、それらのデバイスでは動作しなくなります Settings.Global に移動しました。以下の設定は引き続き読み取ることができます Settings.Global。ただし、この設定が安全とみなされなくなったため 変更しようとすると自動的に失敗し、アプリに変更しようとすると警告が Android 4.2 以降でアプリを実行する場合のシステムログ。

RTL レイアウトのサポート

Android には、スムーズなユーザー インターフェースを構築できる API がいくつか用意されています。 右から左(RTL)の UI と読み上げを使用する言語をサポートするためにレイアウトの向きを変換する アラビア語やヘブライ語などの言語に対応します

アプリで RTL レイアウトのサポートを開始するには、android:supportsRtl 属性をマニフェスト ファイルで <application> 要素に設定します。 “true" に設定します。これを有効にすると、システムでさまざまな RTL API が有効になり、 RTL レイアウトでアプリを表示します。たとえばアクションバーには アイコンとタイトルが表示されます 左側のアクション ボタンと、 フレームワークが提供する View クラスも逆になります。

アプリを RTL レイアウトで表示したときの外観をさらに最適化する必要がある場合は、 最適化には 2 つの基本的なレベルがあります。

  1. 左向きと右向きのレイアウト プロパティを開始向きと終了指向のレイアウトに変換する プロパティです。

    たとえば、android:layout_marginStart を使用します。 は android:layout_marginLeft に、android:layout_marginEndandroid:layout_marginRight に置き換えられます。

    RelativeLayout クラスは、対応するレイアウトも提供します。 属性を使用して、左右の位置を置換できます。たとえば、android:layout_alignParentStart を 次を android:layout_alignParentLeftandroid:layout_toStartOf に置き換えます。 android:layout_toLeftOf

  2. または、RTL レイアウトを完全に最適化するには、 ldrtl リソース修飾子を使用したレイアウト ファイル(ldrtl は layout-direction-right-to-left})。たとえば、デフォルトのレイアウト ファイルを res/layout-ldrtl/res/layout/ と RTL 最適化レイアウト。

    ldrtl 修飾子はドローアブル リソースに適しているため、 グラフィックは 読み方の方向に対応する向きです

RTL レイアウトをサポートするため、フレームワーク全体で次のようなさまざまな API を利用できます。 View クラスを使用して、カスタム関数に適切な動作を実装できます。 Configuration で現在のレイアウト方向をクエリします。

注: SQlite を使用していて、名前が SQlite の場合の “数値のみ” 注意: String.format(String, Object...) を使用すると、エラーの原因となる は、デバイスのアラビア語言語 / 地域に設定されている場合、アラビア語の同等の言語に変換されます。 String.format(Locale,String,Object...) を使用して、数値が確実に ASCII として保持されます。また、代わりに String.format("%d", int) も使用します。 String.valueOf(int): 数値を書式設定できます。

Fragment のネスト

フラグメント内にフラグメントを埋め込むことができるようになりました。この方法は、さまざまな状況で役立ちます。 動的で再利用可能な UI コンポーネントを、それ自体が 動的かつ再利用しやすいものにしますたとえば、ViewPager を使用して、 左右にスワイプして画面スペースの大部分を占めるフラグメントを作成する場合は、 各フラグメント ページにフラグメントを挿入できるようになりました。

フラグメントをネストするには、単に getChildFragmentManager() を呼び出します。 フラグメントを追加する Fragment を指定します。これにより、トップレベル アクティビティから通常どおりに使用できる FragmentManager が返されます。 フラグメント トランザクションを作成します。たとえば、次のコードは、内部からフラグメントを追加するコードです。 既存の Fragment クラスの場合:

Kotlin

val videoFragment = VideoPlayerFragment()
childFragmentManager.beginTransaction().apply {
    add(R.id.video_fragment, videoFragment)
    commit()
}

Java

Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();

ネストされたフラグメント内から、 getParentFragment()

ネストされたフラグメントも Android サポート ライブラリでサポートされるようになったため、ネストされたフラグメントを実装できます。 フラグメント デザイン(Android 1.6 以降)

注: そのレイアウトをフラグメントにインフレートすることはできません。 <fragment> が含まれている。ネストされたフラグメントは、 呼び出すことができます。

Renderscript

RenderScript の計算機能が拡張され、次の機能が追加されました。

スクリプトの組み込み

Renderscript の組み込みスクリプト組み込み機能を使用して、 次のような一般的なオペレーションを選べます。

スクリプト組み込みを使用するには、各組み込み関数の静的な create() メソッドを呼び出します。 スクリプトのインスタンスを作成します。次に、対応可能な set() を呼び出します。 メソッドを使用して、必要な入力とオプションを設定します。 最後に、forEach() を呼び出します。 メソッドを使用してスクリプトを実行します。

スクリプト グループ

ScriptGroup を使用すると、関連する RenderScript を連結できます それらのスクリプトを 1 回の呼び出しで実行できます。

ScriptGroup.Builder を使用して、すべてのスクリプトをグループに追加します。 addKernel() を呼び出します。一旦 すべてのスクリプトを追加し、サービス間の接続を addConnection() を呼び出してスクリプトを作成します。 接続の追加が完了したら、create() を呼び出します。 スクリプトグループを作成しますスクリプト グループを実行する前に、入力ファイルと Allocation と最初のスクリプトを実行します。 setInput(Script.KernelID, Allocation) メソッドを呼び出し、 Allocation(結果が書き込まれ、最終スクリプトが書き込まれます) setOutput() で実行します。最後に、 execute(): スクリプト グループを実行します。

フィルタ スクリプト

Filterscript は、結果のコードの実行を許可する既存の RenderScript API に対する制約を定義します より幅広いプロセッサ(CPU、GPU、DSP)に搭載できます。Filterscript ファイルを作成するには、.fs を作成します ファイルに .rs ファイルではなく #pragma rs_fp_relaxed を指定して、 スクリプトが厳格な IEEE 754-2008 浮動小数点精度を必要としないことを Renderscript ランタイムに指示します。 この精度により、denorm と 0 への丸め処理はゼロにフラッシュできます。また、FilterScript では、 スクリプトでは 32 ビットの組み込み型は使用できず、 Filterscript はポインタをサポートしていないため、__attribute__((kernel)) 属性を使用します。 root() 関数のデフォルトのシグネチャが定義されています。

注: Filterscript はプラットフォームでもサポートされていますが、 のサポートは、SDK Tools リリース 21.0.1 で使用できるようになります。

Android 4.2 でのすべての API の変更点について詳しくは、 API 差分レポート