代码之家  ›  专栏  ›  技术社区  ›  Ashish John

自定义通知声音在Android Oreo中不起作用

  •  28
  • Ashish John  · 技术社区  · 6 年前
    Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.notification_mp3);
                mBuilder.setSound(sound);
    

    我已经将mp3(notification_mp3.mp3)文件复制到了res文件夹中的raw文件夹中。当通知被触发时,它会产生高达 安卓牛轧糖 但是默认的声音 安卓奥利奥 . 我参考了很多网站,但都没有成功 安卓奥利奥 .我没有发现Android文档中关于Android O&中通知声音的任何变化;在上面 为了让这段代码也能在Android O中运行,应该做些什么更改?

    8 回复  |  直到 5 年前
        1
  •  5
  •   Usman Zafer    4 年前

    要在Oreo中为通知设置声音,必须打开声音 NotificationChannel 而不是在 Notification Builder 它本身你可以这样做

    Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.getPackageName() + "/" + R.raw.notification_mp3);
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    
            NotificationChannel mChannel = new NotificationChannel("YOUR_CHANNEL_ID",
                "YOUR CHANNEL NAME",
                NotificationManager.IMPORTANCE_DEFAULT)
    
            AudioAttributes attributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                    .build();
    
            NotificationChannel mChannel = new NotificationChannel(CHANNEL_ID, 
                    context.getString(R.string.app_name),
                    NotificationManager.IMPORTANCE_HIGH);
    
            // Configure the notification channel.
            mChannel.setDescription(msg);
            mChannel.enableLights(true);
            mChannel.enableVibration(true);
            mChannel.setSound(sound, attributes); // This is IMPORTANT
    
    
            if (mNotificationManager != null)
                mNotificationManager.createNotificationChannel(mChannel);
        }
    

    这将为您的通知设置自定义声音。但如果应用程序正在更新,且之前使用过通知频道,则不会更新。i、 e.你需要创建一个不同的频道,并设置声音使其工作。但这将在应用程序的应用程序信息的通知部分显示多个频道。如果你将声音设置为一个全新的频道,这很好,但如果你想在之前使用该频道,你必须删除现有的频道并重新创建该频道。要做到这一点,你可以在创建频道之前做类似的事情

    if (mNotificationManager != null) {
                List<NotificationChannel> channelList = mNotificationManager.getNotificationChannels();
    
                for (int i = 0; channelList != null && i < channelList.size(); i++) {
                    mNotificationManager.deleteNotificationChannel(channelList.get(i).getId());
                }
            }
    
        2
  •  0
  •   Baljinder Maan    4 年前

    这可能对新来者有所帮助。

    下面是一个适用于所有android版本的通知示例代码,其中包含各种可能的设置。

    1 -> sound and vibration
    2 -> sound but no vibration
    3 -> no sound but vibration
    4 -> no sound no vibration
    

    输出

    enter image description here

    Github回购-> https://github.com/usman14/Notification

    密码

    主要活动

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.NotificationCompat;
    import android.annotation.TargetApi;
    import android.app.Notification;
    import android.app.NotificationChannel;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Build;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.CompoundButton;
    import android.widget.Switch;
    
    public class MainActivity extends AppCompatActivity {
    
        public boolean shouldSound;
        public boolean shouldVibrate;
        NotificationManager notificationManager;
    
        Button button;
        Switch soundSwitch;
        Switch vibrationSwitch;
    
        @TargetApi(Build.VERSION_CODES.O)
        public void registerNormalNotificationChannel(android.app.NotificationManager notificationManager) {
    
            NotificationChannel channel_all = new NotificationChannel("CHANNEL_ID_ALL", "CHANNEL_NAME_ALL", NotificationManager.IMPORTANCE_HIGH);
            channel_all.enableVibration(true);
            notificationManager.createNotificationChannel(channel_all);
    
            NotificationChannel channel_sound = new NotificationChannel("CHANNEL_ID_SOUND", "CHANNEL_NAME_ALL", NotificationManager.IMPORTANCE_HIGH);
            channel_sound.enableVibration(false);
            notificationManager.createNotificationChannel(channel_sound);
    
            NotificationChannel channel_vibrate = new NotificationChannel("CHANNEL_ID_VIBRATE", "CHANNEL_NAME_ALL", NotificationManager.IMPORTANCE_HIGH);
            channel_vibrate.setSound(null, null);
            channel_vibrate.enableVibration(true);
            notificationManager.createNotificationChannel(channel_vibrate);
    
    
            NotificationChannel channel_none = new NotificationChannel("CHANNEL_ID_NONE", "CHANNEL_NAME_ALL", NotificationManager.IMPORTANCE_HIGH);
            channel_none.setSound(null, null);
            channel_none.enableVibration(false);
            notificationManager.createNotificationChannel(channel_none);
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = findViewById(R.id.btn);
            soundSwitch = findViewById(R.id.switch_sound);
            vibrationSwitch = findViewById(R.id.switch_vibration);
            notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            if (isOreoOrAbove()) {
                setupNotificationChannels();
            }
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    makeNotification();
                }
            });
    
            soundSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if (b) {
                        shouldSound = true;
                    } else {
                        shouldSound = false;
                    }
                }
            });
    
            vibrationSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                    if (b) {
                        shouldVibrate = true;
                    } else {
                        shouldVibrate = false;
                    }
                }
            });
        }
    
        private void setupNotificationChannels() {
            registerNormalNotificationChannel(notificationManager);
        }
    
        public void makeNotification() {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, getChannelId())
                    .setContentTitle("Hi")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentText("Welcome to Android");
    
            Intent intent = new Intent(MainActivity.this, MainActivity.class);
    
            PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            builder.setContentIntent(pendingIntent);
            if (shouldSound && !shouldVibrate) {
                builder.setDefaults(Notification.DEFAULT_SOUND)
                        .setVibrate(new long[]{0L});
            }
            if (shouldVibrate && !shouldSound) {
                builder.setDefaults(Notification.DEFAULT_VIBRATE)
                        .setSound(null);
            }
            if (shouldSound && shouldVibrate) {
                builder.setDefaults(Notification.DEFAULT_ALL);
            }
    
    
            notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, builder.build());
        }
    
        private String getChannelId() {
            if (shouldSound && shouldVibrate) {
                return "CHANNEL_ID_ALL";
            } else if (shouldSound && !shouldVibrate) {
                return "CHANNEL_ID_SOUND";
            } else if (!shouldSound && shouldVibrate) {
                return "CHANNEL_ID_VIBRATE";
            } else {
                return "CHANNEL_ID_NONE";
            }
        }
    
        private boolean isOreoOrAbove() {
            return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O;
        }
    }
    

    活动_main(xml)

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
    
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:id="@+id/sound_layout"
            android:orientation="horizontal"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="SOUND SWITCH"></TextView>
    
    
            <Switch
                android:layout_marginLeft="50dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:id="@+id/switch_sound">
    
            </Switch>
    
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/vibration_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/sound_layout">
    
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="VIBRATION SWITCH"></TextView>
    
    
            <Switch
                android:layout_marginLeft="50dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:id="@+id/switch_vibration">
    
            </Switch>
    
        </LinearLayout>
    
    
        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Send Notification"
            android:id="@+id/btn"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/vibration_layout"></Button>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    
        3
  •  0
  •   Jagadish Nallappa    3 年前

    创建一个频道(我在 Application.clss 创建频道)

      public void initChannels(Context context) {
        if (Build.VERSION.SDK_INT < 26) {
            return;
        }
        NotificationManager notificationManager =
                (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel channel = new NotificationChannel("default"/*CHANNEL ID*/,
                "CHANNEL_NAME",
                NotificationManager.IMPORTANCE_DEFAULT);
        channel.setDescription("Channel description");
        assert notificationManager != null;
        notificationManager.createNotificationChannel(channel);
    }
    

    使用这个频道 default 在创建 NotificationCompat

     .... notificationBuilder = new NotificationCompat.Builder(this,"default") ....
    
        4
  •  0
  •   صلي علي محمد - Atef Farouk    3 年前

    Android O附带了NotificationChannel,可以使用它

     int importance = NotificationManager.IMPORTANCE_HIGH;
                NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
                notificationChannel.enableLights(true);
                notificationChannel.setLightColor(Color.RED);
                notificationChannel.enableVibration(true);
                notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
                assert mNotificationManager != null;
                mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
                mNotificationManager.createNotificationChannel(notificationChannel);