0

In my application I want to get GPS location of through a foregrond service and receiver. every thing is running fine but after two or three successful run. service is not able to detect internet and returns false

here is the code

Code for receiver of calling service in activity

public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Intent ll24 = new Intent(getBaseContext(), AlarmReceiver.class);
    PendingIntent recurringLl24 = PendingIntent.getBroadcast(getBaseContext(), 0, ll24, PendingIntent.FLAG_CANCEL_CURRENT);
    AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarms.setRepeating(AlarmManager.RTC_WAKEUP,0, 30*10*100, recurringLl24);
   }
 //.....
}

& in receiver class

public class AlarmReceiver extends WakefulBroadcastReceiver 
{   
    static Context context;
    Date curTime,sdf,edf;
    private static final String LOG_TAG = "ForegroundService";

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        try 
        {
            Calendar c =  Calendar.getInstance();
            curTime =  new SimpleDateFormat( "HH:mm" ).parse(c.get( Calendar.HOUR_OF_DAY)+":"+c.get( Calendar.MINUTE));
            sdf = new SimpleDateFormat( "HH:mm" ).parse("08:00");
            edf = new SimpleDateFormat( "HH:mm" ).parse("20:00");    
            if(curTime.after(sdf) && curTime.before(edf))
            {
                Intent ll24Service = new Intent(context, ForegroundService.class);
                ll24Service.setAction(Constants.ACTION.STARTFOREGROUND_ACTION);
                ForegroundService.IS_SERVICE_RUNNING = true;
                startWakefulService(context,ll24Service);   
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 }

in service class

public class ForegroundService extends Service 
{
...
@Override
public int onStartCommand(Intent intent, int flags, int startId) 
{
    AlarmReceiver.completeWakefulIntent(intent);
    if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) 
    {
        Log.i(LOG_TAG, "Received Start Foreground Intent ");
        showNotification();

        Calendar c =  Calendar.getInstance();
        curDateTime  = c.get( Calendar.YEAR)+"-"+ String.valueOf(c.get( Calendar.MONTH )+1)+"-"+ c.get( Calendar.DAY_OF_MONTH)+" "+c.get( Calendar.HOUR_OF_DAY)+":"+c.get( Calendar.MINUTE)+":"+c.get( Calendar.SECOND);

        gps = new GPS(ForegroundService.this);
        if(gps.canGetLocation())
        {
            double latitude = gps.getLatitude();
            double longitude = gps.getLongitude();
            latt=Double.toString(latitude);
            longi =String.valueOf(longitude);

            insertData();   
        }
        else
        {
            gps.showSettingsAlert();
        }   
    } 

@Override
public void onDestroy() {
    super.onDestroy();
    Log.i(LOG_TAG, "In onDestroy");
}

private void insertData() 
{
    try
    {
        String QUERY = "insert into GpsLoc values('"+usr+"','"+latt+"','"+longi+"','"+curDateTime+"')";
        myDatabase.execSQL(QUERY);

        Log.i(LOG_TAG, "insert");
        ConnectionDetector cd = new ConnectionDetector(getApplicationContext());
        Boolean isInternetPresent = cd.isConnectingToInternet();

        if(isInternetPresent)
        {
            Log.i(LOG_TAG, "chk int");
            addToJason();
        }
        else
        {
            Log.i(LOG_TAG, "No int");
            stopForeground(true);
            stopSelf();
        }



    }
    catch(Exception ex)
    {
        Toast.makeText(getApplicationContext(), "Data not inserted : "+ex.toString(), Toast.LENGTH_LONG).show();
    }
}

Every thing is running fine as shown in the log:

03-19 12:11:48.160: I/ForegroundService(17476): Received Start Foreground Intent

03-19 12:11:48.270: D/Network(17476): Network

03-19 12:11:48.340: I/ForegroundService(17476): insert

03-19 12:11:48.390: I/ForegroundService(17476): chk int

03-19 12:11:49.340: I/ForegroundService(17476): uploaded

03-19 12:11:49.350: I/ForegroundService(17476): In onDestroy

But after two or three run same log became

03-19 12:15:34.670: I/ForegroundService(17476): Received Start Foreground Intent

03-19 12:15:34.740: D/Network(17476): Network

03-19 12:15:34.780: I/ForegroundService(17476): insert

03-19 12:15:34.780: I/ForegroundService(17476): No int

03-19 12:15:34.850: I/ForegroundService(17476): In onDestroy

the problem is at checking internet connection while app is not running and it is called through service. Please suggest any solution

Some times it throuws :

03-27 12:30:07.240: I/ForegroundService(1543): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

and some times : Error converting result jsonobject

Please help Problem Strat Here when we called to detect internet in service

ConnectionDetector cd = new ConnectionDetector(getApplicationContext());
Boolean isInternetPresent = cd.isConnectingToInternet();

1 Answers1

1

Add this dependency in your gradle file.

compile 'com.firebase:firebase-jobdispatcher:0.8.5'

Create a Firebase JobService File and declare in manifest.

<service
        android:exported="false"
        android:name="._User_Classes.User_Call_Record.ScheduledJobService">
        <intent-filter>
        <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
        </service>

Declare and start the JobService from your activity or fragment

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(ScheduledJobService.class) // the JobService that will be called
                .setRecurring(false) //repeat the job or not

                .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                .setTrigger(Trigger.executionWindow(0, 60))
                .setLifetime(Lifetime.FOREVER)
                .setTag("demo")        // uniquely identifies the job
                .build();
        dispatcher.mustSchedule(myJob);

Below is the JobService class which will be called each time the job is executed.

public class ScheduledJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters job) {
    if(isConnected(this))
{
//internet available
}
else{
//internet not available
}
       //perform your operations
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new 
        GooglePlayDriver(this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(ScheduledJobService.class) // the JobService that will be called
                .setRecurring(false) //repeat the job or not
                .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                .setTrigger(Trigger.executionWindow(0, 60))
                .setLifetime(Lifetime.FOREVER)
                .setTag("demo")        // uniquely identifies the job
                .build();
        dispatcher.mustSchedule(myJob);
        return true;
    }






    @Override
    public boolean onStopJob(JobParameters job) {
        return false;
    }

 public static NetworkInfo getNetworkInfo(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo();
    }

    /**
     * Check if there is any connectivity
     *
     * @param context
     * @return
     */
    public static boolean isConnected(Context context) {
        NetworkInfo info = getNetworkInfo(context);
        return (info != null && info.isConnected());
    }

}

I hope it helps

Paras Watts
  • 2,565
  • 4
  • 21
  • 46