اذهب إلى المحتوى
  • 0

كيف اتعامل مع اكواد الاشعارات في الاندرويد ستوديو

عبدالرحمن العنزي4

السؤال

السلام عليكم ورحمة الله وبركاتة, انا في الحقيقة لدي بعض المشاكل في أكواد الاشعارات بأستخدام لغة الكوتلن. في تطبيقي انا استخدم أداة "Time bicker" للمستخدم حتى يختار وقت معين وان اتى الوقت الذي قام بتحديدة يتم تفعيل الاشعار لتذكيرة بالصلاة, والحمدالله يعمل هذا النوع من الاشعار بشكل جيد. لكن أنا اريد اولا ان اضيف وقت افتراضي محدد قبل استخدام الـTime bicker  ومفعل بشكل تلقائي حتى يرسل الاشعار الى المستخدم بنفس التوقيت الى ان يستخدم المستخدم اداة "Time bicker" لتغير موعد الاشعار.

 

فمشكلتي هي:

1- كيف أضيف وقت افتراضي "default time" حتى يتم ارسال الاشعار الى المستخدم قبل ما يستخدم أداة time bicker حتى يتم ارسال الاشعار   بتوقيت اخر اليه؟

2- هل يجب علي استخدام shared preference حتى يعمل الاشعار بنفس التوقيت يوميا؟

 

أكون متشكر جدا الى اي شخص يعطيني اجابات اسئلتي او يلمح لي..

 

Android Manifast.xml

        <receiver android:name=".AthanBrodcasts.fajrBroadcastReceiver"/>

 

My broadcast receiver

class fajrBroadcastReceiver : BroadcastReceiver() {

val CHANNEL_ID = "أذان الفجر"

override fun onReceive(context: Context?, intent: Intent?) {

    val intent = Intent(context, MainActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    val pendingIntent : PendingIntent = PendingIntent.getActivity(context,0,intent,0)

    val builder = NotificationCompat.Builder(context!!, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_fajr_icon)
        .setContentTitle("صلاة الفجر قد حلت")
        .setContentText("بسم الله الرحمن الرحيم")
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setDefaults(NotificationCompat.DEFAULT_ALL)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)

    with(NotificationManagerCompat.from(context)) {
        notify(123, builder.build())
    }

}
}

 

My Setting Activity

private lateinit var picker : MaterialTimePicker
private lateinit var calender : Calendar

val CHANNEL_ID = "أذان الفجر"

private lateinit var alarmManager: AlarmManager
private lateinit var pendingIntent: PendingIntent

fajrEditTxt.setOnClickListener {
        showTimePicker()
    }
    fajrSalah.setOnCheckedChangeListener { buttonView, isChecked ->

        if (isChecked){

        }else{

        }
    }
private fun showTimePicker(){
    val  fajrtime = getSharedPreferences("saveSettingData", Context.MODE_PRIVATE)
    picker = MaterialTimePicker.Builder()
        .setTimeFormat(TimeFormat.CLOCK_12H)
        .setHour(fajrtime.getInt("fajrTimeHour", 0)) // I took it from a library I use
        .setMinute(fajrtime.getInt("fajrTimeMinutes",0)) // I took it from a library I use
        .setTitleText("حدد الموعد الذي تريدة")
        .build()

    picker.show(supportFragmentManager, "AdhanNotifacations")

    picker.addOnPositiveButtonClickListener {

        if(picker.hour > 12){

            fajrEditTxt.setHint(String.format("%02d",picker.hour - 12) + ":"
                    + String.format("%02d", picker.minute) + " PM")
        }else{
            fajrEditTxt.setHint(String.format("%02d",picker.hour) + ":"
                    + String.format("%02d", picker.minute) + " AM")
        }


        calender = Calendar.getInstance()
        calender[Calendar.HOUR_OF_DAY] = picker.hour
        calender[Calendar.MINUTE] = picker.minute
        calender[Calendar.SECOND] = 0
        calender[Calendar.MILLISECOND] = 0

        alarmFajr()

    }
}

private fun createNotificationChannel(){
    val channelName = "مؤذن الفجر"
    val DESCRIPTION_TEXT = "أشعار لأذان الفجر"
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        val name = channelName
        val description_text = DESCRIPTION_TEXT
        val importance = NotificationManager.IMPORTANCE_HIGH
        val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
            description = description_text
        }

        val notificationManager: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }

}
fun alarmFajr(){
    alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
    val i = Intent(this, fajrBroadcastReceiver::class.java)

    pendingIntent = PendingIntent.getBroadcast(this, 0, i,0)

    alarmManager.setInexactRepeating(
        AlarmManager.RTC_WAKEUP, calender.timeInMillis,
        AlarmManager.INTERVAL_DAY, pendingIntent
    )
}

>> نسخه من السؤال موجود في موقع Stack overflow

 استخدم جافا وكوتلن فقط

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

عند استخدام الدالة get في shared preference يمكن تمرير لها قيمة افتراضية في حالة عدم وجود قيمة سابقة لهذا الحقل:

        .setHour(fajrtime.getInt("fajrTimeHour", 0)) // I took it from a library I use
        .setMinute(fajrtime.getInt("fajrTimeMinutes",0)) // I took it from a library I use

في الجزء السابق، استبدل الرقم 0 بقيمة التاريخ الذي تريده، وسيتم العمل فيه بحالة عدم تحديد المستخدم لوقت.

إن كنت تريد ضبط الخدمة الخلفية service يمكنك إطلاق حدث broadcast بنفسك أول تشغيل التطبيق، مثلا ضمن الدالة الرئيسية main، ولكي تقوم بإلغاء broadcast سابق، تحكم بالبيانات عن طريق shred preference فيها مثلا رقم التعديل الذي قام به المستخدم، (رقم آخر توقيت وضعه، وتختبر الشرط فبل إطلاق الإشعار) هذا في حال تم تعديل التوقيت، لكي لا يتم حفظ الإشعار السابق و إطلاقه بوقت خطأ

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...