如何在Android中取消报警时停止媒体播放器声音

如何在Android中取消报警时停止媒体播放器声音,android,android-recyclerview,broadcastreceiver,adapter,alarmmanager,Android,Android Recyclerview,Broadcastreceiver,Adapter,Alarmmanager,我正在开发报警应用程序,我使用arraylist存储报警,使用recyclerview在屏幕上绑定报警,我使用开关按钮打开/关闭报警。打开和打开触发报警是播放声音和发送通知,我面临的唯一问题是取消报警。如何在取消报警时停止媒体播放器的声音。以及如何使用通知操作按钮取消警报 我使用alarmmanager设置报警,并使用广播接收器接收触发事件 下面是代码 报警片段: package com.example.myapplication; import android.annotation.Supp

我正在开发报警应用程序,我使用arraylist存储报警,使用recyclerview在屏幕上绑定报警,我使用开关按钮打开/关闭报警。打开和打开触发报警是播放声音和发送通知,我面临的唯一问题是取消报警。如何在取消报警时停止媒体播放器的声音。以及如何使用通知操作按钮取消警报

我使用alarmmanager设置报警,并使用广播接收器接收触发事件

下面是代码

报警片段:

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);
        }
    }