| 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 ADT and 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> |
| |
| |
| |