رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با alarm manager
#1
.سلام
من از کد زیر برای اذان استفاده می کنم تا موقع اذان اکتیویتی خاصی رو باز کنه ولی گاهی اوقات درست عمل نمی کنه یعنی یا اصلا هشدار اذان رو نمی ده و یا با تاخیر می ده.
جایی خودنم که باید از setExact به جای set استفاده کرد منتهی با استفاده از setExact کلا هشدار رو نمی ده!

سرویس که با بوت سیستم و یا ورود به برنامه اجرا می شه.
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.database.Cursor;
import android.os.IBinder;
import android.util.Log;
 
import java.util.ArrayList;
import java.util.Calendar;
 
 
public class AzanService  extends Service{
 
 
 
    final static int UINQUE_ID=789;
    IBinder mBinder;
    public IBinder onBind(Intent intent) {
        return null;
    }
    public int onStartCommand(Intent intent, int flags, int startId){
 
        Calendar c = Calendar.getInstance();
        int year=c.get(Calendar.YEAR);
        int month=c.get(Calendar.MONTH)+1;
        int day=c.get(Calendar.DAY_OF_MONTH);
 
        int hour=c.get(Calendar.HOUR_OF_DAY);
        int minute=c.get(Calendar.MINUTE);
        int second=c.get(Calendar.SECOND);
 
        PrayTime p=new PrayTime();
        p.setCalcMethod(6);
 
        int[] jdate=PersianDate.greorgorian2jalali(year, month, day);
 
        double tz=((double) c.getTimeZone().getRawOffset() / 3600000)+((jdate[1]<7 && !(jdate[1]==6 && jdate[2]==31) && !(jdate[1]==1 && jdate[2]==1))?1:0);
 
        Cursor azanInfo=new DbHelper(getApplicationContext()).getAzanInfo();
        String city;
        double lat;
        double lng;
        if(azanInfo.getCount() == 0){
            city="مشهد";
            lat=36.288135;
            lng=59.615757;
        }
        else{
            city=azanInfo.getString(0);
            lat=Double.parseDouble(azanInfo.getString(1));
            lng=Double.parseDouble(azanInfo.getString(2));
        }
 
        ArrayList<String> pt=p.getDatePrayerTimes(year, month, day,lat,lng, tz);
 
        String[] s_fajr=pt.get(0).split(":");
        int fajr=(Integer.parseInt(s_fajr[0])*60+Integer.parseInt(s_fajr[1]))*60;
 
        String[] s_dhuhr=pt.get(2).split(":");
        int dhuhr=(Integer.parseInt(s_dhuhr[0])*60+Integer.parseInt(s_dhuhr[1]))*60;
 
        String[] s_maghrib=pt.get(5).split(":");
        int maghrib=(Integer.parseInt(s_maghrib[0])*60+Integer.parseInt(s_maghrib[1]))*60;
 
        int nowtime=(hour*60+minute)*60+second;
 
 
        Calendar c2 = Calendar.getInstance();
        c2.add(Calendar.DATE,1);
        int year2=c2.get(Calendar.YEAR);
        int month2=c2.get(Calendar.MONTH)+1;
        int day2=c2.get(Calendar.DAY_OF_MONTH);
 
        int[] jdate2=PersianDate.greorgorian2jalali(year, month, day);
 
        double tz2=((double) c2.getTimeZone().getRawOffset() / 3600000)+((jdate2[1]<7 && !(jdate2[1]==6 && jdate2[2]==31) && !(jdate2[1]==1 && jdate2[2]==1))?1:0);
        ArrayList<String> pt2=p.getDatePrayerTimes(year2, month2, day2, 32.53, 59.13, tz2);
 
        String[] s_fajr2=pt2.get(0).split(":");
        int fajr2=(Integer.parseInt(s_fajr2[0])*60+Integer.parseInt(s_fajr2[1]))*60;
 
        int timer=0;
        String azan="";
        if(nowtime<fajr){
            timer=fajr-nowtime;
            azan="صبح";
        }
        else if(nowtime == fajr){
            timer=dhuhr-nowtime;
            azan="ظهر";
        }
        else if(nowtime<dhuhr){
            timer=dhuhr-nowtime;
            azan="ظهر";
        }
        else if(nowtime == dhuhr){
            timer=maghrib-nowtime;
            azan="مغرب";
        }
        else if(nowtime<maghrib){
            timer=maghrib-nowtime;
            azan="مغرب";
        }
        else if(nowtime == maghrib){
            timer=(24*3600)-maghrib+fajr2;
            azan="صبح";
        }
        else{
            timer=(24*3600)-nowtime+fajr2;
            azan="صبح";
        }
 
        
        timer=timer*1000;
 
 
        Intent _intent = new Intent(this,AzanActivity.class);
        _intent.putExtra("azan",azan);
        _intent.putExtra("city",city);
        PendingIntent pi = PendingIntent.getActivity(this, AzanService.UINQUE_ID, _intent, PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERV  ICE);
        if(android.os.Build.VERSION.SDK_INT < 19){
            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timer, pi);
        }
        else{
            am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timer, pi);
        }
 
 
        return START_NOT_STICKY;
    }
}


اکتیویتی :
import android.content.Context;
import android.content.Intent;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.WindowManager;
import android.widget.TextView;
 
 
public class AzanActivity extends BaseActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_azan);
        Fonts.setYekan(this, (TextView) findViewById(R.id.txt_azan));
        TextView txt_info=(TextView)findViewById(R.id.txt_info);
        String txt="اذان "+getIntent().getStringExtra("azan")+" "+"به افق"+" "+getIntent().getStringExtra("city");
        Fonts.setYekan(this, txt_info);
        txt_info.setText(txt);
 
        Intent i = new Intent(getApplicationContext(), AzanService.class);
        stopService(i);
        startService(i);
 
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
 
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE  _NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(  ), notification);
        r.play();
        Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        v.vibrate(500);
 
    }
}
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان