【问题标题】:Android 8.1 notifications showing but not making any soundsAndroid 8.1 通知显示但不发出任何声音
【发布时间】:2018-03-12 10:23:52
【问题描述】:

我有一个在前台运行的服务,其中包括秒表。当服务启动时,会出现通知,当它结束时,我会用声音和一些指示它完成的文本来更新它。问题是这在 api 25 之前运行良好,但对于 26 和 27,它可以更新通知,但没有声音。以下是相关代码:

在服务内创建通知:

mBuilder = new NotificationCompat.Builder(context, "Main")
            .setSmallIcon(R.drawable.ic_notification_temp)
            .setContentTitle(step.getDescription())
            .setContentText(getString(R.string.notification_text))
            .setVisibility(VISIBILITY_PUBLIC)
            .setOngoing(true);
            .setDeleteIntent(deletePendingIntent);
            .setContentIntent(contentPendingIntent);
            .addAction(R.drawable.ic_stop_red_24dp, getString(R.string.cancel),finnishPendingIntent);

mNotificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(mId, mBuilder.build());

“工作”完成后通知生成器的更新:

mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));        
mBuilder.setVibrate(new long[]{0, 300, 0, 400, 0, 500});
mBuilder.setOngoing(false);
mBuilder.setAutoCancel(true);
mBuilder.setContentText(getString(R.string.notification_finished_text));

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    mBuilder.setChannelId("Sound");
    mBuilder.setCategory(NotificationCompat.CATEGORY_ALARM);
}
mNotificationManager.notify(mId, mBuilder.build());

在应用启动时仅为 api 26 或更高版本创建的 2 个通道:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create the normal NotificationChannel
    CharSequence name = getString(R.string.app_name);
    int importance = NotificationManager.IMPORTANCE_LOW;
    NotificationChannel channel = new NotificationChannel("Main", name, importance);
    // Register the channel with the system; you can't change the importance
    // or other notification behaviors after this
    NotificationManager notificationManager = (NotificationManager) getSystemService(
            NOTIFICATION_SERVICE);
    notificationManager.createNotificationChannel(channel);

    // Create theNotificationChannel with sound
    importance = NotificationManager.IMPORTANCE_HIGH;
    name = getString(R.string.notification_channel_sound);
    NotificationChannel sound = new NotificationChannel("Sound", name, importance);
    sound.enableVibration(true);
    sound.setVibrationPattern(new long[]{0, 300, 0, 400, 0, 500});
    AudioAttributes aa = new AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .setLegacyStreamType(AudioManager.STREAM_NOTIFICATION)
            .setUsage(AudioAttributes.USAGE_NOTIFICATION_EVENT)
            .build();
    sound.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), aa);
    notificationManager.createNotificationChannel(sound);
}

这就是我现在所处的位置。我尝试不使用 setsound() ,因为我已经读到通知应该只播放具有适当重要性的默认声音(当然我什至在尝试正确更新频道设置之间卸载了应用程序)但没有似乎适用于 api 26,我只是不知道我做错了什么。

【问题讨论】:

  • 安装应用时,您在通知设置中看到了什么?显示通知时您的活动是否正在运行?
  • @ViktorYakunin 这两个通道已成功创建,但通知从服务运行,尽管我试图让调用服务的活动处于活动状态以防万一。通知显示和行为正确(首先只是抽屉中的徽章,没有视觉中断,然后更新的文本和通知按应有的方式显示,只是没有任何声音)。
  • @MohammadTabbara 是的,我试过这样来测试它是否只是模拟器的问题,不知何故没有默认通知声音,但听起来还不错。但这种解决方法也存在一些问题......
  • 再次,您在设置->应用和通知->[您的应用]->应用通知中看到了什么?

标签: java android notifications


【解决方案1】:

我的大多数模拟器 AVD 都遇到了完全相同的问题。以下为我修复了它:

  • 启动受影响的 AVD
  • 长按 AVD 的电源按钮
  • 重启 AVD

之后它应该再次工作。

【讨论】:

    【解决方案2】:

    尝试重现您的问题并完成创建的 MVP,也许这将帮助您找到问题:

    活动:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            View btn = findViewById(R.id.clickMe);
            btn.setTag(NotifService.CHANNEL_ID_MAIN);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String channelId = (String) v.getTag();
                    Intent intent = new Intent(v.getContext(), NotifService.class);
                    intent.putExtra(NotifService.TAG, channelId);
                    if (channelId.equals(NotifService.CHANNEL_ID_MAIN)) {
                        v.setTag(NotifService.CHANNEL_ID_SOUND);
                    } else {
                        v.setTag(NotifService.CHANNEL_ID_MAIN);
                    }
                    v.getContext().startService(intent);
                }
            });
        }
    }
    

    服务:

    public class NotifService extends IntentService {
        public static final String TAG = "NotificationService";
        public static final String CHANNEL_ID_MAIN = "Main";
        public static final String CHANNEL_ID_SOUND = "Sound";
        public static final int NOTIFICATION_ID = 123;
    
        /**
         * Creates an IntentService.  Invoked by your subclass's constructor.
         */
        public NotifService() {
            super(TAG);//Used to name the worker thread, important only for debugging.
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(CHANNEL_ID_MAIN, "Channel Main", NotificationManager.IMPORTANCE_LOW);
            NotificationChannel sound = new NotificationChannel(CHANNEL_ID_SOUND, "Channel Sound", NotificationManager.IMPORTANCE_HIGH);
                sound.enableVibration(true);
                sound.setVibrationPattern(new long[]{0, 300, 0, 400, 0, 500});
                AudioAttributes aa = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setLegacyStreamType(AudioManager.STREAM_NOTIFICATION)
                        .setUsage(AudioAttributes.USAGE_NOTIFICATION_EVENT)
                        .build();
                sound.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), aa);
                NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                if (notificationManager != null) {
                    notificationManager.createNotificationChannel(channel);
                    notificationManager.createNotificationChannel(sound);
                }
            }
        }
    
        @Override
        protected void onHandleIntent(@Nullable Intent intent) {
            String channelId = intent.getStringExtra(TAG);
            showNotification(channelId);
        }
    
        private void showNotification(String channelId) {
            boolean inProgress = channelId.equals(CHANNEL_ID_MAIN);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_launcher_foreground)
                    .setContentTitle("Work")
                    .setContentText(inProgress ? "InProgress" : "Finished")
                    .setOngoing(inProgress)
                    .setVisibility(VISIBILITY_PUBLIC)
                    .setAutoCancel(!inProgress);
    
            if (!inProgress) {
                builder.setCategory(NotificationCompat.CATEGORY_ALARM);
            }
    
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            if (notificationManager != null) {
                notificationManager.notify(NOTIFICATION_ID, builder.build());
            }
        }
    }
    

    这在我的设备 8.1 和 Emulator 8.1 上运行良好(第一次单击时没有声音,第一次通知时没有声音,第二次单击时振动+声音通知工作完成)。

    【讨论】:

    • 好的。我刚刚将您的所有代码复制到一个新项目并在这里尝试过,它也是如此,通知显示但没有声音。所以这一定是我的模拟器或其他东西的问题......非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多