| page.title=Android 4.2 APIs | |
| excludeFromSuggestions=true | |
| sdk.platform.version=4.2 | |
| sdk.platform.apiLevel=17 | |
| @jd:body | |
| <div id="qv-wrapper"> | |
| <div id="qv"> | |
| <h2>In this document</h2> | |
| <ol> | |
| <li><a href="#Behaviors">Important Behavior Changes</a></li> | |
| <li><a href="#Daydream">Daydream</a></li> | |
| <li><a href="#SecondaryDisplays">Secondary Displays</a></li> | |
| <li><a href="#Lockscreen">Lockscreen Widgets</a></li> | |
| <li><a href="#MultipleUsers">Multiple Users</a></li> | |
| <li><a href="#RTL">RTL Layout Support</a></li> | |
| <li><a href="#NestedFragments">Nested Fragments</a></li> | |
| <li><a href="#Renderscript">Renderscript</a></li> | |
| </ol> | |
| <h2>See also</h2> | |
| <ol> | |
| <li><a | |
| href="{@docRoot}sdk/api_diff/17/changes.html">API | |
| Differences Report »</a> </li> | |
| </ol> | |
| </div> | |
| </div> | |
| <p>API Level: 17</p> | |
| <p>Android 4.2 ({@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}) | |
| is an update to the Jelly Bean release that offers new features for users and app | |
| developers. This document provides an introduction to the most notable and | |
| useful new APIs for developers.</p> | |
| <p>As an app developer, you should download the Android 4.2 system image and SDK platform from | |
| the <a href="{@docRoot}tools/help/sdk-manager.html">SDK Manager</a> as soon as possible. If you | |
| don’t have a device running Android 4.2 on which to test your app, use the Android 4.2 system | |
| image to test your app on the <a href="{@docRoot}tools/devices/emulator.html">Android emulator</a>. | |
| Then build your apps against the Android 4.2 platform to begin using the latest APIs.</p> | |
| <div class="sidebox-wrapper"> | |
| <div class="sidebox"> | |
| <h3 id="ApiLevel">Declare your app API Level</h3> | |
| <p>To better optimize your app for devices running Android {@sdkPlatformVersion}, | |
| you should set your <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> to | |
| <code>"{@sdkPlatformApiLevel}"</code>, install it on an Android {@sdkPlatformVersion} system image, | |
| test it, then publish an update with this change.</p> | |
| <p>You | |
| can use APIs in Android {@sdkPlatformVersion} while also supporting older versions by adding | |
| conditions to your code that check for the system API level before executing | |
| APIs not supported by your <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code minSdkVersion}</a>. | |
| To learn more about | |
| maintaining backward-compatibility, read <a | |
| href="{@docRoot}training/backward-compatible-ui/index.html">Creating Backward-Compatible | |
| UIs</a>.</p> | |
| <p>More information about how API levels work is available in <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">What is API | |
| Level?</a></p> | |
| </div> | |
| </div> | |
| <h2 id="Behaviors">Important Behavior Changes</h2> | |
| <p>If you have previously published an app for Android, be aware of the following | |
| changes that might affect your app’s behavior:</p> | |
| <ul> | |
| <li><b>Content providers</b> are no longer exported by default. That is, the default value | |
| for the <a href="{@docRoot}guide/topics/manifest/provider-element.html#exported">{@code | |
| android:exported}</a> attribute is now {@code “false"}. If it’s important that other apps be | |
| able to access your content provider, you must now explicitly set <a | |
| href="{@docRoot}guide/topics/manifest/provider-element.html#exported">{@code | |
| android:exported="true"}.</a> | |
| <p>This change takes effect only if you set either <a | |
| href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code | |
| android:targetSdkVersion}</a> or <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code | |
| android:minSdkVersion}</a> to 17 or higher. Otherwise, the default value is still {@code “true"} | |
| even when running on Android 4.2 and higher.</p> | |
| </li> | |
| <li>Compared to previous versions of Android, <b>user location</b> results may be less accurate | |
| if your app requests the {@link android.Manifest.permission#ACCESS_COARSE_LOCATION} permission but | |
| does not request the {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission. | |
| <p>To meet the privacy expectations of users when your app requests permission for | |
| coarse location (and not fine location), the system will not provide a user location estimate | |
| that’s more accurate than a city block.</p> | |
| </li> | |
| <li>Some <b>device settings</b> defined by {@link android.provider.Settings.System} are now | |
| read-only. If your app attempts to write changes to settings defined in {@link | |
| android.provider.Settings.System} that have moved to {@link android.provider.Settings.Global}, | |
| the write operation will silently fail when running on Android 4.2 and higher. | |
| <p>Even if your value for <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code | |
| android:targetSdkVersion}</a> and <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#min">{@code | |
| android:minSdkVersion}</a> is lower than 17, your app is not able to modify the settings that have | |
| moved to {@link android.provider.Settings.Global} when running on Android 4.2 and higher.</p> | |
| </li> | |
| <li>If your app uses {@link android.webkit.WebView}, Android 4.2 adds an additional layer of | |
| security so you can more safely <b>bind JavaScript to your | |
| Android code</b>. If you set your | |
| <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> | |
| to 17 or higher, you must now add the {@code @JavascriptInterface} annotation to any method that you | |
| want available to your JavaScript (the method must also be public). If you do not provide the | |
| annotation, the method is not accessible by a web page in your {@link android.webkit.WebView} | |
| when running on Android 4.2 or higher. If you set the | |
| <a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">{@code targetSdkVersion}</a> | |
| to 16 or lower, the annotation is not required, but we recommend that you update your target version | |
| and add the annotation for additional security. | |
| <p>Read more about <a href="{@docRoot}guide/webapps/webview.html#BindingJavaScript">binding | |
| JavaScript code to Android code</a>.</p></li> | |
| </ul> | |
| <h2 id="Daydream">Daydream</h2> | |
| <p>Daydream is a new interactive screensaver mode for Android devices. It activates automatically | |
| when the device is inserted into a dock or when the device is left idle while plugged in to a | |
| charger (instead of turning the screen off). Daydream displays one dream at a time, which may | |
| be a purely visual, passive display that dismisses upon touch, or may be interactive and responsive | |
| to the full suite of input events. Your dreams run in your app’s process and have full access to | |
| the Android UI toolkit, including views, layouts, and animations, so they are more flexible and | |
| powerful than either live wallpapers or app widgets.</p> | |
| <p>You can create a dream for Daydream by implementing a subclass of {@link | |
| android.service.dreams.DreamService}. The {@link android.service.dreams.DreamService} APIs are | |
| designed to be similar to those of {@link android.app.Activity}. To specify the UI for your | |
| dream, pass a layout resource ID or {@link android.view.View} to {@link | |
| android.service.dreams.DreamService#setContentView setContentView()} at any point after you have | |
| a window, such as from the {@link android.service.dreams.DreamService#onAttachedToWindow()} | |
| callback.</p> | |
| <p>The {@link android.service.dreams.DreamService} class provides other important lifecycle callback | |
| methods on top of the base {@link android.app.Service} APIs, such as {@link | |
| android.service.dreams.DreamService#onDreamingStarted()}, {@link | |
| android.service.dreams.DreamService#onDreamingStopped()}, and {@link | |
| android.service.dreams.DreamService#onDetachedFromWindow()}. | |
| You cannot initiate a {@link android.service.dreams.DreamService} from your | |
| app—it is launched automatically by the system.</p> | |
| <p>If your dream is interactive, you can start an activity from the dream to send the user into | |
| your app’s full UI for more detail or control. You can use {@link | |
| android.service.dreams.DreamService#finish()} to end the dream so the user can see the | |
| new Activity.</p> | |
| <p>To make your daydream available to the system, declare your {@link | |
| android.service.dreams.DreamService} with a <a | |
| href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>}</a> element | |
| in your manifest file. You must then include an intent filter with the action {@code | |
| "android.service.dreams.DreamService"}. For example:</p> | |
| <pre> | |
| <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> | |
| </pre> | |
| <p>There are some other useful methods in {@link android.service.dreams.DreamService} | |
| to be aware of:</p> | |
| <ul> | |
| <li>{@link android.service.dreams.DreamService#setInteractive(boolean)} controls whether | |
| the dream receives input events or exits immediately upon user input. If the dream is | |
| interactive, the user may use the <em>Back</em> or <em>Home</em> buttons to exit the dream or you can call | |
| {@link android.service.dreams.DreamService#finish()} to stop the dream.</li> | |
| <li>If you want a fully immersive display, you can call {@link | |
| android.service.dreams.DreamService#setFullscreen | |
| setFullscreen()} to hide the status bar.</li> | |
| <li>Before Daydream starts, the display dims to signal to the user that the idle timeout | |
| is approaching. Calling {@link android.service.dreams.DreamService#setScreenBright | |
| setScreenBright(true)} allows you to instead set the display at its usual brightness.</li> | |
| </ul> | |
| <p>For more information, see the {@link android.service.dreams.DreamService} documentation.</p> | |
| <h2 id="SecondaryDisplays">Secondary Displays</h2> | |
| <p>Android now allows your app to display unique content on additional screens that are connected | |
| to the user’s device over either a wired connection or Wi-Fi. | |
| To create unique content for a secondary display, extend the {@link android.app.Presentation} | |
| class and implement the {@link android.app.Presentation#onCreate onCreate()} callback. Within | |
| {@link android.app.Presentation#onCreate onCreate()}, specify your UI for the secondary display | |
| by calling {@link android.app.Presentation#setContentView setContentView()}. | |
| As an extension of the {@link android.app.Dialog} class, the {@link | |
| android.app.Presentation} class provides the region in which your app can display a unique UI on the | |
| secondary display.</p> | |
| <p>To detect secondary displays where you can display your {@link android.app.Presentation}, | |
| use either the {@link android.hardware.display.DisplayManager} or {@link android.media.MediaRouter} | |
| APIs. While the {@link android.hardware.display.DisplayManager} APIs allow you to enumerate | |
| multiple displays that may be connected at once, you should usually use {@link | |
| android.media.MediaRouter} instead to quickly access the system’s default display for | |
| presentations.</p> | |
| <p>To get the default display for your presentation, call {@link | |
| android.media.MediaRouter#getSelectedRoute MediaRouter.getSelectedRoute()} and pass it | |
| {@link android.media.MediaRouter#ROUTE_TYPE_LIVE_VIDEO}. This returns a {@link | |
| android.media.MediaRouter.RouteInfo} object that describes the system’s currently selected route | |
| for video presentations. If the {@link android.media.MediaRouter.RouteInfo} is not null, call | |
| {@link android.media.MediaRouter.RouteInfo#getPresentationDisplay()} to get the {@link | |
| android.view.Display} representing the connected display.</p> | |
| <p>You can then display your presentation by passing the {@link android.view.Display} object | |
| to a constructor for your {@link android.app.Presentation} class. Your presentation will now | |
| appear on the secondary display.</p> | |
| <p>To detect at runtime when a new display has been connected, create an instance of {@link | |
| android.media.MediaRouter.SimpleCallback} in which you implement the {@link | |
| android.media.MediaRouter.SimpleCallback#onRoutePresentationDisplayChanged | |
| onRoutePresentationDisplayChanged()} callback method, which the system will call when a new | |
| presentation display is connected. Then register the {@link | |
| android.media.MediaRouter.SimpleCallback} by passing it to {@link | |
| android.media.MediaRouter#addCallback MediaRouter.addCallback()} along with the {@link | |
| android.media.MediaRouter#ROUTE_TYPE_LIVE_VIDEO} route type. When you receive a call to | |
| {@link android.media.MediaRouter.SimpleCallback#onRoutePresentationDisplayChanged | |
| onRoutePresentationDisplayChanged()}, simply call {@link | |
| android.media.MediaRouter#getSelectedRoute MediaRouter.getSelectedRoute()} as mentioned above.</p> | |
| <p>To further optimize the UI in your {@link android.app.Presentation} for | |
| secondary screens, you can apply | |
| a different theme by specifying the {@link | |
| android.R.attr#presentationTheme android:presentationTheme} attribute in the <a | |
| href="{@docRoot}guide/topics/resources/style-resource.html">{@code <style>}</a> that you’ve | |
| applied to your application or activity.</p> | |
| <p>Keep in mind that screens connected to the user’s device often have a larger screen size and | |
| likely a different screen density. Because the screen characteristics may different, you should | |
| provide resources that are optimized specifically for such larger displays. If you need | |
| to request additional resources from your {@link | |
| android.app.Presentation}, call {@link android.app.Presentation#getContext()}{@link | |
| android.content.Context#getResources .getResources()} to get the {@link | |
| android.content.res.Resources} object corresponding to the display. This provides | |
| the appropriate resources from your app that are best suited for the | |
| secondary display's screen size and density.</p> | |
| <p>For more information and some code samples, see the {@link android.app.Presentation} | |
| class documentation.</p> | |
| <h2 id="Lockscreen">Lockscreen Widgets</h2> | |
| <p>Android now allows users to add app widgets to the lock screen. To make your <a | |
| href="{@docRoot}guide/topics/appwidgets/index.html">App Widget</a> available for use on the | |
| lock screen, add the {@link android.appwidget.AppWidgetProviderInfo#widgetCategory | |
| android:widgetCategory} attribute to your XML file that specifies the {@link | |
| android.appwidget.AppWidgetProviderInfo}. This attribute supports two values: {@code home_screen} | |
| and {@code keyguard}. By default, the attribute is set to {@code home_screen} so users can add your | |
| app widget to the Home screen. If you want your app widget to be also available on the lock | |
| screen, add the {@code keyguard} value:</p> | |
| <pre> | |
| <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" | |
| ... | |
| android:widgetCategory="keyguard|home_screen"> | |
| </appwidget-provider> | |
| </pre> | |
| <p>You should also specify an initial layout for your app widget when on the lock screen with | |
| the {@link android.appwidget.AppWidgetProviderInfo#initialKeyguardLayout | |
| android:initialKeyguardLayout} attribute. This works the same way as the {@link | |
| android.appwidget.AppWidgetProviderInfo#initialLayout android:initialLayout}, in that it provides | |
| a layout that can appear immediately until your app widget is initialized and able to update the | |
| layout.</p> | |
| <p>For more information about building app widgets for the lock screen, including to properly | |
| size your app widget when on the lock screen, see the <a | |
| href="{@docRoot}guide/topics/appwidgets/index.html#lockscreen">App Widgets</a> guide.</p> | |
| <h2 id="MultipleUsers">Multiple Users</h2> | |
| <p>Android now allows multiple user spaces on shareable devices such as tablets. Each user on a | |
| device has his or her own set of accounts, apps, system settings, files, and any other | |
| user-associated data.</p> | |
| <p>As an app developer, there’s nothing different you need to do in order for your app to work | |
| properly with multiple users on a single device. Regardless of how many users may exist on a | |
| device, the data your app saves for a given user is kept separate from the data your app saves | |
| for other users. The system keeps track of which user data belongs to the user process in which | |
| your app is running and provides your app access to only that user’s data and does not allow | |
| access to other users’ data.</p> | |
| <h3>Saving data in a multi-user environment</h3> | |
| <p>Whenever your app saves user preferences, creates a database, or writes a file to the user’s | |
| internal or external storage space, that data is accessible only while running as that user.</p> | |
| <p>To be certain that your app behaves properly in a multi-user environment, do not refer to your | |
| internal app directory or external storage location using hard-coded paths and instead always use | |
| the appropriate APIs:</p> | |
| <ul> | |
| <li>For access to internal storage, use {@link android.content.Context#getFilesDir()}, {@link | |
| android.content.Context#getCacheDir()}, or {@link android.content.Context#openFileOutput | |
| openFileOutput()}.</li> | |
| <li>For access to external storage, use {@link android.content.Context#getExternalFilesDir | |
| getExternalFilesDir()} or {@link android.os.Environment#getExternalStoragePublicDirectory | |
| getExternalStoragePublicDirectory()}. | |
| </ul> | |
| <p>No matter which of these APIs you use to save data for a given user, the data will not be | |
| accessible while running as a different user. From your app’s point of view, each user is running | |
| on a completely separate device.</p> | |
| <h3>Identifying users in a multi-user environment</h3> | |
| <p>If your app wants to identify unique users such as to gather analytics or create other account | |
| associations, you should follow the recommended practices for <a | |
| href="http://android-developers.blogspot.com/2011/03/identifying-app-installations.html">identifying | |
| unique installations</a>. By creating a new {@link java.util.UUID} when your app starts for the | |
| first time, you’re certain to obtain a unique ID for tracking each user, regardless of how many | |
| users install your app on a single device. Alternatively, you can save a local token fetched from | |
| your server or use the registrations ID provided by <a | |
| href="{@docRoot}google/gcm/index.html">Google Cloud Messaging</a>.</p> | |
| <p>Beware that if your app requests one of the hardware device identifiers (such as the WiFi MAC | |
| address or the {@link android.os.Build#SERIAL} number), they will provide the same value for each | |
| user because these identifiers are tied to the hardware and not the user. Not to mention the other | |
| problems these identifiers introduce as discussed in the <a | |
| href="http://android-developers.blogspot.com/2011/03/identifying-app-installations.html">Identifying | |
| App Installations</a> blog post.</p> | |
| <h3>New Global Settings</h3> | |
| <p>The system settings have been updated to support multiple users with the addition of {@link | |
| android.provider.Settings.Global}. This collection of settings is similar to {@link | |
| android.provider.Settings.Secure} settings because they are read-only, but applies globally across | |
| all user spaces on the device.</p> | |
| <p>Several existing settings were relocated here from either {@link | |
| android.provider.Settings.System} or {@link android.provider.Settings.Secure}. If your app is | |
| currently making changes to settings previously defined in {@link android.provider.Settings.System} | |
| (such as {@link android.provider.Settings.System#AIRPLANE_MODE_ON}), then you should expect that | |
| doing so will no longer work on a device running Android 4.2 or higher if those settings were | |
| moved to {@link android.provider.Settings.Global}. You can continue to read settings that are in | |
| {@link android.provider.Settings.Global}, but because the settings are no longer considered safe | |
| for apps to change, attempting to do so will fail silently and the system will write a warning to | |
| the system log when running your app on Android 4.2 or higher.</p> | |
| <h2 id="RTL">RTL Layout Support</h2> | |
| <p>Android now offers several APIs that allow you to build user interfaces that gracefully | |
| transform layout orientation to support languages that use right-to-left (RTL) UIs and reading | |
| direction, such as Arabic and Hebrew.</p> | |
| <p>To begin supporting RTL layouts in your app, set the {@link android.R.attr#supportsRtl | |
| android:supportsRtl} attribute to the {@code <application>} element in your manifest file | |
| and set it {@code “true"}. Once you enable this, the system will enable various RTL APIs to | |
| display your app with RTL layouts. For instance, the action bar will show the icon and title | |
| on the right side and action buttons on the left, and any layouts you’ve created with the | |
| framework-provided {@link android.view.View} classes will also be reversed.</p> | |
| <p>If you need to further optimize the appearance of your app when displayed with an RTL layout, | |
| there are two basic levels of optimization:</p> | |
| <ol> | |
| <li>Convert left- and right-oriented layout properties to start- and end-oriented layout | |
| properties. | |
| <p>For example, use {@link android.R.attr#layout_marginStart android:layout_marginStart} | |
| in place of {@code android:layout_marginLeft} and {@link android.R.attr#layout_marginEnd | |
| android:layout_marginEnd} in place of {@code android:layout_marginRight}. | |
| <p>The {@link android.widget.RelativeLayout} class also provides the corresponding layout | |
| attributes to replace left/right positions, such as {@code android:layout_alignParentStart} to | |
| replace {@code android:layout_alignParentLeft} and {@code android:layout_toStartOf} instead of | |
| {@code android:layout_toLeftOf}. | |
| </li> | |
| <li>Or to provide complete optimization for RTL layouts, you can provide entirely separate | |
| layout files using the {@code ldrtl} resource qualifier ({@code ldrtl} stands for | |
| layout-direction-right-to-left}). For example, you can save your default layout files in | |
| {@code res/layout/} and your RTL optimized layouts in {@code res/layout-ldrtl/}. | |
| <p>The {@code ldrtl} qualifier is great for drawable resources, so that you can provide | |
| graphics that are oriented in the direction corresponding to the reading direction.</p> | |
| </li> | |
| </ol> | |
| <p>Various other APIs are available across the framework to support RTL layouts, such as in | |
| the {@link android.view.View} class so that you can implement the proper behaviors for custom | |
| views and in {@link android.content.res.Configuration} to query the current layout direction.</p> | |
| <p><strong>Note:</strong> If you are using SQlite and have tables or column names that are | |
| “number only," be | |
| careful: using <a href="{@docRoot}reference/java/lang/String.html#format(String, Object...)">{@code | |
| String.format(String, Object...)}</a> can lead to errors where the numbers | |
| have been converted to their Arabic equivalents if your device has been set to the Arabic locale. | |
| You must use <a href="{@docRoot}reference/java/lang/String.html#format(Locale,String,Object...)">{@code | |
| String.format(Locale,String,Object...)}</a> to ensure numbers are | |
| preserved as ASCII. Also use <a href="{@docRoot}reference/java/lang/String.html#format(String,int)">{@code | |
| String.format("%d", int)}</a> instead of using | |
| <a href="{@docRoot}reference/java/lang/String.html#valueOf(int)">{@code String.valueOf(int)}</a> for | |
| formatting numbers.</p> | |
| <h2 id="NestedFragments">Nested Fragments</h2> | |
| <p>You can now embed fragments inside fragments. This is useful for a variety of situations in | |
| which you want to place dynamic and re-usable UI components into a UI component that is itself | |
| dynamic and re-usable. For example, if you use {@link android.support.v4.view.ViewPager} to | |
| create fragments that swipe left and right and consume a majority of the screen space, you can | |
| now insert fragments into each fragment page.</p> | |
| <p>To nest a fragment, simply call {@link android.app.Fragment#getChildFragmentManager()} on | |
| the {@link android.app.Fragment} in which you want to add a fragment. This returns a {@link | |
| android.app.FragmentManager} that you can use like you normally do from the top-level activity | |
| to create fragment transactions. For example, here’s some code that adds a fragment from within | |
| an existing {@link android.app.Fragment} class:</p> | |
| <pre> | |
| Fragment videoFragment = new VideoPlayerFragment(); | |
| FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); | |
| transaction.add(R.id.video_fragment, videoFragment).commit(); | |
| </pre> | |
| <p>From within a nested fragment, you can get a reference to the parent fragment by calling | |
| {@link android.app.Fragment#getParentFragment()}.</p> | |
| <p>The Android Support Library also now supports nested fragments, so you can implement nested | |
| fragment designs on Android 1.6 and higher.</p> | |
| <p><strong>Note:</strong> You cannot inflate a layout into a fragment when that layout | |
| includes a {@code <fragment>}. Nested fragments are only supported when added to a | |
| fragment dynamically.</p> | |
| <h2 id="Renderscript">Renderscript</h2> | |
| <p>Renderscript computation functionality has been enhanced with the following features:</p> | |
| <dl> | |
| <dt><b>Script intrinsics</b></dt> | |
| <dd><p>You can use Renderscript's built-in script intrinsics that implement | |
| common operations for you such as:</p> | |
| <ul> | |
| <li>{@link android.renderscript.ScriptIntrinsicBlend Blends}</li> | |
| <li>{@link android.renderscript.ScriptIntrinsicBlur Blur}</li> | |
| <li>{@link android.renderscript.ScriptIntrinsicColorMatrix Color matrix}</li> | |
| <li>{@link android.renderscript.ScriptIntrinsicConvolve3x3 3x3 convolve}</li> | |
| <li>{@link android.renderscript.ScriptIntrinsicConvolve5x5 5x5 convolve}</li> | |
| <li>{@link android.renderscript.ScriptIntrinsicLUT Per-channel lookup table}</li> | |
| <li>{@link android.renderscript.ScriptIntrinsicYuvToRGB Converting an Android YUV buffer to RGB}</li> | |
| </ul> | |
| <p>To use a script intrinsic, call the static <code>create()</code> method of each instrinsic | |
| to create an instance of the script. You then call the available <code>set()</code> | |
| methods of each script intrinsic to set any necessary inputs and options. | |
| Finally, call the {@link android.renderscript.ScriptC#forEach forEach()}</code> | |
| method to execute the script.</p> | |
| </dd> | |
| <dt><b>Script Groups</b></dt> | |
| <dd> | |
| <p>{@link android.renderscript.ScriptGroup}s allow you to chain together related Renderscript | |
| scripts and execute them with one call.</p> | |
| <p>Use a {@link android.renderscript.ScriptGroup.Builder} to add all of the scripts to the group | |
| by calling {@link android.renderscript.ScriptGroup.Builder#addKernel addKernel()}. Once you | |
| add all the scripts, create the connections between the | |
| scripts by calling {@link android.renderscript.ScriptGroup.Builder#addConnection addConnection()}. | |
| When you are done adding the connections, call {@link android.renderscript.ScriptGroup.Builder#create create()} | |
| to create the script group. Before executing the script group, specify the input | |
| {@link android.renderscript.Allocation} and initial script to run with the | |
| {@link android.renderscript.ScriptGroup#setInput} method and provide the output | |
| {@link android.renderscript.Allocation} where the result will be written to and final script to | |
| run with {@link android.renderscript.ScriptGroup#setOutput setOutput()}. Finally, call | |
| {@link android.renderscript.ScriptGroup#execute execute()} to run the script group. | |
| </p> | |
| </dd> | |
| <dt><b>Filterscript</b></dt> | |
| <dd> | |
| <p>Filterscript defines constraints on the existing Renderscript APIs that allow the resulting code to run | |
| on a wider variety of processors (CPUs, GPUs, and DSPs). To create Filterscript files, create <code>.fs</code> | |
| files instead of <code>.rs</code> files, and specify <code>#pragma rs_fp_relaxed</code> to | |
| tell the Renderscript runtime your scripts do not require strict IEEE 754-2008 floating point precision. | |
| This precision allows flush-to-zero for denorms and round-towards-zero. In addition, your Filterscript | |
| scripts must not use 32-bit built-in types and must specify a custom root function by using the | |
| <code>__attribute__((kernel))</code> attribute because Filterscript does not support pointers, which | |
| the default signature of the <code>root()</code> function defines.</p> | |
| </dd> | |
| </dl> | |
| <p class="note"><strong>Note:</strong> Although Filterscript support is in the platform, developer | |
| support will be available in SDK Tools Release 21.0.1. </p> | |
| <p>For a detailed view of all API changes in Android 4.2, see the | |
| <a href="{@docRoot}sdk/api_diff/17/changes.html">API Differences Report</a>.</p> | |