104

Issue: You uploaded an APK or Android App Bundle which has an activity, activity alias, service, or broadcast receiver with intent filter, but without the 'android: exported' property set. This file can't be installed on Android 12 or higher. See developer.android.com/about/versions/12/behavior-changes-12#exported

My AndroidManifest.xml file

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.c4life.guardianangel">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>


<application
   tools:replace="android:label"
   android:label="GA"
   android:exported="true"
   android:icon="@mipmap/ic_launcher">
   <meta-data android:name="com.google.android.geo.API_KEY"
       android:value="[insert API key here]"/>
    <activity
        android:name=".MainActivity"
        android:exported="true"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <meta-data
          android:name="io.flutter.embedding.android.NormalTheme"
          android:resource="@style/NormalTheme"
          />
        <meta-data
          android:name="io.flutter.embedding.android.SplashScreenDrawable"
          android:resource="@drawable/launch_background"
          />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
   <service android:name="changjoopark.com.flutter_foreground_plugin.FlutterForegroundService" android:exported="false"/>
    <meta-data
        android:name="flutterEmbedding"
        android:value="2" />


</application>

<uses-sdk
    android:targetSdkVersion="30"
    tools:overrideLibrary="changjoopark.com.flutter_foreground_plugin" />
ADM-IT
  • 3,719
  • 1
  • 25
  • 26
Syed Waleed
  • 967
  • 2
  • 5
  • 7
  • 6
    I really hate that they are changing the policies every couple of years and we have to make all these adjustments ... horrible – Ricky Levi Feb 20 '23 at 11:53

19 Answers19

102

According to google new policy If your app targets Android 12 or higher and contains activities, services, or broadcast receivers that use intent filters, you must explicitly declare the android:exported: true attribute for these app components.

FOR FLUTTER AND REACT NATIVE PROJECTS : add this line to AndroidManifest.xml file of project :

android:exported="true"

enter image description here

Now just rebuild your project. In most of the cases this work like a charm.

If above solution is not working or if your project is in Android Native follow the below instructions : In the main manifest file check all the activities, services, and receivers that can use intent-filter which are without the android: exported tag. Add android:exported="true" or android:exported="false" for these tags.

You might ask when I need to add android:exported="true" or android:exported="false" to the activities, services, or broadcast receivers that use intent filters. If the app component includes the LAUNCHER category, set android: exported to true otherwise set android: exported to false.

If adding the android: exported in the main manifest file not works for you follow the below steps:

  • open AndroidManifest.xml file and at the bottom select Merged Manifest. like this : enter image description here

  • if you are not able to preview Merged Manifest then in your build.gradle file set compileSdkVersion 30 and targetSdkVersion 30 and sync your project and now try to open the merged manifest again I hope this time you will have a proper preview of the merged manifest. but if there is no preview don't worry you can still navigate to individual manifest files from different third-party libraries you have used in your project.

  • Note: also check individual third-party library manifest files if there is any activity, service, or receiver using then you have to override the same activity, service, or receiver in your main manifest file with android: exported property.

For Example in my case I have defined android: exported for each and every activity, service, or receiver in my main manifest file but in my project, I was using Razorpay dependency so in the manifest of Razorpay I found that there is an activity and receiver which are using property without android: exported so I declared them in my main manifest files. as shown below :

 <activity
        android:name="com.razorpay.CheckoutActivity"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:theme="@style/CheckoutTheme"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <data
                android:host="rzp.io"
                android:scheme="io.rzp" />
        </intent-filter>
    </activity>

    <receiver android:name="com.razorpay.RzpTokenReceiver"
        android:exported="true"
        android:permission="android.permission.INTERNET">
        <intent-filter>
            <action android:name="rzp.device_token.share" />
        </intent-filter>
    </receiver>

Note: in your case, you may have to go through more files and check activity, and services, and mention them in your main manifest file.

  • also after doing all this you can change back to targetSdkVersion 31 and compileSdkVersion 31 in your build.gradle file.
MANISH
  • 2,883
  • 4
  • 11
  • 30
  • 1
    Great this worked for me as well, as I am also using the Razorpay library then after adding `CheckoutActivity` and `RzpTokenReceiver` in manifest as mentioned above. – Shailendra Madda Jan 25 '22 at 09:27
  • 2
    Great!! looking at the output manifest file in obj/Debug/Android i find the service with "intent-filter" but that not have "android:exported" set – Ricko.. Jan 28 '22 at 17:04
  • Can we do it in class file because in my case I'm using Xamarin Forms and don't have activity tag in manifest file – Siddhant maurya Oct 17 '22 at 12:59
  • please refer to this : https://learn.microsoft.com/en-us/answers/questions/771779/xamarinforms-and-android-12-exportedtrue.html – MANISH Oct 17 '22 at 14:21
  • Hi, can you please help me i used android:exported="true" in androidManifest.xml file in every tag that uses intent-filter, but now i get this error: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:processReleaseManifest'. > Manifest merger failed with multiple errors, see logs BUILD FAILED in 31s 14 actionable tasks: 14 executed Command failed with exit code 1: C:\givlly\filos\platforms\android\gradlew cdvBuildRelease -b C:\givlly\filos\platforms\android\build.gradle – Nasyx Nadeem Oct 28 '22 at 14:47
  • `also check individual third-party library manifest files` OMG, for a tiny change in an old app I had to end up upgrading a large bunch of things to be able to deploy. Thanks for the hint. – maganap Jan 21 '23 at 13:36
44

In my case, I just add this line to my manifest:

android:exported="true"

enter image description here

AMMAR ELHAMDO
  • 519
  • 4
  • 12
20

By just adding exported:true to Android manifest activity did not solve my issue. Probably because the libraries your application depends on does not have exported:true You shouldn't encounter this bug in the future as long as all the libraries your application depends on are updated with exported:true

You have to

  • open project in Android studio
  • Open Androidmanifest.xml
  • At the bottom select merged manifest

enter image description here

  • Now ensure that you add exported to true wherever stated and fix those warnings specified on the line (in blue) and tapping blue text does not take you to one of these tags Services, activity, receiver in above step then look for the library for which the merge error exist

e.g a merge error here shows issue in flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService

enter image description here

So go to the manifest of that specific library which is listed in blue above the error, where you can add exported to true.(this will also resolve the merge error)

enter image description here

Add exported to true in services tag

enter image description here

Video demo here: https://www.youtube.com/watch?v=hy0J8MNnE6g

Mahesh Jamdade
  • 17,235
  • 8
  • 110
  • 131
14

I finally fixed this issue

1: install emulator with android v 12

2: run your app the compailer will tell you what service/reciver...etc casued the issue

now you have to add it to your manifist and add the android:exported="true" to it

in my case the prblem was with the local notifcation package i got the message to fix this receiver com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver so i added to my manifist out side the main activity

 <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
 android:exported="true">
       <intent-filter>
           <action android:name="android.intent.action.BOOT_COMPLETED"/>
           <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
       </intent-filter>
   </receiver>

and it worked as intended

5

if use targetSdkVersion=31

    package="com.name.app"><!-- Channnge your package -->
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <data android:scheme="https" />
        </intent>
        <intent>
            <action android:name="android.intent.action.DIAL" />
            <data android:scheme="tel" />
        </intent>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="*/*" />
        </intent>
    </queries>
   <application
        android:label="Tut Elimi"
        android:icon="@mipmap/ic_launcher">
       <service android:name="com.example.app.backgroundService"
           android:exported="true">
           <intent-filter>
               <action android:name="com.example.app.START_BACKGROUND" />
           </intent-filter>
       </service>
       <meta-data
           android:name="com.google.android.gms.ads.APPLICATION_ID"
           android:value=""/>
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize"
            android:exported="true">

            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <meta-data
                android:name="io.flutter.embedding.android.SplashScreenDrawable"
                android:resource="@drawable/splash"
                />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <!-- Displays an Android View that continues showing the launch screen
                 Drawable until Flutter paints its first frame, then this splash
                 screen fades out. A splash screen is useful to avoid any visual
                 gap between the end of Android's launch screen and the painting of
                 Flutter's first frame. -->
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
       <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
           android:exported="true">
           <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED"/>
               <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
           </intent-filter>
       </receiver>
       <service
           android:name="com.name.app.BackgroundService"
           android:enabled="true"
           android:exported="true" />
       <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>  

</manifest>  ````   
4

The "exported" attribute describes whether or not someone else can be allowed to use it.

So if you have "exported=false" on an Activity, no other app, or even the Android system itself, can launch it. Only you can do that, from inside your own application.

So settings "exported=false" on the Activity marked as the LAUNCHER Activity would basically tell the system that it cant launch your application, ever.

Mahendran Candy
  • 1,114
  • 17
  • 17
4

If your Android Studio don't show the Merged Manifest tab, you can figure out what is the problem by searching on the merged AndroidManifest.xml file.

To me it was on: \build\app\intermediates\merged_manifests\release\AndroidManifest.xml

And my problem was the ScheduledNotificationBootReceiver:

Add this to your Manifest:

       <receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"
           android:exported="true">
       </receiver>
E. Greeff
  • 359
  • 1
  • 11
  • 1
    this one help me with react native project with so many library. so the gist is you build or run, then you look at app/build/intermedied/merged_manifest/release/AndroidManifest.xml then look at all that have then copy from open tag above it and the closing tag either it activities, services, or broadcast, receivers. then paste to folder android/app/src/main/AndroidManifest.xml and dont forget to put android:exported="true" to fix it. if you already cover all intent-filter then save then build again. – Rebirth Bloods Feb 01 '23 at 09:32
1

If you are not using any other project then update all library latest versions because some old library AndroidManifest.xml not added android: exported in activities, services, or broadcast receivers

Abhi S
  • 250
  • 2
  • 18
1

I had a really old app which needed some updates but I could not find the Merged Manifest button in my Android Studio, so for others who could not find the option as well, this is how I fixed my issue.

  1. Navigate to your main AndroidManifest.xml file (stored at android/app/src/main/AndroidManifest.xml) and add android:exported="true" or android:exported="false" to any activity, service, receiver etc encapsulating <intent-filter>. For example
<activity
  android:name="com.name.here"
  android:exported="true"> <!-- or Add android:exported="false" -->
  <intent-filter>
    <!-- ... -->
  </intent-filter>
</activity>

The android:exported specifies if the activity, service, receiver etc encapsulating an <intent-filter> can be launched by components of other applications. Set this parameter to "true" allows other apps to start it.

  1. If you have bundled the app with def enableSeparateBuildPerCPUArchitecture = true (i.e. separate build files for different CPUs), go to the android/app/build.gradle file and set it to false. Then rebundle the app. (This makes step 4 much easier.)

  2. Find your merged_manifests and search for all <intent-filter> encapsulators which do not have android:exported.

    I found mine at android/app/build/intermediates/merged_manifests/release/AndroidManifest.xml.

  3. Copy them to your main AndroidManifest.xml and add android:exported to them.

  4. Re-Bundle the app.

You should now be able to publish the newly generated .aab file.

Manil Malla
  • 133
  • 8
0

If you are flutter developer and unable to find Merged Manifest tab, follow th e steps:

  1. Open Project in Android Studio.
  2. Navigate to main AndroidManifest.xml.
  3. Navigation
  4. Wait for Project Loading Wait for Project
  5. Here it is... Found
0

The problem on my RN app is that at debug/AndroidManifest.xml the exported for facebook.react.devsupport was set to false. changed that to true solved it.

Pressing merged Manifest showed me where the issue is.

enter image description here

Hope that helps.

0

Xamarin Forms: I was able to publish it, I had to update the AndroidManifest with the path obj\Release\120\android\manifest since some "receiver" were not there and had not added the "android:exported".

0

This is for Unity Developers in specific and for any frame work targeting android platform in general. If by any means, you are not able to publish even if you have added android:exported property to every activity/receiver containing intent filter, then you should do this approach and hopefully you will be able to solve the issue.

Problem

Recently, Playstore started to require apps / games to target API 31. You updated SDK, Gradle and all that stuff. You got a build, published to PlayStore and now Playstore is telling you, this

you uploaded an APK or Android App Bundle which has an activity, activity alias, service or broadcast receiver with intent filter, but without 'android:exported' property set.

YOU HAVE ALREADY TRIED

You now know that the Android Manifests including in you app / game contains some Activities, receivers, activity-alias etc which contain intent-filter but does not have android:exported property set to true or false.

You tried adding this property to all of the Manifests and unity 's own manifest by Enablisng Custom Android Manifest too. But still Playstore is not accepting the app.

You don't want to update Unity version to fix this. You still have a solution.

Let's Narrows down

You are doing good in adding android:exported property but when you are getting build, not all of those tags persist. During build, unity is replacing you properties, especially properties related to external plugins you have used in your app.

So lets have a look which plugins contain problematic activities/receivers etc.

Instead of building a bundle or apk, Export your unity project as Android Project.

Open project in android studio, and build there.

After build is complete, go to this file which is the Merged Menifest containing data from all individual manifests.

YourExportedProjectFolder\launcher\build\intermediates\merged_manifests\release

enter image description here

Go precisely through this file and check which activities/receivers etc does not contain exported:property set. Not down that plugin. That is the culprit.

Let's fix it

Go back to unity, go to the relevant plugin manifest, copy those specific problematic activities (Complete i.e. along with intent-filters) from that manifest and paste to

Assets/Plugin/Android/AndroidManifest

Something like this

 <receiver android:name="universal.tools.notifications.ScheduledNotificationsRestorer" 
android:exported="true" 
tools:replace="android:exported">
  <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
  </intent-filter>
</receiver>

Now build again and you should be good to go!

0

for react native that have many library i fix it with this step : first is you build or run, then you look at app/build/intermedied/merged_manifest/release/AndroidManifest.xml then look at all that have then copy from open tag above it and the closing tag either it activities, services, or broadcast, receivers. then paste to folder android/app/src/main/AndroidManifest.xml and dont forget to put android:exported="true" to fix it. if you already cover all intent-filter then save then build again.

0

For Unity, I went to gameProjectFolder\Temp\StagingArea, copied unityManifest to gameProjectFolder\Assets\Plugins\Android and changed the name to AndroidManifest. Finally, I added android:exported="true" in the label activity.

double-beep
  • 5,031
  • 17
  • 33
  • 41
0

if you are using flutter , upgrading flutter_local_notifications to the latest version (now is 15.1.1) solved this error for me..

reference : https://stackoverflow.com/a/71134978/7048025

Amer Alzibak
  • 1,489
  • 15
  • 16
-1

Adding the line android:exported="true" to my Manifes

-1

Need to add android:exported="true" to all components which has an intent-filter.

See where you need to add it you can opening Merged Manifest file.

enter image description here

enter image description here

enter image description here

enter image description here

Dyno Cris
  • 1,823
  • 1
  • 11
  • 20
-4

Just change
build.gradle -> defaultConfig

targetSdkVersion="31"

to

targetSdkVersion="30"

work normal for me.

cursorrux
  • 1,382
  • 4
  • 9
  • 20