AndroidDev - Reddit
54 subscribers
3.25K photos
312 videos
51.1K links
Stay up-to-date with latest news on Android Development!
Content directly fetched from the subreddit just for you.

Powered by : @r_channels
Download Telegram
Are SMS formats from banks and apps actually consistent across users?

I’ve been looking at how different services send SMS (banks, Swiggy, Amazon, etc.), and something interesting came up.

Each message has a sender ID (like AX-HDFCBK, VM-AMAZON), but the actual message formats vary a lot — even for similar types of alerts.

I’m trying to understand:

How consistent formats are for the same sender ID

Whether different users receive slightly different formats

What patterns exist across senders

I’m building something around this space, so trying to map real-world variations.

If you’re comfortable, could you share 1–2 sample messages along with the sender ID?(Please mask any sensitive info like amounts, names, account numbers.)

Even just the structure + sender ID helps a lot.

Happy to share what I find if there’s interest.

https://redd.it/1rypk8g
@reddit_androiddev
My dead game suddenly started growing after 2 years… no idea why
https://redd.it/1rz8045
@reddit_androiddev
Planning to take the Meta Android Developer Professional Certificate on Coursera. Need a review.

I’m planning to take the Meta Android Developer Professional Certificate and would appreciate any reviews or advice from someone who has completed it before. I’m new to Android development and would like to know what topics the course covers. I’m also wondering if I should purchase the certificate.

https://redd.it/1rz947r
@reddit_androiddev
Google Play app signing turned on but AAB still rejected.

I've had an app on the Play store for over ten years. I recently went to update it and am switching to the Google Play app signing and AAB process. It's been tricky to make this work and I've hit a snag at the AAB signing. I registered for Google Play signing, created the private key and uploaded it to Play. But when I upload a new AAB, it says all AAB's must be signed. You can see that Google Play managed app signing is turned on in this screen grab. I'm lost and the docs haven't helped me find the solution.

https://preview.redd.it/r9zl5n9rc9qg1.png?width=1718&format=png&auto=webp&s=4a64ef2fb2734aef0369c81f626b8f26cfad89be



https://redd.it/1rz6yy7
@reddit_androiddev
why do companies marketing with fake ads?

you know that grand mafia game. lv1 crok doing weird stuff. well its just a basic png city builder game and its nothing like ads. but their fake ads running since 2021-?.

also how they keep their rating at 4.4+. its the most p2w game i ever played. fake ad + p2w combo is literally asking for 1 star. yet my f2p ad free game struggling to keep 3.9 rating.

https://redd.it/1rz3vnh
@reddit_androiddev
Rebooting TV in Loop used 1minute

Hello Guys, I bought Xaomi OLED TV from China(Chinese ROM) about two weeks ago. After seeing it u, I though I could change the language to English since the option is is available, bit I found out it only changed systems language in setting and not third-partu apps. After doing my research I found out I can disable the luncher and load custom luncher to get it in full English. I found out I can use my phone with adb with USB debugging enabled. So I hoped onti ChatGPT for help and I managed to do it, and loaded Projectivity Luncher, but unfortunately after restart my TV went into android Recover mode. I was given an option Try Again and Factory Data Reset. I did factory to at least savey device but nothing worked. I finally managed to get the TV to boot and load the lunched but it will reboots 45seconds after luncher has fully loaded. Now it is booting loop. I reached out to Xaomi to help but the told me unless I send the TV back to China, and they do not have the firmware to send me to fix it. Nosy new TV which I could not use for two weeks is stuckdd on 45 seconds boot loop. I have been trying to at least enable USB debugging to add I can connect and run a code to fi bit yet, the time to operate the TV is not enough. Sometime moment after getting us debugging TV reboots and it is disabled. Remember I am not a developer, I was only relying on ChatGPT. Now, I don't know any Chinese Website where I can get the firmware.. The TV is 2021 Model with Android 10. Is there a way I can get USB debugging enabled even before the lunched loads? Or can anyone suggest a Chinese website where I can get the firmware to flash it. Any ideas is welcome. I am expecting visitors in a couple of weeks time and this is the only TV I have at the moment. Any help or suggestion is welcome. I have tried all ADB apps but enabling USB debugging and connection with my phone to runn a code has not been successful due to constant rebooting. Whatever you can do yo help I will appreciate.

https://redd.it/1rzd1g0
@reddit_androiddev
After 14 days of closed testing, "The Iron Oracle" just got approved for Production on the 1st try!
https://redd.it/1rzgdb6
@reddit_androiddev
I built an open-source Android debugging toolkit with 25+ tools — replaces Chucker, Flipper, and Stetho

I got tired of juggling Chucker for network, LeakCanary for leaks, random scripts for SharedPreferences, and Logcat for everything else. So I built WormaCeptor — a single library that puts 25+ debugging tools in one UI.

**What it does**

* Network inspection (OkHttp + Ktor + WebSocket + WebView)
* Performance monitoring (FPS, Memory, CPU with floating overlay)
* SQLite browser with query execution
* SharedPreferences and EncryptedSharedPreferences viewer/editor
* Leak detection for Activities and Fragments
* Crash reporting with stack traces
* Push notification simulator
* GPS location mocking
* File browser, device info, loaded libraries
* Crypto tools (AES, RSA, hashing)
* Network throttling (2G/3G/4G/WiFi presets)



**Why not the existing tools?**

* Flipper is deprecated by Meta
* Stetho has been archived for years
* Chucker does network well but nothing else



**Production safety:**

The toolkit uses `debugImplementation` — your release APK never contains WormaCeptor code. Not because of ProGuard, but because it’s never compiled in. The API client is a lightweight no-op in release builds.

**Tech stack:** 50+ Gradle modules, Clean Architecture, 100% Kotlin, Jetpack Compose UI, ArchUnit-enforced module boundaries.

**Getting started:**

add the dependencies

// The API client is lightweight and always present
implementation("com.github.azikar24.WormaCeptor:api-client:2.2.0")

// The actual toolkit only exists in debug builds
debugImplementation("com.github.azikar24.WormaCeptor:api-impl-persistence:2.2.0")


In release builds, **WormaCeptorApi** calls silently do nothing. No reflection tricks, no runtime checks. The implementation module isn’t there, so there’s nothing to run.

// Application.kt
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
WormaCeptorApi.init(this)
}
}

Add the interceptor to your HTTP client

// OkHttp
val client = OkHttpClient.Builder()
.addInterceptor(WormaCeptorInterceptor())
.build()

// Ktor
val client = HttpClient(CIO) {
install(WormaCeptorKtorPlugin) {
maxContentLength = 500_000L
}
}

Sensitive data? Redact it:

WormaCeptorInterceptor()
.redactHeader("Authorization")
.redactJsonValue("password")
.redactXmlValue("apiKey")

Then wire up one of the launch methods:

// Shake to open (lifecycle-aware, auto-stops on destroy)
WormaCeptorApi.startActivityOnShake(activity)

// Or a draggable floating button (requires SYSTEM_ALERT_WINDOW)
WormaCeptorApi.showFloatingButton(context)

// Or launch manually from anywhere
startActivity(WormaCeptorApi.getLaunchIntent(context))


**Links:**

\- GitHub: [https://github.com/azikar24/WormaCeptor](https://github.com/azikar24/WormaCeptor)
\- Demo app on Google Play: [https://play.google.com/store/apps/details?id=com.azikar24.wormaceptorapp](https://play.google.com/store/apps/details?id=com.azikar24.wormaceptorapp)
\- Demo video: [https://youtube.com/shorts/iSEifbkq7NI](https://youtube.com/shorts/iSEifbkq7NI)

MIT licensed. Issues and PRs welcome.




https://redd.it/1rzdi2o
@reddit_androiddev
android testing might kill us

Hi everyone, i'm building a fintech app with just me plus 2 other devs and android testing has been an absolute hell, it's just endless debugging and we're barely keeping up.

A friend told me about drizz.dev yesterday, it looked promising so I have booked their free demo for now.
anyone here actually using it for android testing? Does it actually work for small teams or is it something scammy? If not drizz, what else are you guys using that actually works as promised? honest opinions only please

https://redd.it/1rzjpgo
@reddit_androiddev
🚀 Mutual Support: 5 Review + 14 Days Testing (I’ll Return the Same!)

Hey everyone! 👋

My app is now live on Google Play, and I’m looking for mutual support with other developers.

If you download my app, try it, and leave a 5-star rating along with a positive review, send me a screenshot — I will do the same for your app and also test it actively for 14 days.

Let’s support each other and grow together! 🚀

Here’s my app:
https://play.google.com/store/apps/details?id=com.quizmastertr.app

https://redd.it/1rzkshk
@reddit_androiddev
Solve the Android Deeplink Nightmare Once and For All

Android deeplinks are such a pain because they live in two places (manifest + Kotlin code) and it's super easy to get them out of sync.

So I built DeepMatch, an android deeplink toolkit with a Gradle plugin that lets you write your deeplink spec once in YAML and generates everything else, and a runtime matcher for parsing and matching the incoming intents. No more syncing two files manually. No more silent runtime failures.

## Quick example:

deeplinkSpecs:
- name: "open profile"
activity: com.example.ProfileActivity
scheme: [https, app]
host: [example.com]
pathParams:
- name: userId
type: numeric


Plugin generates:
- Manifest intent filters
- Type-safe Kotlin classes (url Params mapped)
- Runtime processor (matcher)
- Build-time validation (catches collisions, dups, etc.)

## Before vs After

Before:
val userId = intent.data?.getQueryParameter("userId")?.toInt() // crashes if invalid
val ref = intent.data?.getQueryParameter("ref") // null or not? who knows


After:
when (val params = AppDeeplinkProcessor.match(intent.data) as? AppDeeplinkParams) {
is OpenProfileDeeplinkParams -> openProfile(params.userId, params.ref) // types are safe
null -> showHome()
}


## Multi-module support (Optional)

Each module can declare its own .deeplinks.yml. If two modules accidentally claim the same deeplink, the build fails and tells you.

No silent collisions in production.

## Validation at build time

- Missing schemes? Build fails.
- Duplicate names? Build fails.
- Collisions across modules? Build fails.
- You catch it immediately, not when users hit broken links.

## Setup

plugins {
id("com.aouledissa.deepmatch.gradle") version "<VERSION>"
}

dependencies {
implementation("com.aouledissa.deepmatch:deepmatch-processor:<VERSION>")
}


Drop .deeplinks.yml in your app folder. Done !

## Check it out here

- GitHub: aouledissa/deep-match
- Docs: aouledissa.com/deep-match
---

## FAQ

Actually generates the manifest? Yep.

Works with multi-module? Yep. Finds all specs, composes them, checks collisions.

Type-safe? Completely. YAML → Kotlin classes, matched with when.

Extendable? Yeah, processor is designed to be extended.

Config cache? Yes.

Would love feedback or to hear if you use it! Issues and PRs are of course welcomed.


https://redd.it/1rzly6n
@reddit_androiddev
Built a Manga Tracker App – Looking for Feedback on UX & Features

Hey everyone 👋



I’ve built an app called MangaLoop – a manga/manhwa/manhua tracker.



I’d love feedback on:

• UI/UX

• Performance

• Feature suggestions



If anyone is interested in trying it out and sharing feedback, let me know.



Would appreciate any developer insights 🙌

https://redd.it/1rzn6lc
@reddit_androiddev
Feedback from my photo-privacy app

I am Building a free open source app with focus on protecting pictures in a different way rather than the "hidden folder".

Concept: Don't Hide the image somewhere and unlock It with the password. But, Encrypt the image byte per byte with the password using AES, this Will produce a "glitched" image you can store in your gallery without worrying someone scrolling through your gallery can sees It, or you can store it safetly on you driver or share It. By using the same sentence, the image Will be decrypted and you Will get the original picture with no quality loss.

The idea here Is not to Hide the image, but make It unreadable. I have already done this app, for mu portfolio, and i wanted to improve It, maybe adding more Features such as palette Layer to make the finale image less "glitched" and more "artistic", but i don't know if the effort worth It.

What do you think? Would you use this? 100% local, opensource, no server or external calls.

Do you have any suggestion for more Features or how to improve this? Open to hear tour thoughts!

https://redd.it/1rznqqx
@reddit_androiddev
I built a JSON viewer & editor for mobile with 30+ features — free, no account needed

^(ey everyone,)



^(I'm a solo Flutter developer and I just shipped v1.1.0 of my JSON tool for Android and iOS. I built it because every existing JSON app on mobile was)

^(either ugly, abandoned, or missing basic features.)



^(What it does:)

^(- Tree view + code view with syntax highlighting)

^(- JSON Diff — compare two files side by side)

^(- API Client — test any REST endpoint (GET/POST/PUT/DELETE))

^(- Schema validation (JSON Schema Draft 7))

^(- JSONPath queries)

^(- Export to PDF, Excel, YAML, XML, CSV)

^(- JSON Fixer — auto-repairs broken JSON)

^(- 15 languages)

^(- Works completely offline)



^(It's free, no account needed, no data collected.)



^(Android:) ^(https://play.google.com/store/apps/details?id=com.cosmovex.jsonvedit)

^(iOS:) ^(https://apps.apple.com/in/app/json-viewer-and-editor/id6760624709)

https://redd.it/1rzpi07
@reddit_androiddev
kill switch for old versions of my app - fraud, hacking - lucky patcher

About to release my app
My database rules are tight.
And my app is "reasonably" secure.
Today, I don't verify receipts on my back end - it's there but switched off.
The app checks for (i) "success" flag from the Google/Apple store or (ii) string "gold" value from the users account in my database (write access blocked)

Wondering if there is a kill switch I can put in my apps? because there are old .apk's/.app out there for many apps, so I don't want to give away my features in those older less secure versions to hackers who will just intercept "gold" and get free access?

EDIT: My latest solution --> if TODAY() < 3 months from X date THEN Kill App - to force users to eventually update the app

https://redd.it/1rzoq7w
@reddit_androiddev
Built this for Android devs dealing with Google Play rejections — would love feedback

I kept getting stuck on vague Play Console rejection emails, so I built a small tool to speed up fixes:

PlayStorisk → [https://playstorisk.com](https://playstorisk.com)

What it does:

* Free Pre-Submission Check (permissions/SDK/privacy risk signals)
* Free APK scan (manifest + SDK + policy-risk indicators)
* Rejection email analyzer that turns boilerplate rejection text into:
* probable root cause
* prioritized fix steps
* direct Play Console section links

I’m not claiming “guaranteed approval” — it’s just a debugging assistant for policy/compliance work.

I just launched and I’m looking for honest feedback from Android devs:

* Is the output actionable enough?
* What’s missing for real-world rejection workflows?
* What would make this worth using before every release?

https://redd.it/1rzsdkf
@reddit_androiddev
I built an AI QA Engineer for Android Apps (No Human Supervision)

I built OpenTester because Claude Code was writing Android features faster than I could test them.

Every time the agent made a change, I was stuck in a loop: opening the emulator, manually navigating the same flows, and re-running regressions to make sure nothing else broke.

So I built OpenTester. It’s an open-source AI QA engineer that plugs into Claude Code via MCP. Now, the agent can autonomously launch the app, navigate the UI like a human, and save those steps in a JSON format that allows it to revalidate them in the future. It essentially gives the coding agent “eyes” and a way to verify its own work.

It’s fully open-source and free for early users: https://github.com/andresuarezz26/OpenTester

https://redd.it/1rztk2b
@reddit_androiddev
How can i find my first freelance project as an kotlin android developer

I have build good number of Saas applications in kotlin and jetpack compose and using firebase as backend.Looking for work? It would be greatfull if someone can help

https://redd.it/1rzw6js
@reddit_androiddev
getCurrentLocation() hangs indefinitely on Honor devices when the OEM battery saver kills GPS hardware — a priority fallback chain solution

I have been working on a project that requires reliable background GPS on Android. The use case is periodic location checks every 30 to 60 minutes from a foreground service. Not navigation — just confirming approximate position over long periods. I have been testing on an Honor device, and discovered a gap in the FusedLocationProviderClient API that I have not seen discussed much.

The problem

At approximately 12% battery, the OEM battery saver silently killed GPS hardware access. There was no exception, no error callback, and no log entry. The foreground service remained alive and the accelerometer continued working for over 13 hours. However, getCurrentLocation(PRIORITY_HIGH_ACCURACY) simply never completed. The Task from Play Services hung indefinitely — neither

onSuccessListener nor onFailureListener ever fired.

The code fell back to getLastLocation(), which returned a 5-hour-old cached position from a completely different city. The system had no indication anything was wrong.

The root cause is that getCurrentLocation() returns a Task with no built-in timeout. If the GPS hardware is throttled or killed by the OEM power manager, that Task never resolves. Most applications never encounter this because they use location briefly in the foreground.



A typical implementation looks like this:



suspend fun getLocation(): Location? {

return suspendCancellableCoroutine { cont -> fusedClient.getCurrentLocation(PRIORITY_HIGH_ACCURACY, token)

.addOnSuccessListener { cont.resume(it) }

.addOnFailureListener { cont.resume(null) }

}

}

On Honor at low battery, this coroutine never completes and the entire location pipeline stops.

Solution 1: Coroutine timeout

The first step is wrapping every getCurrentLocation() call in withTimeoutOrNull:

suspend fun getLocation(priority: Int): Location?

{ return withTimeoutOrNull(30_000L) {

suspendCancellableCoroutine { cont ->

fusedClient.getCurrentLocation(priority, token)

.addOnSuccessListener { cont.resume(it) }

.addOnFailureListener { cont.resume(null) }

}

}

}



This prevents the hang, but now the result is simply null. There is still no location.

Solution 2: Priority fallback chain

GPS hardware being dead does not mean all location sources are unavailable. Cell towers and Wi-Fi still function because the phone needs them for connectivity. I built a sequential fallback:

> PRIORITY_HIGH_ACCURACY (GPS hardware, approximately 10 meters)

>↓ null or timeout

> PRIORITY_BALANCED_POWER_ACCURACY (Wi-Fi + cell, approximately 40-300 meters)

>↓ null or timeout

> PRIORITY_LOW_POWER (cell only, approximately 300 meters to 3 kilometers)

>↓ null or timeout

> lastLocation (cached, any age)

>↓ null

> total failure

Each step receives its own 30-second timeout. In practice, when GPS hardware is killed, BALANCED_POWER_ACCURACY usually returns within 2 to 3 seconds because Wi-Fi scanning still works.

Three-kilometer accuracy from a cell tower sounds poor, but it answers the question "is this person in the expected city or 200 kilometers away on a highway?" For my use case, that prevented an incorrect assessment based on a stale cached position.

Solution 3: GPS wake probe

Sometimes the GPS hardware is not permanently dead — it has been suspended by the battery manager. A brief requestLocationUpdates call can wake it:

if (hoursSinceLastFreshGps > 4) {

val probeRequest = LocationRequest.Builder(

Priority.PRIORITY_HIGH_ACCURACY, 1000L

)

.setDurationMillis(5_000L)

.setMaxUpdates(5)

.build()



withTimeoutOrNull(6_000L) {

fusedClient.requestLocationUpdates(probeRequest, callback, looper)

// wait for callback or timeout

}

fusedClient.removeLocationUpdates(callback)

}

Five seconds, maximum once every 4 hours, approximately 6 probes per day. On Honor, this recovers the GPS hardware
roughly 40% of the time. When it works, subsequent getCurrentLocation(HIGH_ACCURACY) calls start succeeding again.

Solution 4: Explicit outcome type

The original code returned Unit from the location request method. The caller had no way to distinguish a fresh 10-meter GPS fix from a 5-hour-old cached position. I changed the return type to make this explicit:

sealed interface GpsLocationOutcome {

data class FreshGps(val accuracy: Float) : GpsLocationOutcome

data class CellFallback(val accuracy: Float) : GpsLocationOutcome

data class WakeProbeSuccess(val accuracy: Float) : GpsLocationOutcome

data class StaleLastLocation(val ageMs: Long) : GpsLocationOutcome

data object TotalFailure : GpsLocationOutcome

}

Now the caller can make informed decisions. A fresh GPS fix means high confidence. A cell fallback at 3 kilometers is useful but low precision. A stale location from 5 hours ago is a warning, not data.

An important design decision: CellFallback is treated as neutral — GPS hardware is still broken (do not reset the failure counter), but usable data exists (do not trigger aggressive backoff either).

The consumer looks like:



when (outcome) {

is FreshGps, is WakeProbeSuccess -> reportGpsSuccess()

is CellFallback -> { /* GPS broken but we have data */ }

is StaleLastLocation, is TotalFailure -> reportGpsFailure()

}

An unexpected race condition

I had multiple independent trigger paths requesting GPS concurrently. Two of them fired within 33 milliseconds of each other. Both read the same getLastLocation(), both passed the stationarity filter, and both inserted a GPS reading. The result was two identical readings 33 milliseconds apart.

My code uses a minimum-readings-per-cluster filter to discard drive-through locations (a place needs at least 2 GPS readings to count as a real visit). The duplicate entry from the race condition defeated this filter — a single drive-by became a "cluster of 2." The fix was a Mutex around the entire processLocation path:

private val processLocationMutex = Mutex()

suspend fun processLocation(location: Location) {

processLocationMutex.withLock {

val lastLocation = getLastLocation()

// the second concurrent caller now sees the just-inserted

// location and correctly skips as duplicate

}

}

Additional note on dependency versions

I was using play-services-location 21.0.1 for months. Upgrading to 21.3.0 resolved some GPS reliability edge cases I had not yet identified. If you are doing background location work, it is worth checking whether your dependency version is current.

Summary

getCurrentLocation() can hang indefinitely on OEM-throttled devices. Always wrap it in withTimeoutOrNull. Build a priority fallback chain through all available location sources. Consider a brief

wake probe for GPS hardware recovery. Return an explicit outcome type so callers know the quality of data they received. If you have multiple GPS trigger paths, serialize them with a Mutex.

I have only tested this on Honor. I would be interested to hear whether anyone has observed similar GPS hardware suspension on other manufacturers.

https://redd.it/1s028ty
@reddit_androiddev