如何在安卓系统中将raw文件夹中的mp3文件作为通知声音提醒播放。

13

我有自己的音频文件放在资源文件夹内的原始文件夹中。我想将其设置为通知声音提醒。应该怎么做?

7个回答

14

当您在BroadcastReceiver中收到通知时,请使用以下代码,在该活动类中调用以下代码以播放声音文件。

mMediaPlayer = MediaPlayer.create(this, R.raw.sound1);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setLooping(true);
mMediaPlayer.start();

愉快的编码...


1
在活动中重复播放相同的声音,prepare()语句怎么处理? - Si8
@Nikhil 如果我的平台不支持QCMediaPlayer,我该怎么办?当我创建实例时,我会收到一个错误消息,显示“QCMediaPlayer媒体播放器不存在”。 - Daniel Kvist
你在前两行中创建了两次MediaPlayer。你可以删除第一个。 - yshahak
当使用静态方法MediaPlayer.create()时,它会调用其中的create方法。在此之后,您不应该调用prepare()方法。 - yshahak
1
如果应用程序从后台中移除,则此方法无法正常工作。 - Pawan
需要添加 noBuilder.setPriority(Notification.PRIORITY_LOW); 和 NotificationManager.IMPORTANCE_LOW。 - Ashwin H

13

通常使用MediaPlayer来实现这一点,但这并不是一个理想的解决方案,因为它与通知有些独立,因此对于静音、阻止模式和其他各种事情会表现出意外的行为。为了保持一致性和兼容性,应该使用通知本身的音频机制来播放声音。这可以通过设置适当的URI来实现,例如:

NotificationCompat.Builder builder = new NotificationCompat.Builder(
    this).setSmallIcon(R.drawable.ic_myicon)
    .setContentTitle(title).setAutoCancel(true);
Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
                    + "://" + getPackageName() + "/raw/mymp3");
builder.setSound(alarmSound);
...
builder.setContentIntent(pendingIntent);
NotificationManager manager = (NotificationManager)
    getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(1, builder.build());

关键部分是:

Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
                    + "://" + getPackageName() + "/raw/mymp3");

这个 mp3 文件被存储在您的 /res/raw 文件夹中。


3

尝试这段代码

notification.sound =Uri.parse("android.resource://" + getPackageName() + "Name OF audio store in raw folder");

2
参考代码。
 Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
 mMediaPlayer = new MediaPlayer();
 mMediaPlayer.setDataSource(this, alert);
 final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
 if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
            player.setAudioStreamType(AudioManager.STREAM_ALARM);
            player.setLooping(true);
            player.prepare();
            player.start();
  }

1

FileUriExposedException:在选择存储的通知声音时,出现“file:///storage/emulated/0/MIUI/.ringtone/Kash%20Kahin.mp3超出应用程序通过Notification.sound暴露”的异常。 - Sagar
从Android N开始,它们限制了强制使用file:// uri,因为他们的理由对我来说是有道理的。在这里阅读https://developer.android.com/reference/android/os/FileUriExposedException。建议的方法似乎是使用content:// Uri。这里有示例代码https://medium.com/@ali.muzaffar/what-is-android-os-fileuriexposedexception-and-what-you-can-do-about-it-70b9eb17c6d0,对您有帮助。请尝试一下并在此处留下是否有效的说明。 - Shailendra Singh Rajawat
我参考了上述文档,但无法使用content://播放声音,包括系统声音存储(自定义路径),也尝试了FileProvider。仍在寻找解决方法。 - Sagar

0

当您设置通知消息中的声音时,应从/res/raw文件夹解析原始文件的Uri,因此我们可以这样做:

.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/raw/notice"))

0
你可以从原始文件夹播放声音,以下是Java文件,只需复制粘贴此代码实现并仅使用该类的函数即可播放具有响亮音乐和震动效果的声音......
如果您还想振动,则必须添加权限。
    <uses-permission android:name="android.permission.VIBRATE"/>

创建BeepManager.java文件并复制粘贴以下代码。
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.AssetFileDescriptor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.util.Log;

final class BeepManager {

 private static final String TAG = BeepManager.class.getSimpleName();
 private static final float BEEP_VOLUME = 0.10f;
 private static final long VIBRATE_DURATION = 200L;
 private final Activity activity;
 private MediaPlayer mediaPlayer;
 private boolean playBeep;
 private boolean vibrate;

BeepManager(Activity activity) {
 this.activity = activity;
 this.mediaPlayer = null;
 updatePrefs();
}

void updatePrefs() {
 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
 playBeep = shouldBeep(prefs, activity);
 vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);
 if (playBeep && mediaPlayer == null) {
  // The volume on STREAM_SYSTEM is not adjustable, and users found it too loud,
  // so we now play on the music stream.
   activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
   mediaPlayer = buildMediaPlayer(activity);
 }
}

void playBeepSoundAndVibrate() {
 if (playBeep && mediaPlayer != null) {
     mediaPlayer.start();
  }
  if (vibrate) {
   Vibrator vibrator = (Vibrator) activity.getSystemService(Context.VIBRATOR_SERVICE);
   vibrator.vibrate(VIBRATE_DURATION);
  }
}

 private static boolean shouldBeep(SharedPreferences prefs, Context activity) {
   boolean shouldPlayBeep = prefs.getBoolean(PreferencesActivity.KEY_PLAY_BEEP, true);
  if (shouldPlayBeep) {
    // See if sound settings overrides this
    AudioManager audioService = (AudioManager) activity.getSystemService(Context.AUDIO_SERVICE);
    if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {
       shouldPlayBeep = false;
    }
  }
  return shouldPlayBeep;
}

private static MediaPlayer buildMediaPlayer(Context activity) {
  MediaPlayer mediaPlayer = new MediaPlayer();
  mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  // When the beep has finished playing, rewind to queue up another one.
  mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
   @Override
   public void onCompletion(MediaPlayer player) {
     player.seekTo(0);
   }
 });

 AssetFileDescriptor file = activity.getResources().openRawResourceFd(R.raw.beep);
 try {
  mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength());
  file.close();
  mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);
  mediaPlayer.prepare();
 } catch (IOException ioe) {
  Log.w(TAG, ioe);
  mediaPlayer = null;
 }
 return mediaPlayer;
}
}

现在你只需要使用以下函数,就可以播放声音了……
 BeepManager beepManager = new BeepManager(this);
 beepManager.updatePrefs();



 beepManager.playBeepSoundAndVibrate(); 

1
只有上帝知道它如何回答这个问题。 - yshahak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接