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
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:
AlarmReceiver:
AndroidManifest:
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)
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>