android - AlarmManager 不播放选定的音调

标签 android alarmmanager android-pendingintent alarm

我有一个要在其中创建警报的 Android 应用程序。这是一个正常的闹钟,应该在指定的时间叫醒你。与任何警报一样,您还可以通过在创建警报时选择声音文件来指定它将使用哪种警报声音。
闹钟效果很好,它在正确的时间开始,但它总是只播放手机的默认铃声。不是我创建警报时选择的那个。
铃声选择:

ringtoneURI = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
数据库存储:
SQLiteDatabase database=getWritableDatabase();
ContentValues contentValues=new ContentValues();
...
contentValues.put(DBFields.ALARM_TONE, ringtoneURI.toString());
...
database.insert(DBFields.TABLE_OF_ALARMS,null,contentValues);
警报创建:
Intent intent = new Intent(AddAlarm.this, AlarmReceiver.class);
intent.putExtra("AlarmTone", cursor.getString(cursor.getColumnIndex(DBFields.ALARM_TONE)));
intent.putExtra("AlarmId", cursor.getInt(cursor.getColumnIndex(DBFields.ALARM_ID)));
intent.putExtra("AlarmTime", cursor.getString(cursor.getColumnIndex(DBFields.ALARM_TIME)));
pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),
        100,
        intent,
        FLAG_UPDATE_CURRENT);

alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
报警接收器:
NotificationCompat.Builder builder = new 
NotificationCompat.Builder(context, CHANNEL_ID);
Uri soundUri = Uri.parse(intent.getStringExtra("AlarmTone"));
builder.setSound(soundUri);
我已经使用调试器和正确的 AlarmName 逐步完成了代码。被选中并且是 Intent 的一部分.因此,我假设正确的名称被发送到 AlarmManager而且我不知道问题出在哪里。
如何让闹钟播放正确的音调?

最佳答案

我在 Geeks for Geeks site: 中找到了这个
使用它并调整您的数据库数据:

Calendar calendar = Calendar.getInstance();
  
            // calendar is called to get current time in hour and minute
            calendar.set(Calendar.HOUR_OF_DAY, YourHour);
            calendar.set(Calendar.MINUTE, YourMinute());
  
            // using intent class AlarmReceiver which inherits
            // BroadcastReceiver
            Intent intent = new Intent(this, AlarmReceiver.class);
  
            // we call broadcast using pendingIntent
            pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
  
            time = yourTimeToWait

            // Alarm rings continuously until toggle button is turned off
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time, 10000, pendingIntent);
             alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (time * 1000), pendingIntent);
然后创建一个名为 AlarmReciever.java 的类。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.Vibrator;
import android.widget.Toast;

import androidx.annotation.RequiresApi;

public class AlarmReceiver extends BroadcastReceiver {
    @RequiresApi(api = Build.VERSION_CODES.Q)
    @Override
    // implement onReceive() method
    public void onReceive(Context context, Intent intent) {

        Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.YOUR_TYPE);
        if (alarmUri == null) {
            alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.YOUR_TYPE);
        }
        
        // setting default ringtone
        Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);

        // play ringtone
        ringtone.play();
    }
}

简而言之,正在发生的是你的计时器CalenderalarmManager实例正在调用 AlarmReciever.java这是一个 BroadcastReciever .然后 AlamrReciever 类处理实际播放的计时器声音。

关于android - AlarmManager 不播放选定的音调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72419674/

相关文章:

Android - 避免 Intent 嗅探

android - BroadcastReceiver 没有被 AlarmManager 触发

android - 当手机进入休眠模式时关闭 AlarmManager

java - 立即显示 Activity 而不是显示通知

android - 启动和停止服务的 PendingIntent

java - 在java中作为android静态java模块打开文件

android - 无法让 Listview 从数据库刷新

android - 固定屏幕布局比例

java - sleep VS AlarmManager.set AND AlarmManager.setRepeating VS Handler

java - 无法通过firebase-cloud-messaging中的pendingIntent传递数据