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:targetSdkVersion
とandroid:minSdkVersion
の値が 17 未満であっても、アプリで Android 4.2 以降で実行する場合、Settings.Global
に移動しました。- アプリで
WebView
を使用している場合、Android 4.2 では、 セキュリティにより、JavaScript をより安全に Android コード。次のようにtargetSdkVersion
バージョンを 17 以上に設定するには、使用するメソッドに@JavascriptInterface
アノテーションを (メソッドは public にする必要があります)。 アノテーションがある場合、WebView
内のウェブページからメソッドにアクセスできません。 Android 4.2 以降で動作している場合。次のようにtargetSdkVersion
16 以下である場合、アノテーションは必須ではありませんが、ターゲット バージョンを更新することをおすすめします。 アノテーションを追加します。
Daydream
Daydream は、Android デバイス向けの新しいインタラクティブなスクリーンセーバー モードです。自動的に有効になります デバイスをホルダーに装着しているときや、デバイスを 充電器です。Daydream では一度に 1 つの夢しか表示されませんが、 タッチで消える、純粋に視覚的な受動的なディスプレイであるか、インタラクティブで応答性のあるディスプレイである すべての入力イベントに エクスポートできますアプリのプロセスで夢を実現し、さまざまな機能に ビュー、レイアウト、アニメーションなどの Android UI ツールキットを使うことで、 ライブ壁紙やアプリ ウィジェットよりも強力です。
DreamService
のサブクラスを実装することで、Daydream 用のゲームを開発できます。DreamService
API は次のとおりです。
Activity
と同様の設計になっています。アプリの UI を
リクエストした後、いつでもレイアウト リソース ID または View
を setContentView()
に渡します。
ウィンドウ(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:
- 内部ストレージへのアクセスには、
getFilesDir()
、getCacheDir()
、またはopenFileOutput()
を使用します。 - 外部ストレージにアクセスするには、
getExternalFilesDir()
またはgetExternalStoragePublicDirectory()
を使用します。
特定のユーザーのデータを保存するためにこれらの 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 つの基本的なレベルがあります。
- 左向きと右向きのレイアウト プロパティを開始向きと終了指向のレイアウトに変換する
プロパティです。
たとえば、
android:layout_marginStart
を使用します。 はandroid:layout_marginLeft
に、android:layout_marginEnd
はandroid:layout_marginRight
に置き換えられます。RelativeLayout
クラスは、対応するレイアウトも提供します。 属性を使用して、左右の位置を置換できます。たとえば、android:layout_alignParentStart
を 次をandroid:layout_alignParentLeft
とandroid:layout_toStartOf
に置き換えます。android:layout_toLeftOf
。 - または、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 の組み込みスクリプト組み込み機能を使用して、 次のような一般的なオペレーションを選べます。
Blends
Blur
Color matrix
3x3 convolve
5x5 convolve
Per-channel lookup table
Converting an Android YUV buffer to RGB
スクリプト組み込みを使用するには、各組み込み関数の静的な
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 差分レポート。