如何在Android中取消报警时停止媒体播放器声音
我正在开发报警应用程序,我使用arraylist存储报警,使用recyclerview在屏幕上绑定报警,我使用开关按钮打开/关闭报警。打开和打开触发报警是播放声音和发送通知,我面临的唯一问题是取消报警。如何在取消报警时停止媒体播放器的声音。以及如何使用通知操作按钮取消警报 我使用alarmmanager设置报警,并使用广播接收器接收触发事件 下面是代码 报警片段:如何在Android中取消报警时停止媒体播放器声音,android,android-recyclerview,broadcastreceiver,adapter,alarmmanager,Android,Android Recyclerview,Broadcastreceiver,Adapter,Alarmmanager,我正在开发报警应用程序,我使用arraylist存储报警,使用recyclerview在屏幕上绑定报警,我使用开关按钮打开/关闭报警。打开和打开触发报警是播放声音和发送通知,我面临的唯一问题是取消报警。如何在取消报警时停止媒体播放器的声音。以及如何使用通知操作按钮取消警报 我使用alarmmanager设置报警,并使用广播接收器接收触发事件 下面是代码 报警片段: package com.example.myapplication; import android.annotation.Supp
package com.example.myapplication;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextClock;
import android.widget.TextView;
import android.widget.TimePicker;
import com.google.android.material.bottomsheet.BottomSheetBehavior;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Timer;
/**
* A simple {@link Fragment} subclass.
*/
public class AlarmFragment extends Fragment {
private FloatingActionButton addAlarmBtn;
private BottomSheetBehavior bottomScrollViewBehavior;
private View v;
private CoordinatorLayout coordinatorLayout;
private TimePicker timePicker;
private Button setAlarm;
private RecyclerView show_alarm;
private ArrayList<String> alarms ;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
private TextClock textClock;
public String current_Time;
public AlarmFragment() {
// Required empty public constructor
}
@SuppressLint("RestrictedApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_alarm, container, false);
addAlarmBtn=(FloatingActionButton)view.findViewById(R.id.add_alarm_alarm_fragment);
coordinatorLayout=(CoordinatorLayout)view.findViewById(R.id.fragment_alarm_coordinatorLayout);
timePicker = (TimePicker)view.findViewById(R.id.timepicker_alarm_fragment);
timePicker.setIs24HourView(false);
setAlarm =(Button)view.findViewById(R.id.setAlarm_alam_fragment);
show_alarm=(RecyclerView)view.findViewById(R.id.showalarm_listview_alarm_fragment);
v=(View) view.findViewById(R.id.alarmSet_bbottomsheet);
bottomScrollViewBehavior =BottomSheetBehavior.from(v);
textClock=(TextClock)view.findViewById(R.id.text_clock_alarm_fragment);
alarms =new ArrayList<String>();
layoutManager = new LinearLayoutManager(getContext());
adapter = new AlarmAdapter(alarms,getActivity());
show_alarm.setLayoutManager(layoutManager);
new ItemTouchHelper(itemTouchHelper).attachToRecyclerView(show_alarm);
show_alarm.setAdapter(adapter)
setAlarm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int hour ;
int minutes;
if(Build.VERSION.SDK_INT >=23) {
hour = timePicker.getHour();
minutes = timePicker.getMinute();
}
else {
hour = timePicker.getCurrentHour();
minutes = timePicker.getCurrentMinute();
}
String date =String.format("%02d:%02d", hour, minutes);
alarms.add(date);
adapter.notifyDataSetChanged();
Log.d("Time",date);
bottomScrollViewBehavior.setState(bottomScrollViewBehavior.STATE_COLLAPSED);
}
});
addAlarmBtn.setOnClickListener(new View.OnClickListener() {
@SuppressLint("RestrictedApi")
@Override
public void onClick(View v) {
bottomScrollViewBehavior.setState(bottomScrollViewBehavior.STATE_EXPANDED);
}
});
bottomScrollViewBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
@Override
public void onStateChanged(@NonNull View view, int i) {
if(i == BottomSheetBehavior.STATE_COLLAPSED)
{
addAlarmBtn.setVisibility(View.VISIBLE);
}
else
{
addAlarmBtn.setVisibility(View.INVISIBLE);
}
}
@Override
public void onSlide(@NonNull View view, float v) {
}
});
return view;
}
ItemTouchHelper.SimpleCallback itemTouchHelper= new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
alarms.remove(viewHolder.getAdapterPosition());
adapter.notifyDataSetChanged();
}
};
}
NotificationHelper类
package com.example.myapplication;
import android.annotation.TargetApi;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.os.Build;
import androidx.core.app.NotificationCompat;
public class NotificationHelper extends ContextWrapper {
public static final String channelID = "channelID";
public static final String channelName = "Channel Name";
private NotificationManager mManager;
public NotificationHelper(Context base) {
super(base);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannel();
}
}
@TargetApi(Build.VERSION_CODES.O)
private void createChannel() {
NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
getManager().createNotificationChannel(channel);
}
public NotificationManager getManager() {
if (mManager == null) {
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
return mManager;
}
public NotificationCompat.Builder getChannelNotification() {
return new NotificationCompat.Builder(getApplicationContext(), channelID)
.setContentTitle("Alarm!")
.setContentText("Your AlarmManager is working.")
.setSmallIcon(R.drawable.ic_alarm_black_24dp);
}
}
如何使用通知操作按钮取消报警 您应该使用报警管理器的
cancel
功能通过指定报警id来取消报警。为要取消的特定报警设置特定的pendingent
时使用的id。请参阅代码示例
您可以单击“操作”按钮执行此操作。但是媒体播放器声音怎么办?我应该如何停止。取消报警方法正在工作,我在适配器类中指定了此方法,但取消后声音不会停止。您可以尝试通过另一个挂起的内容再次启动braodcast接收器,但这一次,在意图中添加一些额外的内容,以指定此意图是取消警报,然后在接收器的onReceive()中捕获并检查警报,然后尝试在媒体播放器上调用stop(如果正在运行)。然后,您应该将媒体播放器代码放入服务中,然后通过启动和停止服务来控制媒体播放器的启动和停止。您可以从已经实现的广播接收器轻松启动和停止服务。
package com.example.myapplication;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.Ringtone;
import android.os.Build;
import android.os.CountDownTimer;
import android.provider.Settings;
import android.widget.Toast;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import java.util.Timer;
import java.util.TimerTask;
public class MyAlarmBoardcastClass extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MediaPlayer mb =MediaPlayer.create(context,Settings.System.DEFAULT_RINGTONE_URI);
Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show();
mb.start();
NotificationHelper notificationHelper = new NotificationHelper(context);
NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
notificationHelper.getManager().notify(1, nb.build());
}
}
package com.example.myapplication;
import android.annotation.TargetApi;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.content.ContextWrapper;
import android.os.Build;
import androidx.core.app.NotificationCompat;
public class NotificationHelper extends ContextWrapper {
public static final String channelID = "channelID";
public static final String channelName = "Channel Name";
private NotificationManager mManager;
public NotificationHelper(Context base) {
super(base);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannel();
}
}
@TargetApi(Build.VERSION_CODES.O)
private void createChannel() {
NotificationChannel channel = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
getManager().createNotificationChannel(channel);
}
public NotificationManager getManager() {
if (mManager == null) {
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
return mManager;
}
public NotificationCompat.Builder getChannelNotification() {
return new NotificationCompat.Builder(getApplicationContext(), channelID)
.setContentTitle("Alarm!")
.setContentText("Your AlarmManager is working.")
.setSmallIcon(R.drawable.ic_alarm_black_24dp);
}
}