Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
JediK
3 / 3 / 0
Регистрация: 06.04.2016
Сообщений: 22
#1

Ошибки в коде. Alarm Manager - Программирование Android

26.05.2016, 23:38. Просмотров 285. Ответов 10
Метки нет (Все метки)

Идея: в определенное время выводит нотификейшен с определенным текстом.
Не могу понять почему не работает.
Сделано на старой версии андроида.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.example.alarmmanager;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
 
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.ParseException;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
 
public class MainActivity extends Activity implements OnClickListener {
 
    Button btnOk1, btnOk2;
    EditText et1, et2;
    TextView tx;
    String s1, s2;
    private int mHour;
    private int mMinute;
    private TextView mTimeDisplay;
    private AlarmManager am;
    Date gd;
    Calendar cal;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        am = (AlarmManager) getSystemService(ALARM_SERVICE);
 
        final Calendar c = Calendar.getInstance();
        mHour = c.get(Calendar.HOUR_OF_DAY);
        mMinute = c.get(Calendar.MINUTE);
 
        btnOk1 = (Button) findViewById(R.id.button2);
        btnOk1.setOnClickListener(this);
 
        btnOk2 = (Button) findViewById(R.id.button3);
        btnOk2.setOnClickListener(this);
 
        et2 = (EditText) findViewById(R.id.editText1);
        et1 = (EditText) findViewById(R.id.editText2);
        tx = (TextView) findViewById(R.id.textView1);
        mTimeDisplay = (TextView) findViewById(R.id.textView2);
 
        updateDisplay();
    }
 
    @Override
    public void onClick(View v) {
 
        switch (v.getId()) {
 
        case R.id.button2:
 
            s1 = et2.getText().toString();
            s2 = et1.getText().toString();
            tx.setText("Напоминание:" + s1 + "\n" + "Время:" + s2);
 
            SimpleDateFormat format = new SimpleDateFormat("HH:mm");
            try {
                gd = format.parse(s2);
                cal = new GregorianCalendar();
                cal.setTime(gd);
                startNotify(cal);
 
            } catch (java.text.ParseException e) {
                et1.setText("Неверная дата");
            }
 
            break;
 
        case R.id.button3:
            s1 = null;
            s2 = null;
            et2.setText("");
            et1.setText("");
            tx.setText("");
 
            break;
 
        }
    }
 
    private void updateDisplay() {
        mTimeDisplay.setText(new StringBuilder().append(pad(mHour)).append(":")
                .append(pad(mMinute)));
    }
 
    private static String pad(int c) {
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);
 
    }
 
    private void startNotify(Calendar c) {
        am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, PlayerReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
                intent, PendingIntent.FLAG_CANCEL_CURRENT);
        intent.putExtra("STRING", s1);
        am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
    }
}
И приёмник
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.example.alarmmanager;
 
import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import android.app.PendingIntent;
import android.os.Bundle;
import android.os.PowerManager;
 
public class PlayerReceiver extends BroadcastReceiver {
 
    private static final String TYPE = "type";
    private static final int ID_ACTION_PLAY = 0;
    private static final int ID_ACTION_STOP = 1;
    private AlarmManager am;
    private NotificationManager nm;
 
    @Override
    public void onReceive(Context context, Intent intent) {
 
        nm = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        // в дровабл картинку сунуть
        String s1 = intent.getStringExtra("STRING");
 
        Notification notification = new Notification(R.drawable.ic_launcher,
                s1, System.currentTimeMillis());
        // запуск активити по жмяк уведомл.
        Intent intentTL = new Intent(context, MainActivity.class);
        notification.setLatestEventInfo(context, s1, "Do something!",
                PendingIntent.getActivity(context, 0, intentTL,
                        PendingIntent.FLAG_CANCEL_CURRENT));
        notification.flags = Notification.DEFAULT_LIGHTS
                | Notification.FLAG_AUTO_CANCEL;
        nm.notify(1, notification);
 
 
    }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2016, 23:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки в коде. Alarm Manager (Программирование Android):

Alarm Manager - Программирование Android
Здравствуйте . Подскажите , правильно ли я понимаю что "Alarm Manager "не рекомендуют использовать начиная API 19 (KITKAT)? Note: The...

Снова Alarm Manager: как запустить на API выше 19-го? - Программирование Android
Задача, нужно что бы задание выполнялось в определенное время с интервалом в один день, если правильно понял отсюда -...

Alarm manager не запускается чаще чем раз в час - Программирование Android
Есть сервис с Alarm manager'ом package com.ww4u.orderbook2; import android.app.AlarmManager; import...

Отменить Alarm - Программирование Android
Я сел делать будильник, и встретился c AlarmManager. Все вроде прекрасно, и сделал Receiver, и устанавливаю время звонка и все это...

Не удаляется Alarm - Программирование Android
Запускаю Alarm так intent = new Intent(context, MyAlarmReceiver.class); intent.setAction(action); intent.putExtra("WID",...

Периодический alarm не срабатывает - Программирование Android
Нужно установить alarm с некой периодичностью. Когда устанавливаю на 15 сек, то все работает отлично alarmManager.set(AlarmManager.RTC,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
27.05.2016, 04:59 #2
JediK, если s2 не "пустой", а до playerreceiver дело не доходит, возможно он не зарегистрирован в манифесте...
JediK
3 / 3 / 0
Регистрация: 06.04.2016
Сообщений: 22
27.05.2016, 13:53  [ТС] #3
Зарегистрирован. Я думаю ошибка тут:

Java
1
2
3
4
5
6
7
8
  private void startNotify(Calendar c) {
        am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, PlayerReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
                intent, PendingIntent.FLAG_CANCEL_CURRENT);
        intent.putExtra("STRING", s1);
        am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
    }
Добавлено через 4 минуты
Вот сам манифест, мб не туда сунул?
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.alarmmanager"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
   <receiver android:name=".PlayerReceiver"/>
</manifest>
Pablito
2471 / 1916 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 1
27.05.2016, 14:12 #4
сильно в код не вникал
там время правильно парсится из календаря?
я бы первой строкой в startNotify вывел в лог System.currentTimeMillis() и c.getTimeInMillis()
для начала
JediK
3 / 3 / 0
Регистрация: 06.04.2016
Сообщений: 22
28.05.2016, 10:54  [ТС] #5
Спасибо за наводку. Погуглю о том как правильно тестить и пойду всю ночь искать ошибку.
Если кто-то вдруг увидит ошибку, тема ещё акутальна
JediK
3 / 3 / 0
Регистрация: 06.04.2016
Сообщений: 22
29.05.2016, 12:17  [ТС] #6
Походу сначала выполняется startNotify, а только затем берется время...
Помогите, как вывести в лог календарь?
Kadagor
12 / 12 / 4
Регистрация: 17.09.2015
Сообщений: 47
29.05.2016, 13:50 #7
Цитата Сообщение от JediK Посмотреть сообщение
как вывести в лог календарь?
как-то так:
Java
1
Log.d("ALARM", "START AT " + c.get(Calendar.HOUR_OF_DAY)+":"+c.get(Calendar.MINUTE)+" "+c.get(Calendar.DAY_OF_MONTH)+"."+c.get(Calendar.MONTH)+"."+c.get(Calendar.YEAR)+" ("+c.getTimeInMillis()+"mS)");
Строка №74
Цитата Сообщение от JediK Посмотреть сообщение
gd = format.parse(s2);
но s2 может содержать все что угодно - любой текст, или быть пустым... Может лучше использовать для задания времени TimePicker.
Пример.
fraley
105 / 105 / 38
Регистрация: 24.05.2015
Сообщений: 317
29.05.2016, 14:50 #8
Вот пример кода с TimePicker.
Будильник будет срабатывать каждые пол-часа.
Естественно можно поменять на любой другой или вообще на одноразовый.
BroadcastReceiver не вижу смысла приводить, так как каждый реализует его под себя.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class MainActivity extends AppCompatActivity {
 
    private final String BROADCAST_FOR_RECEIVER="your_package.name_your_receiver";
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TimePicker timePicker=(TimePicker)findViewById(R.id.timePicker);
        timePicker.setIs24HourView(true);
        Button btnSetTime=(Button)findViewById(R.id.btnSetTime);
 
        btnSetTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
 
                int hour;
                int minute;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {//M this API 23
                    hour = timePicker.getHour();
                    minute = timePicker.getMinute();
                } else {
                    hour = timePicker.getCurrentHour();
                    minute = timePicker.getCurrentMinute();
                }
 
                setClock(convertToMillisecond(hour, minute));
                ((TextView) findViewById(R.id.textView)).setText(stringBuilder(hour,minute));
            }
        });
 
    }
 
    private StringBuilder stringBuilder(int hour, int minute){
        StringBuilder alarmClock=new StringBuilder("Alarm Clock: ");
        if(hour<10) {
            alarmClock.append("0");
            alarmClock.append(hour);
        }
        else
            alarmClock.append(hour);
        alarmClock.append(":");
        if(minute<10){
            alarmClock.append("0");
            alarmClock.append(minute);
        }
        else {
            alarmClock.append(minute);
        }
        return alarmClock;
    }
 
 
    private void setClock(long timeFromTimePickeer){
 
        Calendar calendar= Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
 
        int currentHours = calendar.get(Calendar.HOUR_OF_DAY);
        int currentMinutes = calendar.get(Calendar.MINUTE);
 
        long curentTimeInMilliseconds=convertToMillisecond(currentHours, currentMinutes);
        long difference=timeFromTimePickeer-curentTimeInMilliseconds;
 
        Intent myIntent = new Intent(BROADCAST_FOR_RECEIVER);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, myIntent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(getApplicationContext().ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+difference,
                AlarmManager.INTERVAL_HOUR ,pendingIntent);
        
    }
 
    private long convertToMillisecond(int hour, int minute){
        return ((hour*60+minute)*60)*1000;
    }
 
}
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
29.05.2016, 21:39 #9
fraley,

Не по теме:

у меня этот метод

Java
1
setInexactRepeating
на API 23, почему-то не работает?!

fraley
105 / 105 / 38
Регистрация: 24.05.2015
Сообщений: 317
29.05.2016, 22:59 #10
Цитата Сообщение от disx Посмотреть сообщение
на API 23, почему-то не работает?!
По теме:
У меня все работает.
П.С. На эмуляторе.
disx
22 / 22 / 0
Регистрация: 26.02.2014
Сообщений: 540
Записей в блоге: 1
30.05.2016, 14:00 #11
fraley, а в чем сИкрет, вкинул себе ваш метод setClock ничего не менял единственное время в переменные hour и minute попадает из SharedPreferenses (ну а туда тоже из TimePicker)?

и на эмуляторе Genymotion Galaxy S6 c API23, метод запускается видно из логов, но alarm просто не срабатывает в назначенное время ни через пол часа....(больше не ждал)

?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2016, 14:00
Привет! Вот еще темы с ответами:

Уведомления в заданное время без Alarm - Программирование Android
Пытаюсь вывести уведомление в заданное время не используя AlarmManager. Т.к. через AlarmManager, после перезагрузки, выводятся все...

Alarm broadcastIntent убивается через какое-то время - Программирование Android
Привет! Я разрабатываю приложение похожее на будильник. Я использую Android 4.2.2. Проблема заключается в том, что после некоторого...

Wallpaper manager - Программирование Android
Обои устанавливаются с индексом ivFeedCenter +1. Т.е. я нажимаю установить одно изображение, а устанавливается следующее в ленте. Как это...

Найти ошибки в коде и исправить эти ошибки (Наследование) - C++
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.05.2016, 14:00
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru