{"id":216722,"date":"2024-03-25T09:39:16","date_gmt":"2024-03-25T09:39:16","guid":{"rendered":"https:\/\/michigandigitalnews.com\/index.php\/2024\/03\/25\/the-second-developer-preview-of-android-15\/"},"modified":"2025-06-25T17:19:58","modified_gmt":"2025-06-25T17:19:58","slug":"the-second-developer-preview-of-android-15","status":"publish","type":"post","link":"https:\/\/michigandigitalnews.com\/index.php\/2024\/03\/25\/the-second-developer-preview-of-android-15\/","title":{"rendered":"The Second Developer Preview of Android 15"},"content":{"rendered":"<p> [ad_1]<br \/>\n<\/p>\n<div>\n<meta content=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjW1UxJk2BEGQu-9eSLY0fV6wrCb0FJTo_-rMykFO0wUDajMwXeF7CgXx9MBKZcOLhd5bOikhbK9PWvM3aYfncnDn_Lba0ASuchSeKbpt4ZWcmcEHDK8_W6-_C2DnWs3T7v1DPk2EtTAH_amWewikG5f9NDadQSJ6DbcwiTKEG0XtlO_f250KaNRz76Jcg\/s1600\/AD-15-Developer-Preview.png\" name=\"twitter:image\"\/><br \/>\n<img decoding=\"async\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjW1UxJk2BEGQu-9eSLY0fV6wrCb0FJTo_-rMykFO0wUDajMwXeF7CgXx9MBKZcOLhd5bOikhbK9PWvM3aYfncnDn_Lba0ASuchSeKbpt4ZWcmcEHDK8_W6-_C2DnWs3T7v1DPk2EtTAH_amWewikG5f9NDadQSJ6DbcwiTKEG0XtlO_f250KaNRz76Jcg\/s1600\/AD-15-Developer-Preview.png\" style=\"display: none;\"\/><\/p>\n<p><em> Posted by <a href=\"https:\/\/twitter.com\/davey_burke\" target=\"_blank\" rel=\"noopener\">Dave Burke<\/a>, VP of Engineering <\/em><\/p>\n<div class=\"separator\" style=\"border: 0px; clear: both; float: right; padding: 0px; width: 45%;\"><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgX98TKIsaJF7D4wnq7YBOuMjtYH-6D5Kgm7m7VbRek7cQIGN7TNVtJMDIbSiEG5KgcGyGpgGxEOz7u9v-WhQASrQrjvCQF8-RQ7PsZpA6djqK7RA7mXrnt6aYiac8voLef_mhP-s_TucPVEP1vvmUBjspmjA2RdrbvIqVwYXQJZ1fwPyamJIxXTrgMVmg\/s1600\/image1.png\" style=\"display: block; padding: 1em 0px; text-align: center;\"><br \/><\/a><a href=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgX98TKIsaJF7D4wnq7YBOuMjtYH-6D5Kgm7m7VbRek7cQIGN7TNVtJMDIbSiEG5KgcGyGpgGxEOz7u9v-WhQASrQrjvCQF8-RQ7PsZpA6djqK7RA7mXrnt6aYiac8voLef_mhP-s_TucPVEP1vvmUBjspmjA2RdrbvIqVwYXQJZ1fwPyamJIxXTrgMVmg\/s1600\/image1.png\" style=\"display: block; padding: 1em 0px; text-align: center;\"><img fetchpriority=\"high\" decoding=\"async\" alt=\"Android 14 logo\" border=\"0\" data-original-height=\"512\" data-original-width=\"512\" height=\"320\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgX98TKIsaJF7D4wnq7YBOuMjtYH-6D5Kgm7m7VbRek7cQIGN7TNVtJMDIbSiEG5KgcGyGpgGxEOz7u9v-WhQASrQrjvCQF8-RQ7PsZpA6djqK7RA7mXrnt6aYiac8voLef_mhP-s_TucPVEP1vvmUBjspmjA2RdrbvIqVwYXQJZ1fwPyamJIxXTrgMVmg\/s1600\/image1.png\" width=\"320\"\/><\/a><\/div>\n<p>Today marks the second chapter of the Android 15 story with the release of Android 15 Developer Preview 2!<\/p>\n<p>Android 15 continues our work to build a platform that helps improve your productivity while giving you new capabilities to produce <a href=\"http:\/\/d.android.com\/media\" target=\"_blank\" rel=\"noopener\">superior media<\/a> and <a href=\"https:\/\/developer.android.com\/ml\/aicore\" target=\"_blank\" rel=\"noopener\">AI experiences<\/a>, take advantage of device form factors, <a href=\"https:\/\/developer.android.com\/develop\/background-work\/background-tasks\" target=\"_blank\" rel=\"noopener\">minimize battery impact<\/a>, <a href=\"https:\/\/developer.android.com\/topic\/performance\/baselineprofiles\/overview\" target=\"_blank\" rel=\"noopener\">maximize smooth app performance<\/a>, and <a href=\"https:\/\/developer.android.com\/privacy-and-security\/about\" target=\"_blank\" rel=\"noopener\">protect user privacy and security<\/a>, all on the most diverse lineup of devices out there.<\/p>\n<p>Android continues to add features enabling your apps to take advantage of premium device hardware, including the latest telecommunications features, high-end media capabilities, dazzling displays, foldable\/filppable form factors, and AI processing.<\/p>\n<p>Your feedback on the Android 15 Developer Preview and Beta program plays a key role in helping Android continuously improve. The <a href=\"https:\/\/developer.android.com\/about\/versions\/15\" target=\"_blank\" rel=\"noopener\">Android 15 developer site<\/a> has more information about the preview, including downloads for Pixel and detailed documentation about changes. This preview is just the beginning, and we\u2019ll have lots more to share as we move through the release cycle. Thank you in advance for your help in making Android a platform that works for everyone.<\/p>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">Updating Android communications<\/span><\/h3>\n<p>Android 15 updates the platform to give your app access to the latest advances in communication.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Satellite support<\/span><\/h4>\n<p>Android 15 continues to extend platform support for satellite connectivity and includes some UI elements to ensure a consistent user experience across the satellite connectivity landscape.<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"screen schot of a mobile Android device showing notification when device connects to satellite\" border=\"0\" height=\"400\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEjhYamLzA7BrwXPi87If8wLEFGN_Nij6N4hpox0P1jRBvRQYXyuimQFhSCqw9Krbjp55WQK8tqVycR4Gr901oL5ocas-19FkIfmr7F-wH-Dqsr1kDrTpNrc9EOP2cWpiC9h-qkfVl_-b3iqIr7m_4V3Tju-REVpCh1jjSSfipvuTaRrxN39PGhF119EYZw\/w398-h400\/image9.png\" width=\"398\"\/><\/div>\n<p><imgcaption><center><em>Notification when device connects to satellite<\/em><\/center><\/imgcaption><\/image><\/p>\n<p>Apps can use <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/telephony\/ServiceState?#isUsingNonTerrestrialNetwork%28%29\" target=\"_blank\" rel=\"noopener\">ServiceState.isUsingNonTerrestrialNetwork()<\/a><\/span> to detect when a device is connected to a satellite, giving them more awareness of why full network services may be unavailable. Additionally, Android 15 provides support for SMS\/ MMS applications as well as preloaded RCS applications to use satellite connectivity for sending and receiving messages.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Smoother NFC experiences<\/span><\/h4>\n<p>Android 15 is working to make the tap to pay experience more seamless and reliable while continuing to support Android&#8217;s robust NFC app ecosystem. On supported devices, apps can request the <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/nfc\/NfcAdapter\" target=\"_blank\" rel=\"noopener\">NfcAdapter<\/a><\/span> enter <a href=\"https:\/\/developer.android.com\/reference\/android\/nfc\/NfcAdapter#setObserveModeEnabled%28boolean%29\" target=\"_blank\" rel=\"noopener\">observe mode<\/a>, where the device will listen but not respond to NFC readers, sending the app&#8217;s NFC service <span style=\"color: #0d904f; font-family: Courier;\">PollingFrame<\/span> objects to process. The <span style=\"color: #0d904f; font-family: Courier;\"><a href=\"https:\/\/develpoer.android.com\/reference\/android\/nfc\/cardemulation\/HostApduService#processPollingFrames%28java.util.List%3Candroid.nfc.cardemulation.PollingFrame%3E%29\" target=\"_blank\" rel=\"noopener\">PollingFrame<\/a><\/span> objects<\/p>\n<p> can be used to auth ahead of the first communication to the NFC reader, allowing for a one tap transaction in many cases.<\/p>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">Developer productivity<\/span><\/h3>\n<p>While most of our work to improve your productivity centers around tools like <a href=\"https:\/\/developer.android.com\/studio\" target=\"_blank\" rel=\"noopener\">Android Studio<\/a>, <a href=\"https:\/\/developer.android.com\/jetpack\/compose\" target=\"_blank\" rel=\"noopener\">Jetpack Compose<\/a>, and the <a href=\"https:\/\/developer.android.com\/jetpack\" target=\"_blank\" rel=\"noopener\">Android Jetpack<\/a> libraries, we always look for ways in the platform to help you more easily realize your vision.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">PDF Improvements<\/span><\/h4>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"screen schot of a mobile Android device showing search enabled for PDF files\" border=\"0\" height=\"400\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEh36mJzos5LY2bD15mJlcRj-VfIQZB07DKp5IywaEyMINjFjgh7a1czQRjd5-ivyLb2dVEo3mZEOkLNA2jk7HUDquzUQeC4yx-lkaQcpk09M5BLkq4aIdJguK7DL3N_aypEWpfUAqHqealv_TMqzEPZQW6GY8qO-X5CXrN-jjLgf09GsVVBS7j1KvbOGnM\/s1600\/image3.png\" width=\"398\"\/><\/div>\n<p><imgcaption><center><em>Enable searching embedded PDF files with updates to <span style=\"color: #0d904f; font-family: Courier;\">PdfRenderer<\/span><\/em><\/center><\/imgcaption><\/image><\/p>\n<p>Android 15 Developer Preview 2 includes an early preview of substantial improvements to the <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/graphics\/pdf\/PdfRenderer\" target=\"_blank\" rel=\"noopener\">PdfRenderer APIs<\/a><\/span>, giving apps capabilities to incorporate advanced features such as rendering <a href=\"https:\/\/developer.android.com\/reference\/android\/graphics\/pdf\/LoadParams\" target=\"_blank\" rel=\"noopener\">password-protected files<\/a>, annotations, <a href=\"https:\/\/developer.android.com\/reference\/android\/graphics\/pdf\/models\/FormEditRecord\" target=\"_blank\" rel=\"noopener\">form editing<\/a>, <a href=\"https:\/\/develpoer.android.com\/reference\/android\/graphics\/pdf\/PdfRenderer.Page#searchText%28java.lang.String%29\" target=\"_blank\" rel=\"noopener\">searching<\/a>, and <a href=\"https:\/\/developer.android.com\/reference\/android\/graphics\/pdf\/PdfRenderer.Page#selectContent%28android.graphics.pdf.models.selection.SelectionBoundary,%20android.graphics.pdf.models.selection.SelectionBoundary,%20boolean%29\" target=\"_blank\" rel=\"noopener\">selection<\/a> with copy. Linearized PDF optimizations are supported to speed local PDF viewing and reduce resource use.<\/p>\n<p>The PdfRenderer has been moved to a module that can be updated using Google Play system updates independent of the platform release, and we&#8217;re supporting these changes back to Android R by creating a compatible pre-Android 15 version of the API surface, called <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/graphics\/pdf\/PdfRendererPreV\" target=\"_blank\" rel=\"noopener\">PdfRendererPreV<\/a><\/span>.<\/p>\n<p>We value your feedback on the enhancements we&#8217;ve made to the PdfRenderer API surface, and we plan to make it much easier to incorporate these APIs into your app with an upcoming Android Jetpack library. Stay tuned.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Automatic language switching refinements<\/span><\/h4>\n<p>Android 14 added on-device multi-language audio recognition with automatic switching between languages, but this can cause words to get dropped, especially when languages switch with less of a pause between the two utterances. Android 15 has added additional controls to allow apps to help tune this switching for their use case. <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/speech\/RecognizerIntent#EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS\" target=\"_blank\" rel=\"noopener\">EXTRA_LANGUAGE_SWITCH_INITIAL_ACTIVE_DURATION_TIME_MILLIS<\/a><\/span> confines the automatic switching to the beginning of the audio session, while <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/speech\/RecognizerIntent#EXTRA_LANGUAGE_SWITCH_MAX_SWITCHES\" target=\"_blank\" rel=\"noopener\">EXTRA_LANGUAGE_SWITCH_MATCH_SWITCHES<\/a><\/span> deactivates the language switching after a defined number of switches. This can be a useful refinement, particularly if the expectation is that there will be a single language spoken during the session that should be autodetected.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Granular line break controls<\/span><\/h4>\n<p>Starting in Android 15, the <a href=\"https:\/\/developer.android.com\/reference\/android\/widget\/TextView\" target=\"_blank\" rel=\"noopener\">TextView<\/a> and the underlying line breaker can preserve the given portion of text in the same line to improve readability. You can take advantage of this line break customization by using the &lt;nobreak&gt; tag in string resources or <a href=\"https:\/\/developer.android.com\/reference\/android\/text\/style\/LineBreakConfigSpan#createNoBreakSpan%28%29\" target=\"_blank\" rel=\"noopener\">createNoBreakSpan<\/a>. Similarly, you can preserve words from hyphenation by using the &lt;nohyphen&gt; tag or <a href=\"https:\/\/developer.android.com\/reference\/android\/text\/style\/LineBreakConfigSpan#createNoHyphenationSpan%28%29\" target=\"_blank\" rel=\"noopener\">createNoHyphenationSpan<\/a>.<\/p>\n<p>Examples and screenshots:<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">&lt;resources&gt;\n    &lt;string name=<span style=\"color: #ba2121;\">\"pixel8pro\"<\/span>&gt;The power and brains behind Pixel <span style=\"color: #666666;\">8<\/span> Pro.&lt;\/string&gt;\n&lt;\/resources&gt;<\/span>\n<\/pre>\n<\/div>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"text reads: The power and brains behind Pixel 8 Pro.\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgar54Zl0G5tyzWAkSOoO40W7DF1VZ1npSpmEFQ2LzqX96AGqFApCocUnpx6BulUMjGN8tlObI5PgXieBOXki89MND6oJ5zNxDCjrsVUoMZheLNQrKP6xly2AgCRxQG7EZS6tbmab-5OZ0YpeCLw2NfFGnAEyCiRxn5fPqoec-M3AVIMQLpKjqTGPvPRcg\/s16000\/image5.png\"\/><\/div>\n<p><\/image><\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">&lt;resources&gt;\n    &lt;string name=<span style=\"color: #ba2121;\">\"pixel8pro\"<\/span>&gt;The power and brains behind &lt;nobreak&gt;Pixel <span style=\"color: #666666;\">8<\/span> Pro.&lt;\/nobreak&gt;&lt;\/string&gt;\n&lt;\/resources&gt;<\/span>\n<\/pre>\n<\/div>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"text reads: The power and brains behind Pixel 8 Pro.\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEhZdUj8c4odSyWPBtt9_wbS9i94WuLjKrNFeFcUQgnwrYYNoIYsj698QrucdZEmweynlGBMd8KjbjY_sfGKXU1gNznGtitKzaCVObhBqzkJJFP46vgDIrCMYu9nXdmW3WAC5kWl4_4GAftwc_QkRLl8kFBcd2Dy1AKt5U1FQ4X21bO0FwbebNDO3gvmMak\/s16000\/image4.png\"\/><\/div>\n<p><\/image><\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Expanded IntentFilter Functionality<\/span><\/h4>\n<p>Android 15 builds-in support for more precise Intent resolution through <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/content\/UriRelativeFilterGroup\" target=\"_blank\" rel=\"noopener\">UriRelativeFilterGroup<\/a><\/span>, which contain a set of <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/content\/UriRelativeFilter\" target=\"_blank\" rel=\"noopener\">UriRelativeFilter<\/a><\/span> objects that form a set of Intent matching rules that must each be satisfied, including URL query parameters, URL fragments, and blocking\/exclusion rules. This helps applications better keep up with the dynamic demands of web-hosted deep links.<\/p>\n<p>These rules can be defined in the <span style=\"color: #0d904f; font-family: courier;\">AndroidManifest<\/span> with the new &lt;uri-relative-filter-group&gt; tag which can optionally include an <span style=\"color: #0d904f; font-family: Courier;\">android:allow\u00a0<\/span>tag. These tags can contain <data> tags that use existing data tag attributes as well as the <span style=\"color: #0d904f; font-family: Courier;\">new android:query<\/span> and <span style=\"color: #0d904f; font-family: Courier;\">android:fragment<\/span> attributes.<\/data><\/p>\n<p>An example of the <span style=\"color: #0d904f; font-family: courier;\">AndroidManifest<\/span> syntax that will be supported:<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\">&lt;intent-filter&gt;\n  &lt;action android:name=<span style=\"color: #ba2121;\">\"android.intent.action.VIEW\"<\/span> \/&gt;\n  &lt;category android:name=<span style=\"color: #ba2121;\">\"android.intent.category.BROWSABLE\"<\/span> \/&gt;\n  &lt;data android:scheme=<span style=\"color: #ba2121;\">\"http\"<\/span> \/&gt;\n  &lt;data android:scheme=<span style=\"color: #ba2121;\">\"https\"<\/span> \/&gt;\n  &lt;data android:domain=<span style=\"color: #ba2121;\">\"astore.com\"<\/span> \/&gt;\n  &lt;uri-relative-filter-group&gt;\n    &lt;data android:pathPrefix=<span style=\"color: #ba2121;\">\"\/auth\"<\/span> \/&gt;\n    &lt;data android:query=<span style=\"color: #ba2121;\">\"region=na\"<\/span> \/&gt;\n  &lt;\/uri-relative-filter-group&gt;\n  &lt;uri-relative-filter-group android:allow=<span style=\"color: #ba2121;\">\"false\"<\/span>&gt;\n    &lt;data android:pathPrefix=<span style=\"color: #ba2121;\">\"\/auth\"<\/span> \/&gt;\n    &lt;data android:query=<span style=\"color: #ba2121;\">\"mobileoptout=true\"<\/span> \/&gt;\n  &lt;\/uri-relative-filter-group&gt;\n  &lt;uri-relative-filter-group android:allow=<span style=\"color: #ba2121;\">\"false\"<\/span>&gt;\n    &lt;data android:pathPrefix=<span style=\"color: #ba2121;\">\"\/auth\"<\/span> \/&gt;\n    &lt;data android:fragmentPrefix=<span style=\"color: #ba2121;\">\"faq\"<\/span> \/&gt;\n  &lt;\/uri-relative-filter-group&gt;\n&lt;\/intent-filter&gt;<\/span>\n<\/pre>\n<\/div>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">More OpenJDK API support<\/span><\/h4>\n<p>Android 15 continues to add OpenJDK APIs. Developer Preview 2 includes support for additional <a href=\"https:\/\/developer.android.com\/sdk\/api_diff\/v-dp2-incr\/changes\/java.lang.Math\" target=\"_blank\" rel=\"noopener\">math<\/a>\/<a href=\"https:\/\/developer.android.com\/sdk\/api_diff\/v-dp2-incr\/changes\/java.lang.StrictMath\" target=\"_blank\" rel=\"noopener\">strictmath<\/a> methods, lots of <a href=\"https:\/\/developer.android.com\/sdk\/api_diff\/v-dp2-incr\/changes\/pkg_java.util\" target=\"_blank\" rel=\"noopener\">util updates<\/a> including sequenced <a href=\"https:\/\/developer.android.com\/reference\/java\/util\/SequencedCollection\" target=\"_blank\" rel=\"noopener\">collection<\/a>\/<a href=\"https:\/\/developer.android.com\/reference\/java\/util\/SequencedMap\" target=\"_blank\" rel=\"noopener\">map<\/a>\/<a href=\"https:\/\/developer.android.com\/reference\/java\/util\/SequencedSet\" target=\"_blank\" rel=\"noopener\">set<\/a>, <a href=\"https:\/\/developer.android.com\/sdk\/api_diff\/v-dp2-incr\/changes\/java.util.zip.Deflater\" target=\"_blank\" rel=\"noopener\">ByteBuffer support in Deflater<\/a>, and <a href=\"https:\/\/developer.android.com\/sdk\/api_diff\/v-dp2-incr\/changes\/pkg_java.security.spec\" target=\"_blank\" rel=\"noopener\">security key updates<\/a>. These APIs are updated on <a href=\"https:\/\/android-developers.googleblog.com\/2023\/11\/the-secret-to-androids-improved-memory-latest-android-runtime-update.html\" target=\"_blank\" rel=\"noopener\">over a billion devices running Android 12+ through Android 15 through Google Play System updates<\/a> so you can target the latest programming features.<\/p>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">Giving your app more flexibility on more screens<\/span><\/h3>\n<p>Android 15 gives your apps the support to get the most out of Android&#8217;s form factors, including large screens, flippables, and foldables.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Cover screen support<\/span><\/h4>\n<p>Your app can <a href=\"https:\/\/developer.android.com\/reference\/android\/view\/WindowManager#COMPAT_SMALL_COVER_SCREEN_OPT_IN\" target=\"_blank\" rel=\"noopener\">declare a property<\/a> that Android 15 uses to allow your Application or Activity to be presented on the small cover screens of supported flippable devices. These screens are too small to be considered as compatible targets for Android apps to run on, but your app can opt-in to supporting them, making your app available in more places.<\/p>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">A more private, secure Android<\/span><\/h3>\n<p>We&#8217;re always looking to give users more transparency and control over their data while enhancing the core security features of the platform.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Screen record detection<\/span><\/h4>\n<p>Android 15 adds <a href=\"https:\/\/developer.android.com\/reference\/android\/view\/WindowManager?hl=en#addScreenRecordingCallback%28java.util.concurrent.Executor,%20java.util.function.Consumer%3Cjava.lang.Integer%3E%29\" target=\"_blank\" rel=\"noopener\">support for apps<\/a> to detect that they are being recorded. A callback is invoked whenever the app transitions between being visible or invisible within a screen recording. (An app is considered visible if activities owned by the registering process&#8217;s UID are being recorded.) This way, if your app is performing a sensitive operation, you can inform the user that they&#8217;re being recorded.<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\"><span style=\"color: green; font-weight: bold;\">val<\/span> mCallback = Consumer&lt;Int&gt; { state -&gt;\n  <span style=\"color: green; font-weight: bold;\">if<\/span> (state == SCREEN_RECORDING_STATE_VISIBLE) {\n    <span style=\"color: #408080; font-style: italic;\">\/\/ we're being recorded<\/span>\n  } <span style=\"color: green; font-weight: bold;\">else<\/span> {\n    <span style=\"color: #408080; font-style: italic;\">\/\/ we\u2019re not being recorded<\/span>\n  }\n}\n\n<span style=\"color: green; font-weight: bold;\">override<\/span> <span style=\"color: green; font-weight: bold;\">fun<\/span> <span style=\"color: blue;\">onStart<\/span>() {\n   super.onStart()\n   <span style=\"color: green; font-weight: bold;\">val<\/span> initialState =\n      windowManager.addScreenRecordingCallback(mainExecutor, mCallback)\n   mCallback.accept(initialState)\n}\n\n<span style=\"color: green; font-weight: bold;\">override<\/span> <span style=\"color: green; font-weight: bold;\">fun<\/span> <span style=\"color: blue;\">onStop<\/span>() {\n    super.onStop()\n    windowManager.removeScreenRecordingCallback(mCallback)\n}<\/span>\n<\/pre>\n<\/div>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">Making Android more efficient<\/span><\/h3>\n<p>We are introducing new APIs that can help you gather insights about your apps, continuing to optimize the way background applications work, and providing APIs to help make tasks in your app more efficient to execute.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">ApplicationStartInfo API<\/span><\/h4>\n<p>App startup on Android has always been a bit of a mystery. There was no easy way to know within your app whether it started from a cold, warm, or hot state. It was difficult to know how long your app spent during the various launch phases: forking the process, calling onCreate, drawing the first frame, and more. When your application class was instantiated, you had no way of knowing whether the app started from a broadcast,  a content provider, a job, a backup, boot complete, an alarm, or an Activity.<\/p>\n<p>The <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/app\/ApplicationStartInfo\" target=\"_blank\" rel=\"noopener\">ApplicationStartInfo<\/a><\/span> API on Android 15 gives you all of this and more. You can even choose to add your own timestamps into the flow to make it easy to collect timing data in one place. In addition to collecting metrics, you can use ApplicationStartInfo to help directly optimize app startup; for example, you can eliminate the costly instantiation of UI-related libraries within your Application class when your app is starting up due to a broadcast.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Changes to package stopped state<\/span><\/h4>\n<p>Android 15 includes several improvements to the <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/pm\/PackageManager\" target=\"_blank\" rel=\"noopener\">PackageManager<\/a>\u2019s <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/pm\/ApplicationInfo#FLAG_STOPPED\" target=\"_blank\" rel=\"noopener\">Stopped State<\/a>. Apps that are in a Stopped State should only be leaving this state through direct user action. Furthermore, apps entering the Stopped State will have their <a href=\"https:\/\/developer.android.com\/reference\/android\/app\/PendingIntent\" target=\"_blank\" rel=\"noopener\">PendingIntents<\/a> removed. To help developers re-register their pending intents, apps will now receive the <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/Intent\" target=\"_blank\" rel=\"noopener\">BOOT_COMPLETED<\/a> broadcast once they are removed from the Stopped State. Lastly, the new <a href=\"https:\/\/developer.android.com\/reference\/android\/app\/ApplicationStartInfo\" target=\"_blank\" rel=\"noopener\">ApplicationStartInfo<\/a> will also include the <a href=\"https:\/\/developer.android.com\/reference\/android\/app\/ApplicationStartInfo#wasForceStopped()\" target=\"_blank\" rel=\"noopener\">ApplicationStartInfo.wasForceStopped()<\/a> to let developers know that their app was put into the Stopped State.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Detailed app size information<\/span><\/h4>\n<p>Android has offered an API, <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/app\/usage\/StorageStats#getAppBytes%28%29\" target=\"_blank\" rel=\"noopener\">StorageStats.getAppBytes()<\/a><\/span>, that summarizes the installed size of an app as a single number of bytes, which is a sum of the APK size, the size of files extracted from the APK, and files that were generated on the device such as ahead-of-time (AOT) compiled code. This number is not very insightful in terms of how your app is using storage.<\/p>\n<p>Android 15 adds the <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/app\/usage\/StorageStats#getAppBytesByDataType%28int%29\" target=\"_blank\" rel=\"noopener\">StorageStats.getAppBytesByDataType([type])<\/a><\/span> API, which allows you to get insight into how your app is using up all that space, including apk file splits, AOT and speedup related code, dex metadata, libraries, and guided profiles.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Changes to foreground services<\/span><\/h4>\n<p>Android 14 began requiring Foreground Service Types. The documentation mentions that the dataSync Foreground Service type will be deprecated in a future version of Android.<\/p>\n<p>To support migrating away from the dataSync Foreground Service type, Android 15 includes the <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/about\/versions\/15\/behavior-changes-15#mediaprocessing-fgs-type\" target=\"_blank\" rel=\"noopener\">mediaProcessing Foreground Service type<\/a><\/span>, which is used to perform time-consuming operations on media assets, like converting media to different formats. In a future Beta release, this service will have a runtime limit of 6 hours.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">SQLite database<\/span><\/h4>\n<p>Android 15 introduces new SQLite APIs that expose advanced features from the underlying SQLite engine that target specific performance issues that can manifest in apps.<\/p>\n<p>Developers should consult <a href=\"https:\/\/developer.android.com\/topic\/performance\/sqlite-performance-best-practices\" target=\"_blank\" rel=\"noopener\">best practices for SQLite performance<\/a> to get the most out of their SQLite database, especially when working with large databases or when running latency-sensitive queries.<\/p>\n<ul style=\"text-align: left;\">\n<ul>\n<li>Row counts and IDs: new APIs were added to retrieve the count of changed rows or the last inserted row ID without issuing an additional query. <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/android\/database\/sqlite\/SQLiteDatabase?hl=en#getlastchangedrowcount\" target=\"_blank\" rel=\"noopener\">getLastChangedRowCount()<\/a> will return the number of rows that were inserted, updated, or deleted by the most recent SQL statement within the current transaction, while <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/android\/database\/sqlite\/SQLiteDatabase?hl=en#gettotalchangedrowcount\" target=\"_blank\" rel=\"noopener\">getTotalChangedRowCount()<\/a> will return the count on the current connection. <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/android\/database\/sqlite\/SQLiteDatabase?hl=en#getlastinsertrowid\" target=\"_blank\" rel=\"noopener\">getLastInsertRowId()<\/a> will return the \u201crowid\u201d of the last row to be inserted on the current connection.<\/li>\n<\/ul>\n<\/ul>\n<ul style=\"text-align: left;\">\n<ul>\n<li>Raw statements: issue a raw SQlite statement, bypassing convenience wrappers and any additional processing overhead that they may incur.<\/li>\n<\/ul>\n<\/ul>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">Media refinements<\/span><\/h3>\n<p>Each release of Android focuses on improving the media experience.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">HDR Headroom Control<\/span><\/h4>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"side by side images of SDR content\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEj_AuJ-QbBtz1PJqni3ElIRu-lLiJ7mrXu4wT9ASszd0r5E-yfxqgYVv1lvJObsto-248__xwLH4acFDA78tRLLBuLJHAK7E4JGJvufbX6W55-5vL7HOM_eEngxvXcjQZhh6n-E9P88csAvduTKttZtHsVNqJK1FIh15n6Z34VRB2rVczbD1YdQYRiD49A\/s16000\/image1.png\"\/><\/div>\n<p><imgcaption><center><em>The image on the left shows a view with SDR content. The image on the right simulates perceived headroom issues with SDR and HDR mixed content, which we can avoid by setting the desired HDR headroom.<\/em><\/center><\/imgcaption><\/image><\/p>\n<p>Android 15 chooses HDR headroom that is appropriate for the underlying device capabilities and bit-depth of the panel; for pages that have lots of SDR content such as a messaging app displaying a single HDR thumbnail, this can end up adversely influencing the perceived brightness of the SDR content. Android 15 allows you to control the HDR headroom with <a href=\"https:\/\/developer.android.com\/reference\/kotlin\/android\/view\/Window?hl=en#setdesiredhdrheadroom\" target=\"_blank\" rel=\"noopener\">setDesiredHdrHeadroom<\/a> to strike a balance between SDR and HDR content.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Loudness Control<\/span><\/h4>\n<p><image\/><\/p>\n<div style=\"clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;\"><img loading=\"lazy\" decoding=\"async\" alt=\"moving image of Droid wearing headphones and bopping his head rhythmically\" border=\"0\" height=\"113\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgSyIK5luBluIrqh4fzThfL5vDvnfTGQxY8gZTaHz-OK-l3kUXL-WcrnqN-VYjBVkoRnUJLDoM3F5lDAM6s1AkiF1jowA2XlAdvPhFDaqHMmfw4pSEdutedCV9WfDxgiZxKxlFO5_e6K60MPfNVoGenGkEUa-wm6Mvie8WBe-9HnLq-cNC0G06uIffzuAA\/w200-h113\/image7.gif\" width=\"200\"\/><\/div>\n<p>Android 15 introduces support for the <a href=\"https:\/\/shop.cta.tech\/products\/loudness-standard-for-over-the-top-television-and-online-video-distribution-for-mobile-and-fixed-devices-ansi-cta-2075\" target=\"_blank\" rel=\"noopener\">CTA-2075<\/a> loudness standard to help you avoid audio loudness inconsistencies and ensure users don&#8217;t have to constantly adjust volume when switching between content. The system leverages known characteristics of the output devices (headphones, speaker) along with loudness metadata available in AAC audio content to intelligently adjust the audio loudness and dynamic range compression levels.<\/p>\n<p>To enable this feature, you need to ensure loudness metadata is available in your AAC content and enable the platform feature in your app. For this, you instantiate a <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/media\/LoudnessCodecController\" target=\"_blank\" rel=\"noopener\">LoudnessCodecController<\/a><\/span> object by calling its <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/media\/LoudnessCodecController#create%28int%29\" target=\"_blank\" rel=\"noopener\">create<\/a><\/span> factory method with the audio session ID from the associated AudioTrack; this automatically starts applying audio updates. You can pass an  <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/media\/LoudnessCodecController.OnLoudnessCodecUpdateListener\" target=\"_blank\" rel=\"noopener\">OnLoudnessCodecUpdateListener<\/a><\/span> to modify\/filter loudness parameters before they are applied on the <span style=\"font-family: Courier;\"><a href=\"https:\/\/developer.android.com\/reference\/android\/media\/MediaCodec\" target=\"_blank\" rel=\"noopener\">MediaCodec<\/a><\/span>.<\/p>\n<div style=\"background: rgb(248, 248, 248); border: 0px; overflow: auto; width: auto;\">\n<pre style=\"line-height: 125%; margin: 0px;\"><span style=\"font-family: courier;\"><span style=\"color: #408080; font-style: italic;\">\/\/ media contains metadata of type MPEG_4 OR MPEG_D<\/span>\n<span style=\"color: green; font-weight: bold;\">val<\/span> mediaCodec = ...\n<span style=\"color: green; font-weight: bold;\">val<\/span> audioTrack = AudioTrack.Builder()\n                                .setSessionId(sessionId)\n                                .build()\n...\n<span style=\"color: #408080; font-style: italic;\">\/\/ create new loudness controller that applies the parameters to the MediaCodec<\/span>\n<span style=\"color: green; font-weight: bold;\">try<\/span> {\n   <span style=\"color: green; font-weight: bold;\">val<\/span> lcController = LoudnessCodecController.create(mSessionId)\n   <span style=\"color: #408080; font-style: italic;\">\/\/ starts applying audio updates for each added MediaCodec<\/span><\/span>\n<\/pre>\n<\/div>\n<p>AndroidX media3 ExoPlayer will soon be updated to leverage LoudnessCodecController APIs for a seamless app integration.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Use Spatializer instead of Virtualizer<\/span><\/h4>\n<p>Android 12 included the <a href=\"https:\/\/developer.android.com\/reference\/android\/media\/Spatializer\" target=\"_blank\" rel=\"noopener\">Spatializer<\/a> class, which enables querying the capabilities and behavior of sound spatialization on the device. In Android 15, we&#8217;re deprecating the Virtualizer class; instead use <a href=\"https:\/\/developer.android.com\/reference\/android\/media\/AudioAttributes.Builder#setSpatializationBehavior%28int%29\" target=\"_blank\" rel=\"noopener\">AudioAttributes.Builder.setSpatializationBehavior<\/a> to characterize how you want your content to be played when spatialization is supported.<\/p>\n<p>AndroidX media3 ExoPlayer 1.0 enables spatial audio by default for multichannel audio when the device supports it. See the <a href=\"https:\/\/android-developers.googleblog.com\/2023\/04\/delivering-immersive-sound-experience-with-spatial-audio.html\" target=\"_blank\" rel=\"noopener\">blog post<\/a> and <a href=\"https:\/\/developer.android.com\/media\/grow\/spatial-audio#exoplayer\" target=\"_blank\" rel=\"noopener\">documentation<\/a> for more information, including APIs to control the feature.<\/p>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">User Experience<\/span><\/h3>\n<p><a href=\"https:\/\/developer.android.com\/reference\/android\/app\/AutomaticZenRule\" target=\"_blank\" rel=\"noopener\">AutomaticZenRules<\/a> allow apps to customize Attention Management (Do Not Disturb) rules and decide when to activate\/deactivate them. Android 15 greatly enhances these rules with the goal of improving the user experience. It does this by:<\/p>\n<ul>\n<ul>\n<li>Adding types to AutomaticZenRule, allowing the system to apply special treatment to some rules<\/li>\n<\/ul>\n<\/ul>\n<ul style=\"text-align: left;\">\n<ul>\n<li>Adding an icon to AutomaticZenRule, helping to make the modes be more recognizable<\/li>\n<\/ul>\n<\/ul>\n<ul style=\"text-align: left;\">\n<ul>\n<li>Adding a triggerDescription string to AutomaticZenRule that describes the conditions on which the rule should become active for the user<\/li>\n<\/ul>\n<\/ul>\n<ul style=\"text-align: left;\">\n<ul>\n<li>Added ZenDeviceEffects to AutomaticZenRule, allowing rules to trigger things like grayscale display, night mode, or dimming the wallpaper<\/li>\n<\/ul>\n<\/ul>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">Behavior changes<\/span><\/h3>\n<p>Because backward compatibility is so important to us, we try to limit impactful behavior changes, but some are inevitable.<\/p>\n<h4 style=\"text-align: left;\"><span style=\"font-size: large;\">Elegant fonts everywhere<\/span><\/h4>\n<p>Once your app targets Android 15, the <a href=\"https:\/\/developer.android.com\/reference\/android\/R.attr#elegantTextHeight\" target=\"_blank\" rel=\"noopener\">elegantTextHeight<\/a> <a href=\"https:\/\/developer.android.com\/reference\/android\/widget\/TextView\" target=\"_blank\" rel=\"noopener\">TextView<\/a> attribute becomes true by default, replacing the compact font used by default with some scripts that have large vertical metrics with one that is much more readable. The compact font was introduced to prevent breaking layouts; Android 13 prevents many of these breakages by allowing the text layout to stretch the vertical height utilizing the <a href=\"https:\/\/developer.android.com\/reference\/android\/widget\/TextView#attr_android:fallbackLineSpacing\" target=\"_blank\" rel=\"noopener\">fallbackLineSpacing<\/a> attribute. In Android 15, the compact font still remains in the system, so your app can set elegantTextHeight to false to get the same behavior as before, but it is unlikely to be supported in upcoming releases. So, if your application supports the following scripts: Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam, Odia, Telugu or Thai, please test your applications by setting elegantTextHeight to true.<\/p>\n<p>Examples and screenshots<\/p>\n<p>Default behavior as of Android 14<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"Default behavior as of Android 14\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgVth_Q6D51ZwPkuPFx00fVwuAZQ7UOUSf6JBMvSJSPtaNd4KZUM_xENR29XHFPCo-NR6KhTMN16dASwfV2v-TCZc0U3eX6MpKwclJ5zHzz4RX30cA2f5WSQ1-wvUQcQlo2mpkAxZb0e1WnpzdnYojBVUiLvVl8roUrwgpHxLbrDawOFWQEHvkvqwt0bqk\/s16000\/image9.png\"\/><\/div>\n<p><\/image><\/p>\n<p>Default behavior for applications that target Android 15<\/p>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"Default behavior as of Android 14\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEirbCIez5t8fvMW_n7W9mzyQJXNxRVA_xmhyphenhyphenxOy0u-nNnGOdg5ya3v-6SMSA3W2hZsPtlHhh0ErIfeqHuWOHpEcf32a6Wu5-ZLIY6XLUtdvcPcsvH_Gr41OsRlfRH1hymSvOlmBUCdIFqBPGpBXozwYhu7Dt8J8yuQOMQcLFwieWxhoxQij4tMcD2kXcMc\/s16000\/image10.png\"\/><\/div>\n<p><\/image><\/p>\n<h3 style=\"text-align: left;\"><span style=\"font-size: x-large;\">App compatibility<\/span><\/h3>\n<p><image><\/p>\n<div style=\"text-align: center;\"><img decoding=\"async\" alt=\"Android 15 release timeline\" border=\"0\" id=\"imgCaption\" src=\"https:\/\/blogger.googleusercontent.com\/img\/b\/R29vZ2xl\/AVvXsEgf-Qt_ze2lPBVrl8FCfh1HOxXuwtgy5_UMG388ncashPI-kkYLGgf4pwV94jnsB0YjkZxmimc2iejRDBZXgElJ6YjuUoI2V5nhC7vLn1-7z188ve_SPFu1AxPUE9IprMybK-cb49dkXjaGkSKsckhNTMVu48typ1kJZpBb0hIo8WGoJd-dlVO9_-Vlh-E\/s1600\/image2.png\" width=\"100%\"\/><\/div>\n<p><\/image><\/p>\n<p>To give you more time to plan for app compatibility work, we\u2019re letting you know our Platform Stability milestone well in advance.<\/p>\n<p>At this milestone, we\u2019ll deliver final SDK\/NDK APIs and also final internal APIs and app-facing system behaviors. We\u2019re expecting to reach Platform Stability in June 2024, and from that time you\u2019ll have several months before the official release to do your final testing. The release timeline details are <a href=\"https:\/\/developer.android.com\/about\/versions\/15\/overview#timeline\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<p>The Developer Preview has everything you need to try the Android 15 features, test your apps, and give us feedback. You can get started today by <a href=\"https:\/\/developer.android.com\/about\/versions\/15\/get#pixel_flash_install\" target=\"_blank\" rel=\"noopener\">flashing a system image<\/a> onto a Pixel 6, 7, or 8 series device, along with the Pixel Fold and Pixel Tablet. We are not offering sideload images for Developer Preview 2. If you don\u2019t have a Pixel device, you can <a href=\"https:\/\/developer.android.com\/about\/versions\/15\/get#on_emulator\" target=\"_blank\" rel=\"noopener\">use the 64-bit system images with the Android Emulator<\/a> in Android Studio. If you&#8217;ve already installed Android 15 Developer Preview 1, you should get an over-the-air update to Android 15 Developer Preview 2.<\/p>\n<p>For the best development experience with Android 15, we recommend that you use the <a href=\"https:\/\/developer.android.com\/studio\/preview\" target=\"_blank\" rel=\"noopener\">latest preview of Android Studio Jellyfish<\/a> (or more recent Jellyfish+ versions). Once you\u2019re set up, here are some of the things you should do:<\/p>\n<ul>\n<ul>\n<li>Try the new features and APIs &#8211; your feedback is critical during the early part of the developer preview. Report issues in our tracker on the <a href=\"https:\/\/developer.android.com\/about\/versions\/15\/feedback\" target=\"_blank\" rel=\"noopener\">feedback page<\/a>.<\/li>\n<\/ul>\n<\/ul>\n<ul style=\"text-align: left;\">\n<ul>\n<li>Test your current app for compatibility &#8211; learn whether your app is affected by changes in Android 15; install your app onto a device or emulator running Android 15 and extensively test it.<\/li>\n<\/ul>\n<\/ul>\n<p>We\u2019ll update the preview system images and SDK regularly throughout the Android 15 release cycle. This preview release is for developers only and not intended for daily or consumer use, so we&#8217;re making it available by manual download only. Once you\u2019ve manually installed a preview build, you\u2019ll automatically get future updates over-the-air for all later previews and Betas. Read more <a href=\"https:\/\/developer.android.com\/about\/versions\/15\/overview#pixel\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n<p>If you intend to move from the <a href=\"https:\/\/developer.android.com\/about\/versions\/14\/get-qpr\" target=\"_blank\" rel=\"noopener\">Android 14 QPR Beta program<\/a> to the Android 15 Developer Preview program and don&#8217;t want to have to wipe your device, we recommend that you move to Developer Preview 2 now. Otherwise you may run into time periods where the Android 14 Beta will have a more recent build date which will prevent you from going directly to the Android 15 Developer Preview without doing a data wipe.<\/p>\n<p>As we reach our Beta releases, we&#8217;ll be inviting consumers to try Android 15 as well, and we&#8217;ll open up enrollment for the Android Beta program at that time. For now, please note that the Android Beta program is not yet available for Android 15.<\/p>\n<p>For complete information, visit the <a href=\"https:\/\/developer.android.com\/about\/versions\/15\" target=\"_blank\" rel=\"noopener\">Android 15 developer site<\/a>.<\/p>\n<p><small><em>Java and OpenJDK are trademarks or registered trademarks of Oracle and\/or its affiliates.<\/em><\/small><\/p>\n<\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><br \/>\n<br \/>[ad_2]<br \/>\n<br \/><a href=\"http:\/\/android-developers.googleblog.com\/2024\/03\/the-second-developer-preview-of-android-15.html\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>[ad_1] Posted by Dave Burke, VP of Engineering Today marks the second chapter of the Android 15 story with the release of Android 15 Developer<\/p>\n","protected":false},"author":1,"featured_media":216723,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[146],"tags":[],"_links":{"self":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/216722"}],"collection":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/comments?post=216722"}],"version-history":[{"count":5,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/216722\/revisions"}],"predecessor-version":[{"id":334366,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/posts\/216722\/revisions\/334366"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media\/216723"}],"wp:attachment":[{"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/media?parent=216722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/categories?post=216722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michigandigitalnews.com\/index.php\/wp-json\/wp\/v2\/tags?post=216722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}