How to Test Social Sharing on Android (Complete Guide)
Social sharing is often the gateway that turns a solitary user action into viral growth. When a user taps a share button, the app hands off data—text, image, URL, or a custom payload—to the Android sh
Motivation: Why Social Sharing Matters on Android
Social sharing is often the gateway that turns a solitary user action into viral growth. When a user taps a share button, the app hands off data—text, image, URL, or a custom payload—to the Android share sheet. The sheet then presents a list of target apps chosen by the system or installed by the user. If any part of that hand‑off fails, the user sees a broken experience, the intended audience never receives the content, and the product loses a potential acquisition channel.
In production, sharing bugs are notoriously hard to catch because they depend on factors outside the app’s direct control: the presence or absence of specific target apps, OEM‑customized share sheets, runtime permissions, and even the current network state. A test that passes on a clean emulator can fail on a user’s device that has a dozen social apps installed, a custom launcher, or a strict battery‑optimization policy.
For QA engineers, the challenge is two‑fold: verify that the app correctly builds and dispatches the share intent, and confirm that the share sheet behaves as expected across the myriad configurations users encounter in the wild. This guide walks through a complete testing strategy—from manual checks to automated scripts and autonomous, persona‑driven exploration—so you can catch sharing defects before they reach production.
What Breaks in Production: Common Social Sharing Failures
Understanding the failure modes helps you prioritize tests. Below is a catalog of issues that repeatedly surface in field reports and crash logs.
| Failure Category | Typical Symptom | Root Cause | Example Scenario |
|---|---|---|---|
| Intent Construction | Share button does nothing or opens a blank sheet | Missing or incorrect action, type, or extras | Sending ACTION_SEND with text/plain but forgetting to put EXTRA_TEXT |
| Target Resolution | Share sheet shows “No apps can perform this action” | Intent flags mismatch target’s intent‑filter | Using FLAG_GRANT_READ_URI_PERMISSION on a content: URI without granting permission |
| Data Truncation | Shared text is cut off after 100 characters | Extras exceed Binder transaction limit (~1MB) or target imposes its own limit | Sharing a long article via Twitter, which truncates at 280 chars |
| Permission Denial | App crashes with SecurityException when attaching a file | Required runtime permission not granted at share time | Trying to share a photo from external storage without READ_EXTERNAL_STORAGE |
| OEM Sheet Interference | Share sheet looks different, hides custom targets | Device manufacturer replaces the default sheet with a proprietary UI | Samsung’s “Direct Share” prioritizing its own apps, causing third‑party targets to be buried |
| Background Kill | Share completes but target app never receives data | Service or BroadcastReceiver that processes the intent is killed before finishing | A backup service that uploads the shared image is stopped by Doze mode |
| Accessibility Barrier | TalkBack users cannot locate the share button | Missing content‑description or improper focus order | Share button relies solely on an icon without a label |
| Privacy Leak | Sensitive data appears in logs or clipboard | Intent extras logged inadvertently or copied to clipboard by a malicious target | Sharing a password reset token via an insecure messaging app |
| Deep Link Failure | Target app opens but does not show shared content | Target expects a specific URI scheme or extra key that is missing | Sharing a Spotify URI that the recipient app expects under EXTRA_SPOTIFY_URI but receives under EXTRA_TEXT |
These patterns illustrate why a simple “tap share and see if it works” test is insufficient. A robust strategy must cover intent building, runtime permissions, OEM variations, accessibility, and security/privacy concerns.
Test Matrix for Social Sharing (Happy Path, Error Paths, Edge Cases, Accessibility, Security/Privacy)
The following tables break down the test space into functional and non‑functional dimensions. Use them as a checklist when designing test cases or when reviewing automated coverage.
Table 1: Functional Test Matrix
| Test ID | Description | Preconditions | Steps | Expected Result | Pass/Fail Criteria |
|---|---|---|---|---|---|
| F1 | Happy path share plain text | App installed, share button visible | 1. Tap share button 2. Select “Copy to clipboard” target 3. Verify clipboard content | Clipboard contains exact string from app | Pass if clipboard matches; Fail if empty or altered |
| F2 | Happy path share image via content URI | App has image saved to internal storage, granted READ_EXTERNAL_STORAGE | 1. Tap share button 2. Choose “Google Photos” target 3. Confirm image appears in Photos | Image displayed correctly in target app | Pass if image renders; Fail if broken or missing |
| F3 | Error path: missing text extra | App sends ACTION_SEND with text/plain but no EXTRA_TEXT | 1. Tap share button 2. Observe share sheet | Share sheet shows “No apps can perform this action” or target opens with empty field | Pass if system correctly reports no viable target; Fail if crash occurs |
| F4 | Error path: unsupported MIME type | App sets type to application/unknown | 1. Tap share button 2. Observe sheet | No targets listed (or only generic “Share via…”) | Pass if no crash and UI reflects lack of targets; Fail if app crashes |
| F5 | Edge case: large text (>1MB) | Prepare a 2 MB string | 1. Tap share button 2. Try to share via Gmail | Gmail opens with truncated or empty body, or system shows “Transaction too large” toast | Pass if system handles gracefully (truncation or error message); Fail if app crashes |
| F6 | Edge case: sharing from work profile | Device has work profile enabled, app in personal profile | 1. Tap share button 2. Attempt to share to a work‑only app (e.g., Outlook work) | Share succeeds only if cross‑profile sharing allowed; otherwise sheet filters out work targets | Pass if behavior matches device policy; Fail if app crashes or shows incorrect targets |
| F7 | Edge case: OEM‑custom sheet (e.g., Xiaomi Mi Share) | Device with custom share UI | 1. Tap share button 2. Observe sheet layout | Sheet displays OEM‑specific sections (e.g., “Mi Share”, “Quick Share”) alongside standard targets | Pass if app’s intent is still respected and no UI glitches; Fail if share button triggers a force‑close |
| F8 | Edge case: multi‑window mode | Device in split‑screen, app in top half | 1. Tap share button 2. Attempt to share to bottom‑half app | Share sheet appears, target receives data correctly | Pass if share works without layout issues; Fail if sheet is mispositioned or data lost |
| F9 | Edge case: right‑to‑left language | Device locale set to Arabic (ar) | 1. Open app 2. Tap share button 3. Verify layout | Share button and sheet respect RTL alignment | Pass if UI mirrors correctly; Fail if elements are clipped or misaligned |
| F10 | Accessibility: TalkBack navigation | TalkBack enabled, focus on share button | 1. Swipe to share button 2. Double‑tap to activate | TalkBack announces button purpose, sheet opens, focus moves to first target | Pass if announcement is descriptive and focus logical; Fail if announcement missing or focus trapped |
| F11 | Security: clipboard leakage | App shares sensitive token via EXTRA_TEXT | 1. Tap share button 2. Choose “Copy to clipboard” target 3. Immediately open a note app and paste | Clipboard contains token (expected) but no other app should have accessed it | Pass if only the chosen target can read token; Fail if background service logs token or malicious app reads it |
| F12 | Privacy: external storage URI without permission | App shares a content:// URI pointing to external storage without granting permission | 1. Tap share button 2. Choose any target that tries to open the URI | Target receives SecurityException or fails to load image | Pass if target handles gracefully (shows error) and app does not crash; Fail if app crashes or leaks stack trace |
Table 2: Non‑Functional Test Matrix
| Category | Test ID | Description | Tool/Approach | Success Indicator |
|---|---|---|---|---|
| Performance | P1 | Measure latency from share button press to sheet display | adb shell am start -W -n + timestamp | < 200 ms on median device |
| Memory | M1 | Verify no memory leak when repeatedly sharing | Android Studio Profiler, loop 100 shares | Heap growth < 2 MB after loop |
| Battery | B1 | Check if sharing triggers excessive wake locks | adb shell dumpsys power before/after | No new wake locks held > 5 s |
| Network | N1 | Test share when target app requires network (e.g., Facebook) but device is offline | Enable airplane mode, share to Facebook | Share sheet opens, target shows appropriate offline message, no crash |
| Localization | L1 | Verify all share‑related strings are translated for es, fr, zh | Run app with different locales, inspect UI | Strings appear correctly, no hard‑coded English |
| Interrupt | I1 | Simulate incoming call during share flow | Use adb shell am broadcast -a android.intent.action.NEW_OUTGOING_CALL | Share flow pauses/resumes correctly, data not corrupted |
| Permission Runtime | R1 | Revoke READ_EXTERNAL_STORAGE after grant, then share | Grant via Settings, revoke via adb shell pm revoke, then share | App handles denial gracefully (shows rationale) |
These matrices give you a concrete way to enumerate test scenarios. In practice, you will combine functional and non‑functional checks into test suites that run on emulators, real devices, and device farms.
Manual Testing Approach: Step‑by‑Step Guide
Manual testing remains valuable for exploratory checks, especially when validating OEM‑specific share sheets or accessibility behavior. Below is a step‑by‑step workflow you can follow on a physical device or emulator.
Preparing the Device/Emulator
- Enable Developer Options – Tap *Settings → About phone → Build number* seven times.
- Turn on USB debugging – Needed for
adblog capture and for installing test APKs. - Install the app under test – Use
adb install -r app-debug.apk. - Clear previous share history – Some launchers cache recent targets; run
adb shell cmd shortcut reset-throttlingto reset. - Set up logging – Run
adb logcat -cto clear the buffer, then start capturing withadb logcat > share_log.txt &. - Configure accessibility services (if testing TalkBack) – Enable TalkBack in *Settings → Accessibility*.
Enabling Share Sheet Logging
Android logs the resolution of intents at VERBOSE level under the tag ActivityManager. To see which targets are considered:
adb shell setprop log.tag.ActivityManager VERBOSE
adb logcat | grep -i "resolveIntent"
You will see lines like:
ActivityManager: Resolving intent { act=android.intent.action.SEND typ=text/plain ... } -> [com.android.chrome, com.facebook.katana, ...]
Executing Happy Path Tests
- Locate the share trigger – Usually a floating action button or menu item.
- Tap the trigger – Observe the share sheet animation.
- Select a target – Choose a known good target like “Copy to clipboard”, “Gmail”, or “Messages”.
- Validate the outcome –
- For clipboard: open any note app, paste, and compare.
- For email/SMS: verify the prefilled subject/body or recipient.
- For image targets: confirm the image appears correctly.
Record the time from tap to sheet appearance; note any jitter or missing animation.
Simulating Error Conditions
| Condition | How to Induce | Expected Observation |
|---|---|---|
| Missing extra | Modify the app’s share code temporarily (or use a debug build) to omit EXTRA_TEXT | Sheet shows “No apps can perform this action” or target opens with blank field |
| Unsatisfied MIME type | Set type to application/unsupported | Same as above |
| Permission denied | Revoke READ_EXTERNAL_STORAGE via adb shell pm revoke | Target that needs the URI fails to load; app should not crash |
| Large payload | Generate a 2 MB string in code and attempt to share | System may show “Transaction too large” toast; app should handle gracefully |
| Network‑dependent target | Disable Wi‑Fi/mobile data, then share to a target that requires network (e.g., Twitter) | Target shows offline error; share flow does not crash the source app |
When inducing faults, always capture logcat to verify that no unhandled exceptions are thrown.
Verifying Accessibility
- Enable TalkBack and optionally Switch Access.
- Navigate to the share button using swipe gestures or switch commands.
- Confirm that TalkBack announces the button’s purpose (e.g., “Share, button”).
- Activate the button and verify that focus moves to the first item in the share sheet and that TalkBack reads each target as you swipe.
- Check for any custom views that lack
contentDescriptionor that trap focus.
If you have access to the Accessibility Test Framework (ATF), you can run automated checks, but manual validation catches nuanced issues like overlapping labels.
Checking Privacy Leaks
- Enable strict mode in the app’s
Applicationclass to log disk/network reads on the main thread (helps catch inadvertent logging). - Share a known synthetic token (e.g., a UUID).
- Immediately after sharing, inspect logcat for any lines containing the token.
- Check clipboard via
adb shell service call clipboard 1 i32 0(requires API 28+) to confirm only the intended target placed data there. - Look for unintended broadcasts – some apps mistakenly send a broadcast with the shared data; monitor with
adb shell am broadcast -a android.intent.action.SEND --es "extra" "."
If any of these checks reveal the token outside the intended flow, file a privacy bug.
Automated Testing on Android
Automation ensures repeatability across devices and CI pipelines. The Android testing ecosystem offers several layers that map directly to share‑intent verification.
Using Espresso for Share Intent Verification
Espresso operates within your app’s process, making it ideal for asserting that the correct intent is built. You cannot directly interact with the share sheet (it runs in a separate system UI), but you can verify the intent that your activity sends.
@RunWith(AndroidJUnit4::class)
class ShareIntentTest {
@Test
fun sharePlainText_buildsCorrectIntent() {
// Launch the activity containing the share button
ActivityScenario.launch(MainActivity::class.java)
// Click the share button (assume id R.id.share_button)
onView(withId(R.id.share_button)).perform(click())
// Capture the intent sent to the system
val intended = intent {
hasAction(Intent.ACTION_SEND)
hasExtra(Intent.EXTRA_TEXT, "Expected share text")
hasType("text/plain")
}
// Assert that the intent was sent
intended.matches()
}
}
This test confirms that the app populates EXTRA_TEXT and sets the correct MIME type. If the intent is malorted, the test fails instantly.
Using UI Automator to Interact with the Share Sheet
UI Automator can cross‑process boundaries, allowing you to click items in the system share sheet. This is useful for end‑to‑end validation that a target receives the data.
@RunWith(AndroidJUnit4::class)
public class ShareSheetUiAutomatorTest {
@Test
public void shareImage_toGooglePhotos() throws Exception {
// Launch the app
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);
// Wait for the share button and click it
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
UiObject shareBtn = new UiObject(new UiSelector().resourceId("com.example.app:id/share_button"));
shareBtn.clickAndWaitForNewWindow();
// Wait for the share sheet to appear
UiObject shareSheet = new UiObject(new UiSelector().descriptionContains("Share"));
shareSheet.waitForExists(5000);
// Locate Google Photos target (text may vary by locale)
UiObject photosTarget = new UiObject(new UiSelector()
.textContains("Photos")
.className(android.widget.TextView.class.getName()));
assertTrue(photosTarget.waitForExists(5000));
// Click the target
photosTarget.clickAndWaitForNewWindow();
// Verify that Google Photos opened with the image
UiObject photoView = new UiObject(new UiSelector()
.descriptionContains("Photo")
.className(android.widget.ImageView.class.getName()));
assertTrue(photoView.waitForExists(5000));
}
}
Caveats – UI Automator tests are slower and can be flaky on devices with heavy OEM skins. Use them sparingly for critical paths, and always add explicit waits for UI elements.
Leveraging AndroidJUnitRunner with Mock Share Targets
For pure unit‑style validation, you can install a mock “share target” app that simply logs the intent it receives. This eliminates reliance on real third‑party apps and lets you assert on the exact extras.
- Create a minimal AndroidManifest for the mock target:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mockshare">
<application>
<activity android:name=".ShareReceiverActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/*"/>
</intent-filter>
</activity>
</application>
</manifest>
- In the activity, log the intent:
public class ShareReceiverActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent received = getIntent();
Log.d("MockShare", "Action: " + received.getAction());
Log.d("MockShare", "Type: " + received.getType());
Log.d("MockShare", "Text: " + received.getStringExtra(Intent.EXTRA_TEXT));
finish(); // close immediately
}
}
- Install the mock APK on the device/emulator:
adb install -r mockshare.apk. - Run your Espresso test that triggers the share. The mock target will appear in the sheet; selecting it will cause the intent to be logged. You can then assert on the logcat output.
This approach gives you deterministic verification without depending on the behavior of Facebook, Twitter, etc.
Using adb shell am start -a android.intent.action.SEND
Sometimes you want to bypass the UI entirely and test the intent resolution directly from the command line. This is handy for regression checks on device farms.
# Define the extras
adb shell am start -a android.intent.action.SEND \
-e android.intent.extra.TEXT "Hello from CLI" \
-t text/plain \
-n com.example.app/.MainActivity
You can add -f 0x1 (FLAG_ACTIVITY_NEW_TASK) if needed. After the command runs, inspect logcat for any errors from the resolving activity or from targets that fail to handle the intent.
Integrating with CI
- Instrumented tests (Espresso/UI Automator) run via Gradle:
./gradlew connectedAndroidTest. - Unit tests with mock targets can be part of the same suite or a separate
testsource set. - Collect results – Use the JUnit XML output (
testDebugUnitTestandconnectedAndroidTestgenerate reports). - Fail fast – Configure your CI to break the build if any share‑related test fails.
- Device farm – Services like Firebase Test Lab or AWS Device Farm allow you to run the same matrix across dozens of device models and API levels.
Example: Full Espresso + UI Automator End‑to‑End Test
Below is a combined test that first verifies the intent with Espresso, then uses UI Automator to select a target and confirm the outcome.
@RunWith(AndroidJUnit4::class)
class ShareEndToEndTest {
@Test
fun shareText_toCopyToClipboard() {
// --- Espresso phase: validate intent ---
ActivityScenario.launch(MainActivity::class.java)
onView(withId(R.id.share_button)).perform(click())
intended {
hasAction(Intent.ACTION_SEND)
hasExtra(Intent.EXTRA_TEXT, "Shared via test")
hasType("text/plain")
}
// If the above fails, the test stops here
// --- UI Automator phase: interact with sheet ---
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
// Wait for the share sheet to appear (system UI)
val shareSheet = device.findObject(
new UiSelector()
.className("android.widget.FrameLayout")
.descriptionContains("Share")
)
assertTrue(shareSheet.waitForExists(5000))
// Choose "Copy to clipboard" (text may differ by locale)
val copyTarget = device.findObject(
new UiSelector()
.textContains("Copy")
.className("android.widget.TextView")
)
assertTrue(copyTarget.waitForExists(5000))
copyTarget.click()
// Verify clipboard content
val clipboard = device.getUiAutomation().getClipboardText()
assertEquals("Shared via test", clipboard)
}
}
This test gives you confidence that both the intent construction and the sheet interaction work as expected on a real device.
Autonomous, Persona‑Driven Exploration with SUSATest
Even the most comprehensive manual and automated suites can miss edge cases that arise only when real users—each with distinct habits, abilities, and intents—interact with the sharing flow. Autonomous testing platforms like SUSATest address this gap by exploring the app without predefined scripts, guided by simulated user personas.
How SUSA Discovers Hidden Sharing Flows
When you point SUSA at an APK or a web URL, it launches the app and begins a guided exploration. The engine treats every UI element as a potential action: buttons, icons, menu items, and even hidden accessibility nodes. For each discovered screen, SUSA builds a model of possible transitions, noting which actions lead to new states, which produce toasts or dialogs, and which result in crashes or ANRs.
Crucially, SUSA does not assume a “happy path” only. It injects variations such as:
- Rapid taps (simulating an impatient user)
- Long presses (revealing context menus)
- Swipe‑away gestures (testing dismissal behavior)
- Input of unexpected values (e.g., pasting a huge string into an EditText before sharing)
During exploration, SUSA records the intents that are fired. If a share intent is malformed, the platform flags it as a potential defect. Because SUSA explores many paths in a single run, it can uncover sharing triggers that are buried deep inside settings menus, promotional banners, or error‑recovery flows—places a scripted test might never visit.
Persona Profiles Relevant to Sharing
SUSA ships with a set of built‑in personas, each tuned to a distinct behavior model. The following are especially useful for sharing testing:
| Persona | Behavior Traits | What It Reveals About Sharing |
|---|---|---|
| Curious | Taps every visible element, explores long‑press menus, reads tooltips | Finds hidden share icons (e.g., share via three‑dot menu) that are not obvious in the main UI |
| Impatient | Performs rapid double‑taps, quickly navigates back, cancels dialogues | Detects race conditions where a second tap corrupts the intent or causes the sheet to flash and disappear |
| Novice | Relies on labels, avoids icons without text, prefers default actions | Highlights missing contentDescription on share buttons, causing accessibility failures |
| Adversarial | Attempts to inject malformed data, tries to break limits (large strings, invalid URIs) | Surfaces crashes or security issues when the app fails to sanitize share extras |
| Elderly | Slower interaction, uses accessibility features like magnification | Uncovers issues where share targets become unreachable due to small touch targets or poor contrast |
| Accessibility | Activates TalkBack, Switch Access, font scaling | Verifies that share flow remains operable under assistive technologies |
| Power User | Uses shortcuts, shares to less‑common apps, triggers share via intent from other apps | Checks that the app correctly handles incoming share intents (if it also accepts shares) and that outgoing shares respect user‑chosen defaults |
By running SUSA with a blend of these personas, you obtain a coverage matrix that mimics real‑world usage far beyond what a deterministic script can achieve.
What SUSA Finds That Scripts Miss
- Context‑dependent share entries – Some apps only show a share button after a video finishes playing or after a user earns a badge. Scripts that start at the main activity never see these conditional UI elements.
- Dynamic permission flows – If the app requests
READ_EXTERNAL_STORAGEonly when the user attempts to share an image, a script that grants the permission up front will bypass the runtime‑permission handling logic. SUSA’s adversarial persona may trigger the share before granting, exposing missing rationale dialogs. - OEM‑specific sheet quirks – On certain devices, the share sheet reorders targets based on usage frequency. SUSA’s exploration across many virtual devices (simulating different usage histories) can reveal that a critical target gets pushed off‑screen, leading to a perceived “missing share option”.
- Localized strings overflow – In languages with longer words (German, Finnish), share button labels may be clipped, making the tap target smaller. SUSA’s localization persona, which swaps locales on the fly, catches these UI regressions.
- Background service termination – If the app relies on a Service to upload a shared file, SUSA’s power‑user persona may trigger a share then immediately swipe the app away, testing whether the service survives under aggressive battery optimizations.
Sample SUSA CLI Command
Assuming you have the SUSA agent installed (pip install susatest-agent), you can kick off a persona‑driven run as follows:
# Point to the APK on your workstation
susatest run \
--apk path/to/app-release.apk \
--personas curious impatient accessibility \
--duration 10m \
--output ./susa-report \
--format junit
--personaslimits the run to the selected profiles (you can add more or omit to use all).--durationcaps the exploration time; SUSA will stop after the elapsed period or when it exhausts new states.--outputdirects where the JSON log, screenshots, and JUnit XML report are written.
After the run, examine the report for entries tagged "share_intent" – each includes the action, type, extras, and any observed anomalies (crash, ANR, permission denial). You can feed those findings directly into your bug tracker.
Edge Cases That Only Appear in Production
Even with exhaustive lab testing, certain conditions surface only when the app meets real‑world users, networks, and device configurations. Below are several production‑only edge cases that have historically caused sharing failures.
Network‑Dependent Share Targets
Some targets (e.g., Facebook, Twitter, LinkedIn) require an active network to authenticate or to validate the shared URL. If the user is offline, the target may display a generic error or silently drop the intent.
Test – Enable airplane mode, invoke share, select a network‑dependent target, and verify that the app does not crash and that the user receives a clear offline message.
Share Sheet Customizations by OEMs
Manufacturers like Xiaomi, OnePlus, and Realme replace the default Android share sheet with their own UI, which may:
- Group targets into “Frequent” and “All” tabs
- Show promotional banners that push share options down the list
- Restrict certain categories (e.g., block sharing to competitors)
Test – Install the app on a device with a known custom sheet (or use an emulator image that mimics the OEM skin). Confirm that the app’s intent still reaches the intended target and that no UI elements obscure the share button.
Runtime Permission Changes
Android 13 introduced the granular POST_NOTIFICATIONS permission, and future releases may add more runtime‑gated capabilities. If your app shares media, it may need READ_MEDIA_IMAGES (new in Android 13) in addition to the older READ_EXTERNAL_STORAGE.
Test – On a device running Android 13+, revoke READ_MEDIA_IMAGES while leaving READ_EXTERNAL_STORAGE granted, then attempt to share an image. The app should either gracefully fall back to a lower‑resolution version or show a rationale prompt.
Deep Link Handling in Target Apps
When you share a URL or a custom URI, the target app may expect a specific deep link structure. If the app you are sharing from omits a required query parameter or uses the wrong scheme, the target may open to a generic home screen instead of the intended content.
Test – Share a known deep link (e.g., spotify:track:6rqhFgbbKwnb9MLmUQDhG6) to Spotify, then verify that the track page opens. Use adb shell dumpsys activity activities | grep mResumedActivity to confirm the foreground activity.
Multi‑Window and Picture‑in‑Picture Interactions
In split‑screen or free‑form mode, the share sheet may appear on top of both apps, or it may be anchored to the primary window. Some OEMs adjust the sheet’s opacity or animation speed.
Test – Put the app in split‑screen with
Test Your App Autonomously
Upload your APK or URL. SUSA explores like 10 real users — finds bugs, accessibility violations, and security issues. No scripts.
Try SUSA Free