簡體   English   中英

flutter FCM 通知聲音在發行版中不起作用

[英]flutter FCM notification sound not working in release

最近幾天我一直在為此苦苦掙扎。 我有 flutter 應用程序,它應該接收來自 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());
}

安卓/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"
    }
}

在你的 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);
}

}

好的,我想我找到了一種(希望)也適合你的解決方案:

像你一樣,一切都在flutter run --releaseflutter run中工作,但在我的手機上實際構建和安裝apk-release時卻沒有(A5 2017)。

所以我想*:唯一的區別是縮小,對吧? Flutter 會自動縮小 apk(請參閱: flutter.dev ),所以我使用了--no-shrink標志,現在一切正常,即使使用構建應用程序也是如此。

*我想我的意思是拉我的頭發 3 小時,而不是遠程考慮這個具體的差異。

在此處輸入圖像描述

<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@raw/{filename}"/>

將此添加到 keep.xml 中,該文件位於 android 資源目錄的原始文件夾中。 在創建發布版本時,它實際上會縮小文件並更改名稱,所以這就是我得到的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM