Wecker App als Abschlussprojekt

  • 32 Antworten
  • Letztes Antwortdatum
N

nikobellic

Neues Mitglied
0
Guten Tag,
mein Name ist Niko und ich mache momentan mein Abschlussprojekt.
Es soll eine App werden die, anhand von sensoren Bewegung regestriert und dann entsprechend reagiert.
Der Benutzer soll eine Weckphase(länge) einstellen und einen Weckzeitpunkt(der späste Zeitpunkt wo er geweckt wird wenn er sich innerhalb der Weckphase nicht 3mal bewegt).
Die Initialisierung für die XYZ Achsen habe ich bereits um Bewegung zu Regestrieren.(Handy muss im Bett liegen(unterm Kissen)).
Einen TimePicker womit der Benutzer die Weckzeit einstellt habe ich auch.
Lediglich fehlt mir die eigentliche Weckfunktion,ich würde gerne den AlarmManager verwenden.
Ich bin ein Anfänger in der Android programmierung und brauche dringend eure Hilfe (Abgabe ist bald) ich hoffe ihr könnt mir auf die Sprünge helfen.
Das beste Wäre wenn mit jemand über Skype helfen könnte ich denke für einen erfahrenen ist es nicht sehr schwer so etwas zu Programmieren.
Mein Username ist : nikobellic760
(Bitte nicht Spammen)

Was ich bisher über den AlarmManager herrausgefunden habe ist, dass ich ein PendingIntent brauche und Daten über ein Bundle übergebe.
Das ist mir noch ziemlich fremd muss ich ehrlich zugeben.

Mit freundlichen Grüßen Niko.
 
Fragst du hier wirklich ob andere dein Abschluss Projekt (wofür auch immer) schreiben? Oo

Gesendet von meinem GT-I9300 mit der Android-Hilfe.de App
 
Nein ich will Hilfe bezüglich des AlarmManagers ich versteh die Funktionsweise nicht.
 
so ich habe jetzt eien timepicker und alarmmanager initialisiert und kann den alarm setzten.
Woher weis ich das mein Alarm ausgelöst worden ist ?
Kann ich die Abfrage nach eingestellter Zeit bzw die momentane Zeit nicht vereinfachen ?

Code:
public void btn1Click (View view){
        
        Intent i = new Intent("in.example.aktuell.demoactivity");
        //Diese Absicht ruft die Aktivität DemoActivity auf, die wiederum öffnet das Fenster AlertDialog
        
        PendingIntent operator = PendingIntent.getActivity(getBaseContext(), 0, i, Intent.FLAG_ACTIVITY_NEW_TASK);
       //PendingIntent erstellen ; getBaseContext() holt den Inhalt der der Konstdruktor ihm gegeben hat oder die Methode setBaseContext()
        
        AlarmManager alarmManager = (AlarmManager) getBaseContext().getSystemService(ALARM_SERVICE);
        //Alarmanager erstellen ; Rückgabewert vom System Service ALARM_SERVICE
        //getBaseContext() holt den Inhalt der der Konstdruktor ihm gegeben hat oder die Methode setBaseContext()
        
        TimePicker Time = (TimePicker) findViewById(R.id.timePicker1);
        //TimePicker Initialisieren
        
        int minute,stunde;
        stunde = Time.getCurrentHour();                
        minute = Time.getCurrentMinute();
        //Momentane Stunde und Minute in Variablen speichern
        
        
        long Zeit = (long)stunde&minute;
        alarmManager.set(AlarmManager.RTC_WAKEUP  , Zeit , operator);
        
        Toast.makeText(getBaseContext(), "Alarm wurde gesetzt",Toast.LENGTH_SHORT).show();
        
    }
Ich nehme an ich muss anders nach der Zeit abfragen also das
" long Zeit = (long)stunde&minute;" muss anders aussehen
brauch ich dazu einen Kalender ?
 
nikobellic schrieb:
Ich nehme an ich muss anders nach der Zeit abfragen also das
" long Zeit = (long)stunde&minute;" muss anders aussehen
brauch ich dazu einen Kalender ?

Die Idee mit dem Kalender ist schon mal gut. Wenn ich das richtig verstehe möchtest du ja nicht den Alarm IN x Stunden und x Minuten losgehen lassen sondern an einer bestimmten Uhrzeit (am nächsten Tag?). Also brauchst du diese bestimmte Uhrzeit in Millisekunden die du der Set Methode übergeben kannst.

Spontan würde ich das in etwa so testen...

Calendar Variable erstellen mit jetziger Zeit:
Calendar alarmZeit = Calendar.getInstance();

Einen Tag addieren:
alarmZeit.add(DAY, 1);

Stunde und Minute setzen
alarmZeit.set(HOUR, stunde);
alarmZeit.set(MINUTE, minute);

nun kannst du der set Methode des Alarmmanagers per getTimeInMillis() die Zeit übergeben.

Das ganze ist nicht sehr elegant sollte aber grob funktionieren.
 
Die Lösung funktioniert und das würde ich jetzt so lassen weil ich noch 2wochen bis zur abgabe habe.
Code:
TimePicker Time = (TimePicker) findViewById(R.id.timePicker1);
        //TimePicker Initialisieren
        
        DatePicker Datum = (DatePicker) findViewById(R.id.DP);
        int year = Datum.getYear();
        int month = Datum.getMonth();
        int day = Datum.getDayOfMonth();
        int stunde = Time.getCurrentHour();                
        int minute = Time.getCurrentMinute();
        //Im TimePicker eingestellte Stunde und Minute in Variablen speichern
        //Bzw. Jahr, Monat und Tag auch
    
        GregorianCalendar calendar = new GregorianCalendar(year,month,day, stunde, minute);
        long Zeit = calendar.getTimeInMillis();
        alarmManager.set(AlarmManager.RTC_WAKEUP, Zeit, operator);
Nun fehlt mir etwas womit ich weis das der Alarm durch den AlarmManager ausgelöst worden ist.

Ich habe dies hier gefunden :

Context | Android Developers

public static final String ALARM_SERVICE

Added in API level 1
Use with getSystemService(String) to retrieve a AlarmManager for receiving intents at a time of your choosing.

See Also



Constant Value: "alarm"
Wie ist das zu verstehen gibt es eine Methode die aufgerufen wird sobald der ALARM_SERVICE einen bestimmten Status hat oder muss ich das selber tun?
Wenn ja dann wie ?

Der ursprüngliche Beitrag von 15:17 Uhr wurde um 15:45 Uhr ergänzt:

Wie sieht es damit aus kann ich das auch so lösen ?
Android: Use AlarmManager instead of a Service with a TimerTask
 
Ich dachte das machst du schon.
Du musst nur noch den Reciever für dein Intent bauen.
Aber ja das ist doch genau das was du haben möchtest.

Sobald dein Alarm auslöst wird das intent, dass du dort reingeschrieben hast ausgeführt. in deinem Fall dein "operator"
 
Was du jetzt noch brauchst:
Einen Receiver, der vom System zur Weckzeit benachrichtigt wird. (Auch im Manifest eintragen!)
Das ganze ggf. Als service aufstellen (der Weckton in einer Activity wäre denke ich suboptimal) der dann hält klingeln anfängt, wenn er gestartet wird.
Den Service musst du aber dem Alarmmanger natürlich mitgeben (Damit das system weiß was genau es zur weckzeit aufrufen soll).

Also wahrhaftig kein stress für 2 Wochen - da empfehle ich dir, designlich das ganze noch etwas auf zu hübschen, schließlich bewertet das Auge ja mit ;)

Greets,
Max


Edit: Und mach dir Gedanken darüber, was passiert, wenn das gerät neu gestartet wird ;)
 
Zuletzt bearbeitet:
Ich würde gerne weitermachen aber windows hat meine Entwicklungsoberfläche zerschossen -.-
Ich hoffe mal ich kreigs heute noch irgendwas hin.
 
Also ich habe jetzt die Entwicklungsumgebung wieder eingerichtet ich habe rausgefunden das meine demoactivity.java nicht aufgerufen wird was mein Intend eigentlich machen sollte woran kann das liegen ?

Der ursprüngliche Beitrag von 20:19 Uhr wurde um 21:51 Uhr ergänzt:
 
An deiner AndroidManifest. Alles andere waere reine spekulation! :banghead:

Gesendet von meinem Nexus 10 mit der Android-Hilfe.de App
 
Code:
<service   android:name="demoactivity"      > </service>
ist es das was ich in die manifest eintragen muss ?

Ich bin ein Anfänger in der Android programmierung :S
 
Startest du ein Service oder eine Activity?

Gesendet von meinem Nexus 10 mit der Android-Hilfe.de App
 
Hammer!
 
Das weis ich jetzt auch nicht wirklich.
Bin etwas verwirrt...mein intent startet doch meine demoactivity wenn ich das richtig sehe oder das sollte es tun ?
Für was bräuchte ich ein reciever wenn überhaupt ?
Wie soll der eigentliche ablauf eigentlich sein bzw. wie muss er sein um richtig zu funktionieren ?
 
Ich weiß ja nicht, wie du das machst, aber ich hätte als Grobbestandteile eine Hauptactivity, die setzt den Alarm, das System benachrichtigt den Receiver, der startet dann stupide einfach immer eine WeckActivity, welche (einfach in oncreate()) klingelt, Uhrzeit anzeigt mit Stopp und 5 Min Schlummern. Bei schlummern halt zum Beenden der Activity zusätzlich den AlarmManager auf in 5 Minuten stellen.

Das ist der Ablauf. ;)

Für den Receiver:
http://android-er.blogspot.de/2011/05/using-alarmmanager-to-start-scheduled.html?m=1
 
Okay also die reine Weckfunktion funktioniert soweit nur wenn ich dann den Wecker sozusagen stoppen möchte stürzt mein App ab.Kann es daran liegen, dass ich nicht den onClicklistener verwende sondern einfach "onClick" ?
LogCat verrät mir folgendes :

06-02 19:02:54.548: E/AndroidRuntime(386): FATAL EXCEPTION: main
06-02 19:02:54.548: E/AndroidRuntime(386): java.lang.IllegalStateException: Could not find a method Buttonende(View) in the activity class com.example.aktuell.Aufruf for onClick handler on view class android.widget.Button with id 'stop'
06-02 19:02:54.548: E/AndroidRuntime(386): at android.view.View$1.onClick(View.java:2131)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.view.View.performClick(View.java:2485)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.view.View$PerformClick.run(View.java:9080)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.os.Handler.handleCallback(Handler.java:587)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.os.Handler.dispatchMessage(Handler.java:92)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.os.Looper.loop(Looper.java:123)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.app.ActivityThread.main(ActivityThread.java:3683)
06-02 19:02:54.548: E/AndroidRuntime(386): at java.lang.reflect.Method.invokeNative(Native Method)
06-02 19:02:54.548: E/AndroidRuntime(386): at java.lang.reflect.Method.invoke(Method.java:507)
06-02 19:02:54.548: E/AndroidRuntime(386): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-02 19:02:54.548: E/AndroidRuntime(386): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-02 19:02:54.548: E/AndroidRuntime(386): at dalvik.system.NativeStart.main(Native Method)
06-02 19:02:54.548: E/AndroidRuntime(386): Caused by: java.lang.NoSuchMethodException: Buttonende
06-02 19:02:54.548: E/AndroidRuntime(386): at java.lang.ClassCache.findMethodByName(ClassCache.java:247)
06-02 19:02:54.548: E/AndroidRuntime(386): at java.lang.Class.getMethod(Class.java:962)
06-02 19:02:54.548: E/AndroidRuntime(386): at android.view.View$1.onClick(View.java:2124)
06-02 19:02:54.548: E/AndroidRuntime(386): ... 11 more
 
ja brauchst die passende methode dazu in deiner activity

public void Buttonende(view v)
 
die habe ich doch und in meiner 2 ten xml ist das auch eingetragen :
Code:
public void ButtonEnde (View view){

        finish();        
    }

Code:
    <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="64dp"
        android:onClick="Buttonende"
        android:text="Stop" />
 

Ähnliche Themen

G
Antworten
1
Aufrufe
324
Gerdchen07
G
G
Antworten
13
Aufrufe
530
Gerdchen07
G
L
Antworten
1
Aufrufe
354
swa00
swa00
migi01
Antworten
26
Aufrufe
1.802
migi01
migi01
D
Antworten
5
Aufrufe
519
swa00
swa00
Zurück
Oben Unten