Search code examples
androidkotlinandroid-intentmanifest

Opening an Android App from another Android App using Intents


I am having an issue opening one of my other application using Intents in Android. Here is what I have right now:

        val packageName = "com.myapp.demo.application"
        val activityName = "$packageName.WelcomeActivity"

        try {
            val intent = Intent().apply {
                setClassName(packageName, activityName)
                action = Intent.ACTION_MAIN
                addCategory(Intent.CATEGORY_LAUNCHER)
            }
            startActivity(intent)
            requireActivity().finish()
        } catch (e: Exception) {
            Toast.makeText(
                context,
                "App not installed",
                Toast.LENGTH_LONG
            ).show()
        }
    }

And the manifest in the second application looks like this:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.myapp.demo.application">

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar"
        android:usesCleartextTraffic="true"
        tools:ignore="UnusedAttribute">

        <activity android:name=".SimpleScannerActivity" />
        <activity android:name=".MainActivity" />

        <activity
            android:name=".WelcomeActivity"
            android:exported="true"
            android:label="@string/title_activity_welcome">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <!-- Permissions and features declarations go here -->
    <!-- ... -->

    <uses-sdk tools:overrideLibrary="com.google.zxing.client.android" />

</manifest>

I am always getting this exception:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.myapp.demo.application/com.myapp.demo.application.WelcomeActivity}; have you declared this activity in your AndroidManifest.xml?

What I am missing here? I have tried starting another application with different package name and it worked with the same code, but not for my com.myapp.demo.application. Maybe something is not right with my demo application manifest?


Solution

  • If you want to launch the start(activity with the catergory LAUNCHER ) activity of your appA from appB, then it can be done using :

    val launchIntent = getPackageManager().getLaunchIntentForPackage("com.myapp.demo");
    if (launchIntent != null) { 
        startActivity(launchIntent); 
    

    And if you want to open some other activity then create a deep link uri for that activity.

    Add the data tag in manifest.xml of appA

     <intent-filter android:label="@string/filter_view_example_gizmos">
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <!-- Accepts URIs that begin with "demo://myapp” -->
            <data android:scheme="demo"
                  android:host="myapp" />
        </intent-filter>
    
    

    Adding the queries tag in the manifest of appB

      <queries>
            <package android:name="com.myapp.demo"/>
            <intent>
                <action android:name="android.intent.action.VIEW" />
            </intent>
        </queries>
    

    Launching the activity of appA from appB

              val uri = Uri.parse("demo://myapp")
                val intent = Intent(Intent.ACTION_VIEW, uri)
    
    
                intent.resolveActivity(packageManager)?.also {
                    startActivity(intent)
                }