Android Logging auf dem Handy

KarlNapp

Mitglied
Guten Abend,

ich habe eine App programmiert, die den Glockenschlag einer Kirchturmuhr nachbilden soll. Dazu benutze ich den AlarmManager und setze nach Programmstart bzw. jedem Läuten die nächste Alarmzeit. Meistens funktioniert das auch gut und pünktlich, ab und zu läutet es aber zu spät, tlw. mehrere Minuten, obwohl ich
Java:
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, zeit.timeInMillis, pendingIntent)
benutze.
Um dem Problem auf die Spur zu kommen, möchte ich ein Logging auf dem Handy durchführen, weil die "Verspätung" nie vorkommt, wenn ich in Android Studio logge, egal ob über USB oder WIFI.
Ich habe mir die Logdatei auf dem Handy per "Fehlerbericht erstellen" angeschaut, aber dort sind meine Statements nicht enthalten. Hat jemand eine Idee, wie ich das bewerkstelligen könnte? Ggf. auch mit einer eigenen Logdatei auf der Speicherkarte.

Vielen Dank und Grüße
KarlNapp

PS: mein Code

MainAktivity:

Java:
package com.example.altekirche

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.core.app.ActivityCompat
import java.io.IOException
import java.io.OutputStreamWriter
import java.util.Calendar

class MainActivity : ComponentActivity() {

    companion object {
        var mainActivity: MainActivity? = null
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mainActivity = this

        setContentView(R.layout.activity_main)

        zeitStellen()
    }

    fun zeitStellen() {
        val intent = Intent(this, AlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            this, 0, intent, PendingIntent.FLAG_IMMUTABLE)
        val alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
        val zeit = Calendar.getInstance()
        var minute = zeit.get(Calendar.MINUTE)
        var stunde = zeit.get(Calendar.HOUR_OF_DAY)
        if (minute < 15) minute = 15
        else if (minute < 30) minute = 30
        else if (minute < 45) minute = 45
        else {
            minute = 0
            stunde++
            if (stunde == 24) stunde = 0
        }
        zeit.set(
            zeit.get(Calendar.YEAR),
            zeit.get(Calendar.MONTH),
            zeit.get(Calendar.DAY_OF_MONTH),
            stunde,
            minute,
            0
        )
        alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, zeit.timeInMillis, pendingIntent)
        Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show()
    }

    override fun onStop() {
        super.onStop()
        if (AlarmReceiver().mMediaPlayer != null) {
            AlarmReceiver().mMediaPlayer!!.release()
            AlarmReceiver().mMediaPlayer = null
        }
    }
}

AlarmReceiver:

Java:
package com.example.altekirche

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.MediaPlayer
import android.os.AsyncTask
import android.util.Log
import android.widget.Toast
import com.example.altekirche.MainActivity.Companion.mainActivity
//import com.example.turmuhr.R
import java.util.Calendar

class AlarmReceiver : BroadcastReceiver() {
    var mMediaPlayer: MediaPlayer? = null

    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "Alarm worked.", Toast.LENGTH_LONG).show()
        println("Alarm kommt")
        Log.d("AlarmReceiver", "Alarm kommt")

        AsyncTask.execute {
            var minute = 0
            var stunde = 0
            var minuteGebimmelt = false
            var anzM = 0
            var anzS = 0
            val zeit = Calendar.getInstance()
            minute = zeit.get(Calendar.MINUTE)
            stunde = zeit.get(Calendar.HOUR_OF_DAY)
            when (minute) {
                15 -> anzM = 1
                30 -> anzM = 2
                45 -> anzM = 3
                0 -> anzM = 4
            }
            bimmelGlockeHell(anzM - 1)
            if (minute == 0) minuteGebimmelt = true

            if (minuteGebimmelt) {
                when (stunde) {
                    1 -> anzS = 1
                    2 -> anzS = 2
                    3 -> anzS = 3
                    4 -> anzS = 4
                    5 -> anzS = 5
                    6 -> anzS = 6
                    7 -> anzS = 7
                    8 -> anzS = 8
                    9 -> anzS = 9
                    10 -> anzS = 10
                    11 -> anzS = 11
                    12 -> anzS = 12
                    13 -> anzS = 1
                    14 -> anzS = 2
                    15 -> anzS = 3
                    16 -> anzS = 4
                    17 -> anzS = 5
                    18 -> anzS = 6
                    19 -> anzS = 7
                    20 -> anzS = 8
                    21 -> anzS = 9
                    22 -> anzS = 10
                    23 -> anzS = 11
                    0 -> anzS = 12
                }
                bimmelGlockeDunkel(anzS - 1)
            }
        }
        MainActivity.mainActivity?.zeitStellen()
    }

    private fun bimmelGlockeHell(anzahl: Int) {
        println("Bimmelbefehl")
        Log.d("AlarmReceiver", "Bimmelbefehl")
        if (anzahl > 0) {
            for (i in 1..anzahl) {
                playSoundHell()
                while (mMediaPlayer!!.isPlaying) {
                    // warten
                }
            }
            mMediaPlayer!!.release()
            mMediaPlayer = null
        }
        playSoundHellEnde()
        while (mMediaPlayer!!.isPlaying) {
            // warten
        }
        mMediaPlayer!!.release()
        mMediaPlayer = null
    }
    private fun bimmelGlockeDunkel(anzahl: Int) {
        if (anzahl > 0) {
            for (i in 1..anzahl) {
                playSoundDunkel()
                while (mMediaPlayer!!.isPlaying) {
                    // warten
                }
            }
            mMediaPlayer!!.release()
            mMediaPlayer = null
        }
        playSoundDunkelEnde()
        while (mMediaPlayer!!.isPlaying) {
            // warten
        }
        mMediaPlayer!!.release()
        mMediaPlayer = null
    }

    private fun playSoundHell() {
        println("jetzt wird gebimmelt hell")
        if (mMediaPlayer == null) {
            mMediaPlayer = MediaPlayer.create(mainActivity, R.raw.alte_kirche_einzelschlag_hell)
            mMediaPlayer!!.start()
        } else mMediaPlayer!!.start()
    }
    private fun playSoundHellEnde() {
        println("jetzt wird gebimmelt hell ende")
        if (mMediaPlayer == null) {
            mMediaPlayer = MediaPlayer.create(mainActivity, R.raw.alte_kirche_einzelschlag_hell_ende)
            mMediaPlayer!!.start()
        } else mMediaPlayer!!.start()
    }
    private fun playSoundDunkel() {
        if (mMediaPlayer == null) {
            mMediaPlayer = MediaPlayer.create(mainActivity, R.raw.alte_kirche_einzelschlag_dunkel)
            mMediaPlayer!!.start()
        } else mMediaPlayer!!.start()
    }
    private fun playSoundDunkelEnde() {
        if (mMediaPlayer == null) {
            mMediaPlayer = MediaPlayer.create(mainActivity, R.raw.alte_kirche_einzelschlag_dunkel_ende)
            mMediaPlayer!!.start()
        } else mMediaPlayer!!.start()
    }
}

AndroidManifest:

XML:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
        android:maxSdkVersion="32"/>
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AlteKirche"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.AlteKirche">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".AlarmReceiver" />
    </application>

</manifest>
 

M.L.

Top Contributor
Generell dürfte ein Endgerät zur Programmierung mehr Rechenkraft als ein mobiles Gerät zur Verfügung haben. Zudem könnten auf dem Mobilgerät auch andere (Stör)Prozesse aktiv sein.
 

Jw456

Top Contributor
Der AM ist auch sehr ungenau das haben wir der Maßnahmen zum reduzieren des Akku verbrauch zu verdanken.

Da wird dir ein Logging auch nicht viel bringen dir das nur bestätigen. Das wenn du Lange nichts am Handy gemacht hast die periodischen zeitabstände länger werden.



Für das was du vorhast solltest du dir mal den JobScheduler ansehen.
 
Zuletzt bearbeitet:

KarlNapp

Mitglied
Für das was du vorhast solltest du dir mal den JobScheduler ansehen.

Dankeschön für den Hinweis. Ich muss aber leider feststellen, dass der JobScheduler in punkto Pünktlichkeit auch nicht besser ist.

Java:
    fun stelleZeit() {
        val zeit = Calendar.getInstance()
        minute = zeit.get(Calendar.MINUTE)
        sekunde = zeit.get(Calendar.SECOND)
       
        var x = 0
        if (minute < 15) x = 15
        else if (minute < 30) x = 30
        else if (minute < 45) x = 45
        else  x = 60

        minVerz = (x - minute - 1) * 60000 + (60 - sekunde) * 1000
        maxVerz = (x - minute - 1) * 60000 + (60 - sekunde + 15) * 1000

        val builder = JobInfo.Builder(JOB_ID, serviceComponent)

        val jobInfo = builder
            .setMinimumLatency(minVerz.toLong())
            .setOverrideDeadline(maxVerz.toLong())
            .build()

        jobScheduler?.schedule(jobInfo)

Es gibt aber einen Unterschied: Die Anzahl der Glockenschläge wird ja jeweils bei Eintritt des Alarms ermittelt. Während beim JobScheduler es immer nur einmal schlägt, wenn er mehr als eine Minute zu spät kommt, ist die Anzahl der Schläge beim AlarmManager immer korrekt, auch wenn es erst verspätet bimmelt. D.h. der AlarmReceiver wird wohl pünktlich benachrichtigt, nur das Abspielen der Glockenschläge ist verzögert.
Gibt es eine Möglichkeit diesem ein Art Priorität zu verleihen?

Viele Grüße
KarlNapp
 

DefconDev

Bekanntes Mitglied
Auch wenn was älter, anstatt den veralteten Jobscheduler zu verwenden ist der Workmanager, der eine Abstraktionsebene höher sitzt der neue Shit, der je nach vorliegender Androidversion etwas kompatibles raus sucht. Der garantiert dir auch, im Hintergrund das auszuführen.

 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Logging außerhalb Debugging Android & Cross-Platform Mobile Apps 6
Android App auf das eigene Handy bekommen Android & Cross-Platform Mobile Apps 3
J Android zugrif auf Thread nach Handy drehen. Android & Cross-Platform Mobile Apps 10
M Zugriff auf Helligkeitsregler von Handy? Android & Cross-Platform Mobile Apps 17
P Daten bzw Objekte auf das Handy lokal speichern Android & Cross-Platform Mobile Apps 29
N Wie kann ich mein Handy mit Java rooten? Android & Cross-Platform Mobile Apps 38
R Android App vom Handy dekompilieren Android & Cross-Platform Mobile Apps 4
D Android Android Apps direkt vom Handy aus programmieren? Android & Cross-Platform Mobile Apps 2
B Android App debugen auf Handy, Handy-Desktop auf PC anzeigen Android & Cross-Platform Mobile Apps 1
M Error beim drücken der Zurück-Taste am Handy Android & Cross-Platform Mobile Apps 2
G Auslesen von RFID mit dem Handy Android & Cross-Platform Mobile Apps 3
J Handy bootet nicht mehr richtig Android & Cross-Platform Mobile Apps 2
R Android Datenaustausch zwischen PC und Handy Android & Cross-Platform Mobile Apps 3
K Zeitstopp-App, immer dann aktiv, wenn Handy an - wie vorgehen? Android & Cross-Platform Mobile Apps 4
X Android Handy mit Eclipse verbinden Android & Cross-Platform Mobile Apps 1
T Android Handy in Eclipse einbinden Android & Cross-Platform Mobile Apps 34
A AVD läuft, Handy stüzt ab Android & Cross-Platform Mobile Apps 2
J Apps für Android programmieren - Android Handy notwendig oder reicht Simulator? Android & Cross-Platform Mobile Apps 3
A Handy mit Arduino verbinden Android & Cross-Platform Mobile Apps 4
B Java auf dem Handy Android & Cross-Platform Mobile Apps 5
E Java ME Installation auf Handy Android & Cross-Platform Mobile Apps 2
K Java ME Handy Java App die die Navigationstasten abfragt Android & Cross-Platform Mobile Apps 7
R Handy Java Version Android & Cross-Platform Mobile Apps 18
A Probleme mit Calendar auf dem Handy Android & Cross-Platform Mobile Apps 3
G GPS am Nokia Handy auslesen (Anfänger) Android & Cross-Platform Mobile Apps 15
C Export auf Handy Android & Cross-Platform Mobile Apps 2
O Entwickler für Java Anwendungen auf Handy gesucht! Android & Cross-Platform Mobile Apps 3
N Handy -PC Verbindung Android & Cross-Platform Mobile Apps 2
B Programme aufs Handy ziehn! Android & Cross-Platform Mobile Apps 2
C Programm nicht auf Handy installierbar (Zertifikatfehler) Android & Cross-Platform Mobile Apps 3
I Java Handy - mehrere Programme gleichzeitig Android & Cross-Platform Mobile Apps 8
Screen Java auf Handy,aber nicht Ja2Me ! Android & Cross-Platform Mobile Apps 3
Q einfaches Countdownprogramm Handy Android & Cross-Platform Mobile Apps 10
L HTML Seite anzeigen in Handy-Applikation Android & Cross-Platform Mobile Apps 5
B Java PC Spiel fürs Handy umwandeln? Android & Cross-Platform Mobile Apps 8
T Handy akzeptiert jar nicht Android & Cross-Platform Mobile Apps 12
2 Netbeans Handy Projekt läuft nicht auf Handy! Android & Cross-Platform Mobile Apps 3
G Bluetooth Verbindung zwischen Handy und PC Android & Cross-Platform Mobile Apps 5
M Symbol im Handy Android & Cross-Platform Mobile Apps 2
L Kann App auf Handy nicht ausführen Android & Cross-Platform Mobile Apps 5
Q Handy unterstützt format an Android & Cross-Platform Mobile Apps 18
W Java auf ein CECT Handy installieren Android & Cross-Platform Mobile Apps 6
G SMS über Handy SMS Interface versenden Android & Cross-Platform Mobile Apps 5
loadbrain sony ericsson handy, MIDP 2.0 Android & Cross-Platform Mobile Apps 6
A Java Programm auf Handy? Android & Cross-Platform Mobile Apps 2
S Handy als fernbedienung Android & Cross-Platform Mobile Apps 8
M Handy als Webcam Android & Cross-Platform Mobile Apps 18
R ME-Neuling: welches Prepaid-Handy kaufen? Android & Cross-Platform Mobile Apps 5
K Anwendung für Handy programmieren Android & Cross-Platform Mobile Apps 1
G Bildershow auf Handy Android & Cross-Platform Mobile Apps 2
luke86 Programm von Handy zu Handy weitergeben(NOKIA N70) Android & Cross-Platform Mobile Apps 3
B Textdatei auf Handy erstellen / lesen / schreiben? Android & Cross-Platform Mobile Apps 2
TheJavaKid handy java comiler Android & Cross-Platform Mobile Apps 5
1 zugriff auf handy-microfon Android & Cross-Platform Mobile Apps 2
J J2ME Java Programm im Hintergrund auf Handy laufen lassen? Android & Cross-Platform Mobile Apps 2
G Programm auf handy installieren Android & Cross-Platform Mobile Apps 3
N Wie ist das mit der Handy API? Android & Cross-Platform Mobile Apps 2
K Programme für Handy erstellen Android & Cross-Platform Mobile Apps 3
K Handy Menüprogrammierung Android & Cross-Platform Mobile Apps 4
F Per Java zu Handy connecten Android & Cross-Platform Mobile Apps 5
J Handy-Spiel auf PC ausführen Android & Cross-Platform Mobile Apps 11
M Java-Programme für Handy auf Desktop-PC ausführen Android & Cross-Platform Mobile Apps 4
W JAVA2ME-Game von Handy (V300) auf Pc runterladen?? Android & Cross-Platform Mobile Apps 4
T Für Handy Game die Sprache umschreiben? Android & Cross-Platform Mobile Apps 24
M java game für handy mit grahi. oberfläche Android & Cross-Platform Mobile Apps 1
M Welches Siemens Handy? Android & Cross-Platform Mobile Apps 8
S Problem auf dem Handy Android & Cross-Platform Mobile Apps 3
B Kann man bei Nokia-Handy's über Java die IR ansteuern? Android & Cross-Platform Mobile Apps 6
B Erfahrungen mit Middlets?(Handy-Applets)? Android & Cross-Platform Mobile Apps 2
E Handy Java Anwendungen Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben