Reputation: 455
I'm getting a Flutter build error in AndroidManifest.xml
android:exported needs to be explicitly specified for element <service#io.intercom.android.sdk.fcm.IntercomFcmMessengerService>. Apps targeting Android 12 and higher are required to specify an explicit value for
android:exported
when the corresponding component has an intent filter defined
There is no element called intercom in the AndroidManifest.xml file. I also added android:exported="true" in activity ".MainActivity" but the error still persists.
My AndoidManifest.xml file is as follows
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="social.myproject.app">
<!-- The INTERNET permission is required for development. Specifically,
flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https"/>
</intent>
<intent>
<action android:name="com.google.android.youtube.api.service.START" />
</intent>
</queries>
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
calls FlutterMain.startInitialization(this); in its onCreate method.
In most cases you can leave this as-is, but you if you want to provide
additional functionality it is fine to subclass or reimplement
FlutterApplication and put your custom class here. -->
<application
android:requestLegacyExternalStorage="true"
android:label="myproject"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true"
>
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
android:hardwareAccelerated="true"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<!-- Specify that the launch screen should continue being displayed -->
<!-- until Flutter renders its first frame. -->
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background" />
<!-- Theme to apply as soon as Flutter begins rendering frames -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:scheme="https"
android:host="www.myproject.social"
android:pathPrefix="/api/auth/"/>
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:scheme="https"
android:host="www.myproject.io"
android:pathPrefix="/api/auth/"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/*"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="video/*"/>
</intent-filter>
</activity>
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
</application>
</manifest>
The detailed error trace :
See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.
[ +1 ms] E:\App Development\MyApp - Changes\android\app\src\main\AndroidManifest.xml:11:9-16:19 Error:
[ ] android:exported needs to be explicitly specified for element <service#io.intercom.android.sdk.fcm.IntercomFcmMessengerService>. Apps targeting Android 12 and higher are required to specify an
explicit value for `android:exported` when the corresponding component has an intent filter defined
The error trace points to the following lines :
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-feature
android:name="android.hardware.camera"
android:required="true"/>
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false"/>
EDIT: Updated the intercom version to 7.2.0. I get the follwing error now
error: Instance member 'initialize' can't be accessed using static access. (static_access_to_instance_member at lib\services\intercom.dart:27)
The trace points to this line :
await Intercom.initialize(appId, iosApiKey: iosApiKey, androidApiKey: androidApiKey);
My intercom.dart
import 'dart:convert';
import 'package:myproject/models/user.dart';
import 'package:myproject/services/user.dart';
import 'package:crypto/crypto.dart';
import 'package:meta/meta.dart';
import 'package:intercom_flutter/intercom_flutter.dart';
class IntercomService {
late UserService _userService;
late String iosApiKey;
late String androidApiKey;
late String appId;
void setUserService(UserService userService) {
_userService = userService;
}
void bootstrap(
{required String iosApiKey,
required String androidApiKey,
required String appId}) async {
this.iosApiKey = iosApiKey;
this.androidApiKey = androidApiKey;
this.appId = appId;
await Intercom.initialize(appId,
iosApiKey: iosApiKey, androidApiKey: androidApiKey);
}
Future displayMessenger() {
return Intercom.displayMessenger();
}
Future enableIntercom() async {
await disableIntercom();
User? loggedInUser = _userService.getLoggedInUser();
if (loggedInUser == null) throw 'Cannot enable intercom. Not logged in.';
assert(loggedInUser.uuid != null && loggedInUser.id != null);
String userId = _makeUserId(loggedInUser);
return Intercom.registerIdentifiedUser(userId: userId);
}
Future disableIntercom() {
return Intercom.logout();
}
String _makeUserId(User user) {
var bytes = utf8.encode(user.uuid! + user.id.toString());
var digest = sha256.convert(bytes);
return digest.toString();
}
}
Upvotes: 6
Views: 5542
Reputation: 1002
Add this to application tag in main folder AndroidManifest or fork the package you used and add it to package and push it back again to pub.dev :)
<application>
<receiver android:name="com.farsitel.bazaar.auth.receiver.AuthReceiver"
android:exported="true">
</receiver>
</application>
Upvotes: 0
Reputation: 62429
Possibilities:
Have you tried to do "Invalidate/Cache and Restart"?
Have you tried to open the Project with the Android folder? It would display the errors if you missed anything in AndroidManifest.xml.
You can also try with flutter clean
& flutter pub get
to run again.
You have added some libraries and they haven't updated this service IntercomFcmMessengerService
with exported = true/false
That's the reason why you are getting problems. You can do one thing that defines that service in your <application>
tag with exported=true
. It will override that service.
Upvotes: 3
Reputation: 455
Solved it by adding static to the methods being accessed in the core intercom_flutter package part of External libraries.
Upvotes: -3
Reputation: 17792
This happens sometimes even if we add android exported. A workaround will be to set the targetSdkVersion to 31 and compileSDKVersion to 31 in android->app->build.gradle file
Upvotes: 0