<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Android on Build in Public</title><link>https://build.ralphmayr.com/tags/android/</link><description>Recent content in Android on Build in Public</description><generator>Hugo</generator><language>en-us</language><copyright>©️ Ralph Mayr 2026</copyright><lastBuildDate>Mon, 29 Sep 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://build.ralphmayr.com/tags/android/index.xml" rel="self" type="application/rss+xml"/><item><title>How to fix the ominous Android Status Bar Issue</title><link>https://build.ralphmayr.com/posts/91-how-to-fix-the-ominous-android-status-bar-issue/</link><pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/91-how-to-fix-the-ominous-android-status-bar-issue/</guid><description>&lt;p&gt;Remember
&lt;a href="../28-capacitor-android-status-bar/"&gt;Capacitor + Android Status Bar = 🤯&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;🪲 This bug has haunted me for months&amp;mdash;stalling the Android release of poketto.me and draining way too much mental energy. It&amp;rsquo;s one of those dreaded dev problems: no obvious solution, hard to debug, and endless rabbit holes.&lt;/p&gt;
&lt;p&gt;Eventually, I had to bite the bullet and dig in. Here&amp;rsquo;s what I found:&lt;/p&gt;
&lt;p&gt;💣 Issue #1: The Capacitor status bar plugin only half-works. There&amp;rsquo;s a StatusBar.setOverlaysWebView(true/false) API, but on modern Android versions it doesn&amp;rsquo;t behave as advertised. Why?&lt;/p&gt;</description></item><item><title>Google’s Play Store review process is pure torture</title><link>https://build.ralphmayr.com/posts/89-googles-play-store-review-process-is-pure-torture/</link><pubDate>Sat, 27 Sep 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/89-googles-play-store-review-process-is-pure-torture/</guid><description>&lt;p&gt;In
&lt;a href="../14-the-process-to-get-an-app-into-google-play-is-byzantine/"&gt;TIL #14&lt;/a&gt;, I called getting an Android app into the Play Store &amp;ldquo;byzantine.&amp;rdquo; Turns out, I was being too generous to Google and too strict on the ancient kingdom of Byzantium.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what really gave me headaches over the last few months:&lt;/p&gt;
&lt;p&gt;🤕 Headache #1: The forms&lt;/p&gt;
&lt;p&gt;Before Google even looks at your app, you&amp;rsquo;re drowning in bureaucracy: ticking the &amp;ldquo;my app doesn&amp;rsquo;t process health data&amp;rdquo; box 12 times, pasting links to T&amp;amp;Cs and privacy policies, verifying your name, intentions, identity, blood type, shoe size, the maiden name of your mom&amp;rsquo;s dog, &amp;hellip;&lt;/p&gt;</description></item><item><title>You can customize the text selection menu in your Android app</title><link>https://build.ralphmayr.com/posts/84-you-can-customize-the-text-selection-menu-in-your-android-app/</link><pubDate>Mon, 22 Sep 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/84-you-can-customize-the-text-selection-menu-in-your-android-app/</guid><description>&lt;p&gt;As I mentioned in
&lt;a href="../77-in-place-dom-manipulation-thorny-as-ever/"&gt;In-place DOM manipulation: Thorny as ever&lt;/a&gt;, text selection in browsers can get tricky fast. For poketto.me, the challenge was even bigger: the web app runs inside a hosted WebView in an Android app.&lt;/p&gt;
&lt;p&gt;Mobile text selection already behaves differently from desktop, and the embedding scenario didn&amp;rsquo;t make things easier. After wrestling with a few awkward bugs, though, I found an elegant solution.&lt;/p&gt;
&lt;p&gt;On the web, when a user finishes selecting text, poketto.me immediately converts the selection into a highlight (default color). On Android, however, a tiny &lt;strong&gt;system context menu&lt;/strong&gt; pops up with entries like &lt;em&gt;Copy, Select All, Web Search,&lt;/em&gt; etc. At first this got in the way&amp;mdash;but it turns out you can &lt;strong&gt;customize this menu on a per-activity basis!&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Firefox extensions (mostly) work on Firefox on Android as well</title><link>https://build.ralphmayr.com/posts/74-firefox-extensions-mostly-work-on-firefox-on-android-as-well/</link><pubDate>Fri, 12 Sep 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/74-firefox-extensions-mostly-work-on-firefox-on-android-as-well/</guid><description>&lt;p&gt;A poketto.me Firefox user recently pointed out that Firefox on Android also supports browser extensions&amp;ndash; but that the poketto.me extension didn&amp;rsquo;t appear on Mozilla&amp;rsquo;s Add-Ons page there.&lt;/p&gt;
&lt;p&gt;Turns out: Any modern browser extension built on the standard APIs (Chrome, Firefox, Edge) can also run in Firefox on Android. But when publishing, you have to explicitly test and target Android.&lt;/p&gt;
&lt;p&gt;Technically, the extension &amp;ldquo;just works&amp;rdquo;&amp;mdash;as long as you&amp;rsquo;re not doing anything exotic with the APIs. But aesthetically, there&amp;rsquo;s one big caveat.&lt;/p&gt;</description></item><item><title>Google Requires a New versionCode for Every App Bundle You Publish</title><link>https://build.ralphmayr.com/posts/37-google-requires-a-new-versioncode-for-every-app-bundle-you-publish/</link><pubDate>Wed, 06 Aug 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/37-google-requires-a-new-versioncode-for-every-app-bundle-you-publish/</guid><description>&lt;p&gt;When publishing a new version of your Android app through the Google Play Console, you &lt;em&gt;must&lt;/em&gt; increment the versionCode in your app&amp;rsquo;s build.gradle file. This is required even if the versionName (the human-readable version string) stays the same.&lt;/p&gt;
&lt;p&gt;I found this a bit confusing at first &amp;mdash; but the rule is simple: Before you build the bundle you upload to Google Play, make sure you&amp;rsquo;ve updated the versionCode. If you don&amp;rsquo;t, your upload will be rejected immediately.&lt;/p&gt;</description></item><item><title>Capacitor + Android Status Bar = 🤯</title><link>https://build.ralphmayr.com/posts/28-capacitor-android-status-bar/</link><pubDate>Mon, 28 Jul 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/28-capacitor-android-status-bar/</guid><description>&lt;p&gt;The Android status bar (that is, the small bar on top of the screen that shows the current time, the batter status, and notification icons) is really, really weird.&lt;/p&gt;
&lt;p&gt;It turns out, Capacitor will, by default, make your app a &amp;ldquo;fullscreen&amp;rdquo; app: It&amp;rsquo;ll render your MainActivity (the one that hosts the WebView which in turn hosts your web app) in such a way that the status bar isn&amp;rsquo;t there at all&amp;ndash;on most devices. On some devices, however, the status bar will be visible, but transparently overlay your app 🤨And, to add insult to injury: It&amp;rsquo;ll change the font color of the status bar to white, so that if you rapp comes with a white background, all the user sees are some weird optical artifacts at the top of their screen.&lt;/p&gt;</description></item><item><title>The process to get an app into Google Play is… byzantine</title><link>https://build.ralphmayr.com/posts/14-the-process-to-get-an-app-into-google-play-is-byzantine/</link><pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/14-the-process-to-get-an-app-into-google-play-is-byzantine/</guid><description>&lt;p&gt;🏗️First, of course, you actually got to build your app. Then you register at the &lt;strong&gt;Google Play Console&lt;/strong&gt; (and fork over $25). Then you provide your name, contact details, etc. and then the fun starts: You need official ID (drivers license, passport), proof of residence (&amp;ldquo;Meldezettel&amp;rdquo; in Austria), proof that you own an Android device, install the Google Play Console App on that device, and verify your contact phone number.&lt;/p&gt;</description></item><item><title>WebView ↔ Native app communication is easier than you think.</title><link>https://build.ralphmayr.com/posts/12-webview-native-app-communication-is-easier-than-you-think/</link><pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/12-webview-native-app-communication-is-easier-than-you-think/</guid><description>&lt;p&gt;Even without relying on the utilities provided by Capacitor, you can easily pass data back and forth between your web app and its native counterpart:&lt;/p&gt;
&lt;p&gt;➡️In JavaScript / TypeScript you can register global functions on the window object. The native code can call these via executeJavaScript() on the WebView.&lt;/p&gt;
&lt;p&gt;➡️In the other direction, the native code can register a JavaScript interface on the&lt;/p&gt;
&lt;p&gt;WebView:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;webView.addJavascriptInterface(new Object() {
@JavascriptInterface
public void onSessionId(String value) {
SaveUrlHandler.instance.setSessionId(value);
}
@JavascriptInterface
public void closeApp() {
MainActivity.this.finish();
}
}, &amp;#34;Android&amp;#34;);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;which the JavaScript / TypeScript code can call whenever it wants:&lt;/p&gt;</description></item><item><title>Hybrid apps &amp; social logins: tread carefully.</title><link>https://build.ralphmayr.com/posts/1-hybrid-apps-social-logins-tread-carefully/</link><pubDate>Tue, 01 Jul 2025 00:00:00 +0000</pubDate><guid>https://build.ralphmayr.com/posts/1-hybrid-apps-social-logins-tread-carefully/</guid><description>&lt;p&gt;Remember when I talked about &amp;ldquo;Sign in with Google?&amp;rdquo; That works really well on the web, but: Once you&amp;rsquo;re wrapping your web app into a native mobile app, things turn very ugly very soon. In a hosted WebView, Google won&amp;rsquo;t let you render the sign in button to begin with &amp;ndash; unless you override the WebView&amp;rsquo;s user agent string. After that, you&amp;rsquo;re still screwed if you rely on the default sign in workflow as this would open a popup window from which the user then can&amp;rsquo;t navigate back into your app.&lt;/p&gt;</description></item></channel></rss>