Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 找不到在taskAdapter中使用报警管理器的方法_Java_Android_Alarmmanager_Baseadapter - Fatal编程技术网

Java 找不到在taskAdapter中使用报警管理器的方法

Java 找不到在taskAdapter中使用报警管理器的方法,java,android,alarmmanager,baseadapter,Java,Android,Alarmmanager,Baseadapter,我的问题很简单,我的TaskAdapter有点混乱,现在我面临onCreate方法的问题,因为我的TaskAdapter中没有它(显然)。 现在,如果你能给我一些关于如何实现我的alarmManager和链接ALARM_服务的想法,那么代码就可以工作了。 这是我的基本适配器: 'public class TaskAdapter extends BaseAdapter { //transfer context Context context; //transfer user

我的问题很简单,我的TaskAdapter有点混乱,现在我面临onCreate方法的问题,因为我的TaskAdapter中没有它(显然)。 现在,如果你能给我一些关于如何实现我的alarmManager和链接ALARM_服务的想法,那么代码就可以工作了。 这是我的基本适配器:

'public class TaskAdapter extends BaseAdapter {
    //transfer context
    Context context;
    //transfer user to use for shared preferences
    String userName;
    //create a list of tasks.....
    List<taskItem> myTasks;
    Calendar calendar = Calendar.getInstance();
    AlarmManager alarmManager;
    PendingIntent pendingIntent;

    //constructor, for creating the adapter we need from the user context and userName
    public TaskAdapter(Context context, String userName) {
        this.context = context;
        this.userName = userName;
        //go to user shared preferences and fill the list
        getData();
        notifyDataSetChanged();

    }
    //how many item to display
    @Override
    public int getCount() {
        //return the myTasks size....
        return myTasks.size();
    }

    //return a specific item by index
    @Override
    public Object getItem(int i) {
        return myTasks.get(i);
    }

    //return index number
    @Override
    public long getItemId(int i) {
        return 0;
    }

    //create our view
    @Override
    public View getView(final int index, final View view, ViewGroup viewGroup) {
        //inflate the view inside view object -> viewInflated
        final View viewInflated = LayoutInflater.from(context).inflate(R.layout.task_item, null, false);
        //set our inflated view behavior

        //set pointer for our inflated view

        //set pointer for task name....
        final TextView txtTaskName = (TextView) viewInflated.findViewById(R.id.taskName);
        //set pointer for taskInfo
        final TextView txtTaskInfo = (TextView) viewInflated.findViewById(R.id.taskInfo);
        //set pointer for task status....
        final Switch swTask = (Switch) viewInflated.findViewById(taskDone);

        //set task name, by the index of my myTasks collection
        txtTaskName.setText(myTasks.get(index).taskName);
        //set task info, by index of myTasks collection
        txtTaskInfo.setText(myTasks.get(index).taskInfo);
        //set task status , switch is getting true/false
        swTask.setChecked(myTasks.get(index).taskStatus);

        //show date and time dialog
        final ImageView dtPicker = (ImageView) viewInflated.findViewById(R.id.imgTime);
        dtPicker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final AlertDialog.Builder ad = new AlertDialog.Builder(context);
                final AlertDialog aDialog = ad.create();
                final LinearLayout adLayout = new LinearLayout(context);
                adLayout.setOrientation(LinearLayout.VERTICAL);
                TextView txtTime = new TextView(context);
                txtTime.setText("Choose time");
                adLayout.addView(txtTime);

                final TimePicker tp = new TimePicker(context);
                adLayout.addView(tp);
                final DatePicker dp = new DatePicker(context);
                tp.setVisibility(View.GONE);
                adLayout.addView(dp);


                final Button btnNext = new Button(context);
                btnNext.setText("Next>");
                adLayout.addView(btnNext);
                btnNext.setGravity(1);

                Button btnCancel = new Button(context);
                btnCancel.setText("Cancel");
                adLayout.addView(btnCancel);
                btnCancel.setGravity(1);


                btnCancel.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        aDialog.cancel();
                    }
                });
                btnNext.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        final int hour = tp.getHour();
                        final int min = tp.getMinute();

                        final String myHour = String.valueOf(hour);
                        final String myMin = String.valueOf(min);


                        calendar.set(Calendar.MONTH, dp.getMonth());
                        calendar.set(Calendar.YEAR, dp.getYear());
                        calendar.set(Calendar.DAY_OF_MONTH, dp.getDayOfMonth());
                        dp.setVisibility(View.GONE);
                        tp.setVisibility(View.VISIBLE);
                        btnNext.setText("Finish");
                        btnNext.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                calendar.set(Calendar.HOUR_OF_DAY, tp.getHour());
                                calendar.set(Calendar.MINUTE, tp.getMinute());
                                Intent my_intent = new Intent(context, AlarmReceiver.class);
                                pendingIntent = PendingIntent.getBroadcast(context, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);
                                alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
                                if(hour > 12){
                                    String myHour = String.valueOf(hour - 12);
                                }

                                if(min < 10)
                                {
                                    String myMin = "0"+String.valueOf(min);
                                }

                                Toast.makeText(context, "Set for- "+myHour+":"+myMin , Toast.LENGTH_LONG).show();
                                aDialog.cancel();
                            }
                        });
                    }
                });
                aDialog.setView(adLayout);
                aDialog.show();
            }
        });

        //create listener event, when switch is pressed
        swTask.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //we using utlShared to update task status
                //create instance of utlShared
                utlShared myShared = new utlShared(context);
                //calling method of task, and giving userName(shared preferences, taskName, taskStatus)
                myShared.task(userName, txtTaskName.getText().toString(), txtTaskInfo.getText().toString(), swTask.isChecked());
                //we sending a message to the user, and inform him/her about the change
                Toast.makeText(context, swTask.isChecked() ? "Task done" : "Task undone", Toast.LENGTH_SHORT).show();

            }
        });

        //return the view with the behavior.....
        return viewInflated;
    }

    private void getData() {
        //go to specific shared preferences by user name.....
        SharedPreferences taskPref = context.getSharedPreferences(userName, context.MODE_PRIVATE);
        //create instance of our myTasks list
        myTasks = new ArrayList<>();
        //get all tasks from shared preferances
        //the shared preferences is by key and value, therefor we will use Map collection
        //we know that the key is String, but we don't know what type of value we will get. <K,?>
        Map<String, ?> tasks = taskPref.getAll();
        // transfer the data from map collection to list collection , single item is like the defination of the tasks <String,?>
        //Entry -> record , enterSet -> set of records
        for (Map.Entry<String, ?> oneTask : tasks.entrySet()) {
            //insert task to list by Key and Value, we check if value is equal to 1, becuase 1=true 0=false
            String[] str = oneTask.getValue().toString().split(",");
            myTasks.add(new taskItem(str[0], str[1], str[2].equals("1")));
        }
    }

}'
这是RingtoneService:

public class RingtonePlayingService extends Service {
    MediaPlayer someMedia;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
        Log.i("Local Services", "Received start id "+ startId+": "+intent);
        someMedia = MediaPlayer.create(this, R.raw.skyrim);
        someMedia.start();

        return START_NOT_STICKY;
    }

    @Override
    public void onDestroy()
    {
        Toast.makeText(this, "On destroy called!", Toast.LENGTH_SHORT).show();
    }


}

干杯。

您的
alarmManager
字段似乎未初始化

将此行添加到
任务适配器
构造函数中:

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
此外,您可以直接呼叫您的服务,不需要中间的广播接收器:

Intent my_intent = new Intent(context, RingtonePlayingService.class);
pendingIntent = PendingIntent.getService(context, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);
更新

服务应该在清单中用
服务
标记声明。 见:



谢谢,我在alarmManager.set之前将它添加到了线路中,但它没有崩溃,所以我想我只是没有启动铃声。。。我会更新我的代码,如果你能告诉我为什么它没有发挥我会更伟大!首先,我添加了“我的答案”,这是一种直接从AlarmManager调用您的服务的方式;其次,您应该沿着流的每个步骤添加日志,直到到达
someMedia。启动
并查看日志停止的位置,这样您就可以确定流中断的确切位置
只是没有启动铃声
对社区帮助你来说不是很有帮助,因为它落在了AlarmReceiver类的Log.e上。有什么想法吗?它本应已传输到RingtonePlayingService,但没有启动Intent并在AlarmReceiver上删除日志.e(代码已更新)。尝试在没有任何警报的情况下启动RingtonePlayingService,只需手动添加温度。当主活动启动时启动该意图的代码。如果这不起作用,请确保在您的清单中将
RingtonePlayingService
定义为一项服务。老实说,我不知道为什么会发生这种情况,因为我已重建了项目(并将其更改为服务),它崩溃了,在再次重建之后,它开始工作得很好!马尔默非常感谢你的帮助!!!
Intent my_intent = new Intent(context, RingtonePlayingService.class);
pendingIntent = PendingIntent.getService(context, 0, my_intent, PendingIntent.FLAG_UPDATE_CURRENT);
<service android:name=".RingtonePlayingService" android:enabled="true"/>