颤动的 FCM 通知声音在发布中不起作用
Posted
技术标签:
【中文标题】颤动的 FCM 通知声音在发布中不起作用【英文标题】:flutter FCM notification sound not working in release 【发布时间】:2021-04-16 05:41:40 【问题描述】:最近几天我一直在为此苦苦挣扎。我有颤振的应用程序,应该接收来自 firebase 的通知(使用 FCM)并播放自定义声音。如果我使用flutter run
或flutter run --release
运行应用程序,这很好用,但是如果我使用flutter build apk --release
构建应用程序并在我的手机上手动安装它,我仍然会收到通知但声音丢失,它甚至不会播放默认通知声音。
我检查了我的声音是否打开,以及应用设置中的通知通道是否正确。
main.dart
void main() async
// needed if you intend to initialize in the `main` function
WidgetsFlutterBinding.ensureInitialized();
fcm.getToken().then((value)
print("TOKEN:" + value);
);
fcm.configure(
onResume: (Map<String, dynamic> message) async ,
onLaunch: (Map<String, dynamic> message) async ,
onMessage: (Map<String, dynamic> message) async
AudioCache _audioCache = AudioCache(
prefix: "sounds/",
fixedPlayer: AudioPlayer()..setReleaseMode(ReleaseMode.STOP));
_audioCache.play('merchant_notify.mp3');
,
);
runApp(MyApp());
android/build.gradle
buildscript
ext.kotlin_version = '1.3.50'
repositories
google()
jcenter()
dependencies
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.2'
allprojects
repositories
google()
jcenter()
rootProject.buildDir = '../build'
subprojects
project.buildDir = "$rootProject.buildDir/$project.name"
subprojects
project.evaluationDependsOn(':app')
task clean(type: Delete)
delete rootProject.buildDir
android/app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.google.gms.google-services'
android
compileSdkVersion 28
sourceSets
main.java.srcDirs += 'src/main/kotlin'
lintOptions
disable 'InvalidPackage'
defaultConfig
applicationId ""
minSdkVersion 21
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
buildTypes
release
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
flutter
source '../..'
dependencies
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
androidmanifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:name="io.flutter.app.FlutterApplication"
android:label=""
android:icon="@mipmap/launcher_icon">
<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:showWhenLocked="true"
android:turnScreenOn="true">
<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>
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
MainActivity.kt
package com.example.merchant_delivery
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity()
res\raw\sound.mp3
也有声音文件
这是我发送到 firebase FCM 的 json:
"registration_ids": [
],
"notification":
"title": "Test notification",
"body": "Body test",
"android_channel_id": "channel_name",
"channel_id": "channel_name",
"sound": "sound",
"priority":"high"
【问题讨论】:
你终于找到解决方案了吗? 不,我真的不知道我是如何解决的。我可以把代码发给你,如果你有同样的问题,你可以试试 是的,那太好了。谢谢! 【参考方案1】:在你的 MainActivity.java 中试试这个
import io.flutter.embedding.android.FlutterActivity;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
public class MainActivity extends FlutterActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
Uri soundUri=Uri.parse("android.resource://"+getApplicationContext()
.getPackageName() + "/" + R.raw.[soundName without extension]);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build();
// Creating Channel
NotificationChannel channel = new NotificationChannel([ChannelId],[ChannelName], NotificationManager.IMPORTANCE_HIGH);
channel.setSound(soundUri, audioAttributes);
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
// GeneratedPluginRegistrant.registerWith(this);
【讨论】:
【参考方案2】:好的,我想我找到了一个(希望)也适合你的解决方案:
和你一样,在 flutter run --release
或 flutter run
中一切正常,但在我的手机上实际构建和安装 apk-release
时却不行(A5 2017)。
所以我想*:唯一的区别是缩小,对吧? Flutter 会自动缩小 apk(请参阅:flutter.dev),因此我使用了--no-shrink
标志,现在一切正常,即使使用构建应用程序也是如此。
*我的意思是拉我的头发 3 小时,而不是远程考虑这个具体的区别。
【讨论】:
是否有任何具体原因会导致此问题?我已经修好了,但不知道怎么修,这是我的 MainActivitiy.ktclass Application : FlutterApplication(), PluginRegistrantCallback override fun onCreate() super.onCreate() FlutterFirebaseMessagingService.setPluginRegistrant(this); override fun registerWith(registry: PluginRegistry?) io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin.registerWith(registry?.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
我认为这有帮助!
所以你能给我一个好的结论吗?比如,应该是什么顺序,例如:会是,flutter -- no-shrink
还是flutter run --no-shrink
【参考方案3】:
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@raw/filename"/>
将此添加到 android 资源目录的原始文件夹中的 keep.xml 中。 在创建发布版本时,它实际上会缩小文件并更改名称,所以这就是我得到的解决方案。
【讨论】:
您的解决方案应该可以工作,请检查一下,谢谢!以上是关于颤动的 FCM 通知声音在发布中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
FCM 推送通知在 android 中不起作用(使用 cordova-plugin-fcm 2.1.1 的 Ionic 项目)