0

Mine is an android tracking app. It gets gps location and send it to server. if gps location is not found it gets location using cell id. It works fine in android 2.3.3 . It also works in android 4.1.2 but stops after some time(2hrs or 8 hrs,sometimes 1 day), without any force close message. I googled but didn't find the error. Are any methods deprecated in 2.3.3. Below is my code. the service is started repeatedly by the BroadcastReceiver which is started by AlarmManager.
I have written this in my manifest file:

<uses-sdk android:minSdkVersion="7" 
    android:targetSdkVersion="18"/>

GPSLoggerService class:

public class GPSLoggerService extends Service implements LocationListener {
    @Override
    public void onCreate() {
        AppLog.logString("GPSLoggerService.onCreate().");
        final SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        AppLog.logString("GPSLoggerService.onCreate().");
        data_mode = settings.getInt("data_mode", 1);
        boolean firstRecordAfterBoot = settings.getBoolean("justBooted", false);

        settings.edit().putBoolean("justBooted", false);

        super.onCreate();
        // db = new DBAdapter(this);
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        appendLog("in onStartCommend, ");
        AppLog.logString("GPSLoggerService.onStartCommand().");
        this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
        startLoggingService();
        startMonitoringTimer();
        try {
            sendData();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // dbadapter = new DBAdapter(this);

        return Service.START_STICKY;
    }

    @Override
    public void onLocationChanged(Location location) {
        appendLog("onLocationChanged, ");
        AppLog.logString("GPSLoggerService.onLocationChanged().");
        didFindLocation = true;
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        altitude = location.getAltitude();
        // Toast.makeText(getApplicationContext(),"lat :"+latitude+"longi :"+longitude,
        // Toast.LENGTH_LONG).show();
        gpsaltitude = String.valueOf(altitude);
        gpslatitude = String.valueOf(latitude);
        gpslongitude = String.valueOf(longitude);
        mps = location.getSpeed();
        kmh = (float) (mps * 3.6);
        speed = Float.toString(kmh);

        SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        datetime = sdfDateTime.format(new Date(location.getTime()));
        appendLog(datetime + ", ");
    }

    @Override
    public void onProviderDisabled(String provider) {
        AppLog.logString("GPSLoggerService.onProviderDisabled().");
        appendLog("onLocationChanged, ");
    }

    @Override
    public void onProviderEnabled(String provider) {
        AppLog.logString("GPSLoggerService.onProviderEnabled().");
        appendLog("onProviderEnabled, ");
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        AppLog.logString("GPSLoggerService.onStatusChanged().");
        appendLog("onStatusChanged, ");
    }

    private void startLoggingService() {

        AppLog.logString("GPSLoggerService.startLoggingService.");
        turnGPSOn();
        db = new DBAdapter(this);
        if (manager == null) {
            manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        }
        ma = new MainActivity();

        final Criteria criteria = new Criteria();

        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setAltitudeRequired(true);
        criteria.setSpeedRequired(true);
        criteria.setBearingRequired(true);
        criteria.setPowerRequirement(Criteria.POWER_LOW);

        final String bestProvider = manager.getBestProvider(criteria, true);

        if (bestProvider != null && bestProvider.length() > 0) {
            manager.requestLocationUpdates(bestProvider, gpsMinTime, gpsMinDistance, this);
            startTimer();
        } else {
            final List<String> providers = manager.getProviders(true);

            for (final String provider : providers) {
                manager.requestLocationUpdates(provider, gpsMinTime, gpsMinDistance, this);
                startTimer();
            }
        }
    }

    private void stopLoggingService() {
        this.unregisterReceiver(this.mBatInfoReceiver);
        stopSelf();
    }

    private void startMonitoringTimer() {
        monitoringTimer = new Timer();
        AppLog.logString("GPSLoggerService.monitoringTimer.");
        monitoringTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                if (longitude != 0.0 && latitude != 0.0) {
                    monitoringTimer.cancel();
                    monitoringTimer = null;
                    turnGPSOn();
                    saveData();
                    manager.removeUpdates(GPSLoggerService.this);
                    stopLoggingService();
                }
            }
        }, GPSLoggerService.TIMER_DELAY, GPSLoggerService.TIMER_DELAY);
    }

    private void startTimer() {
        AppLog.logString("GPSLoggerService.countDownTimer.");
        appendLog("startTimer, ");
        // Toast.makeText(getApplicationContext(),"data_mode="+data_mode,
        // Toast.LENGTH_LONG).show();
        if (countDownTimer != null) {
            countDownTimer.cancel();
            countDownTimer = null;
        }
        countDownTimer = new CountDownTimer(15000L, 1000L) {// 15 seconds
                                                            // max
            @Override
            public void onTick(long millisUntilFinished) {
                if (didFindLocation) {
                    countDownTimer.cancel();
                }
            }

            @Override
            public void onFinish() {
                if (!didFindLocation) {
                    appendLog("onFinish, ");
                    manager.removeUpdates(GPSLoggerService.this);
                    // stopSelf()
                    if (data_mode == 1) {
                        cellID();
                    } else {
                        /*
                         * TelephonyManager telephonyManager =
                         * (TelephonyManager
                         * )getSystemService(Context.TELEPHONY_SERVICE);
                         * imeiCellID = telephonyManager.getDeviceId();
                         * SimpleDateFormat sdfDateTime = new
                         * SimpleDateFormat( "yyyy-MM-dd HH:mm:ss");
                         * datetimeCellID = sdfDateTime.format(new Date());
                         * db.open();
                         * id=db.insertData(imeiCellID,"null","null"
                         * ,datetimeCellID,"null","null",level1);
                         * db.close();
                         */
                        Toast.makeText(getApplicationContext(), "GPS : Cant find Location", Toast.LENGTH_LONG).show();
                    }
                    stopLoggingService();

                }
            }
        };
        countDownTimer.start();
    }

    private void turnGPSOn() {
        String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (!provider.contains("gps")) { // if gps is disabled
            final Intent poke = new Intent();
            poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
            poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
            poke.setData(Uri.parse("1"));
            sendBroadcast(poke);
        }
    }

    public void appendLog(String text) {
        // Toast.makeText(getApplicationContext(),"oncreate",
        // Toast.LENGTH_LONG).show();
        File folder3 = new File(Environment.getExternalStorageDirectory(), "BPCLTracker");
        if (!folder3.exists()) {
            folder3.mkdirs();
        }

        try {
            File kmlFile3 = new File(folder3.getPath(), "logfile.txt");
            if (!kmlFile3.exists()) {
                kmlFile3.createNewFile();
            }
            RandomAccessFile fileAccess3 = new RandomAccessFile(kmlFile3, "rw");
            FileLock lock = fileAccess3.getChannel().lock();
            fileAccess3.seek(kmlFile3.length());
            fileAccess3.write(text.getBytes());
            lock.release();
            fileAccess3.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public boolean isInternetOn() {
        ConnectivityManager connec = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        // ARE WE CONNECTED TO THE NET
        if (connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED || connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTING
                || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING || connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED) {
            return true;
        } else if (connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED || connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) {
            return false;
        }
        return false;
    }

    public int setFlag() {
        final SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        boolean firstRecord = settings.getBoolean("firstRecord", false);
        boolean firstRecordAfterBoot = settings.getBoolean("justBooted", false);

        if (firstRecord == true) {
            flag = 0;
            // Toast.makeText(getBaseContext(),"1st record after installation : "+flag,Toast.LENGTH_LONG
            // ).show();
            settings.edit().putBoolean("firstRecord", false).commit();
        } else if (firstRecordAfterBoot == true) {
            flag = 1;
            // Toast.makeText(getBaseContext(),"1st record after boot : "+flag,Toast.LENGTH_LONG
            // ).show();
            settings.edit().putBoolean("justBooted", false).commit();
        } else {
            flag = 2;
            // Toast.makeText(getBaseContext(),"regular : "+flag,Toast.LENGTH_LONG
            // ).show();
        }
        return flag;

    }

    public void cellID() {
        appendLog("in cellID, ");
        TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

        GsmCellLocation cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();
        int cid = cellLocation.getCid();
        int lac = cellLocation.getLac();
        SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        datetimeCellID = sdfDateTime.format(new Date());
        appendLog(datetimeCellID);
        String cell_Id = String.valueOf(cid);
        String gsm_Loc_Area_Code = String.valueOf(lac);
        // Toast.makeText(getBaseContext(),"cellid="+cell_Id+"\nGsm Location Area Code:"+gsm_Loc_Area_Code,Toast.LENGTH_LONG
        // ).show();

        if (RqsLocation(cid, lac)) {
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            imeiCellID = tm.getDeviceId();
            latitude_cellID = String.valueOf((float) myLatitude / 1000000);
            longitude_cellID = String.valueOf((float) myLongitude / 1000000);
            // Toast.makeText(getBaseContext(),"Lat:"+latitude_cellID+"Long:"+longitude_cellID,Toast.LENGTH_LONG
            // ).show();

            // DBAdapter db=new DBAdapter(this);

            // --add contact----
            db.open();
            setFlag();
            datatype = String.valueOf(flag);
            id = db.insertData(imeiCellID, latitude_cellID, longitude_cellID, datetimeCellID, "null", "null", level1, datatype, "0");
            db.close();

            // --get all contacts----------
            db.open();
            Cursor c = db.getAllData();
            if (c.moveToFirst()) {
                do {
                    DisplayData(c);
                } while (c.moveToNext());
            }
            db.close();

        }// if
        else {
            Toast.makeText(getBaseContext(), "CellID : Can't find Location", Toast.LENGTH_LONG).show();
        }// else
    }// cellID

    private Boolean RqsLocation(int cid, int lac) {
        appendLog("in req location, ");
        // Toast.makeText(getBaseContext(),"inReqloc",Toast.LENGTH_LONG
        // ).show();
        Boolean result = false;
        String urlmmap = "http://www.google.com/glm/mmap";

        try {
            URL url = new URL(urlmmap);
            URLConnection conn = url.openConnection();
            HttpURLConnection httpConn = (HttpURLConnection) conn;
            httpConn.setRequestMethod("POST");
            httpConn.setDoOutput(true);
            httpConn.setDoInput(true);
            httpConn.connect();
            OutputStream outputStream = httpConn.getOutputStream();
            WriteData(outputStream, cid, lac);
            InputStream inputStream = httpConn.getInputStream();
            DataInputStream dataInputStream = new DataInputStream(inputStream);
            dataInputStream.readShort();
            dataInputStream.readByte();
            int code = dataInputStream.readInt();
            if (code == 0) {
                myLatitude = dataInputStream.readInt();
                myLongitude = dataInputStream.readInt();
                result = true;

            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return result;

    }

    private void WriteData(OutputStream out, int cid, int lac) throws IOException {
        DataOutputStream dataOutputStream = new DataOutputStream(out);
        dataOutputStream.writeShort(21);
        dataOutputStream.writeLong(0);
        dataOutputStream.writeUTF("en");
        dataOutputStream.writeUTF("Android");
        dataOutputStream.writeUTF("1.0");
        dataOutputStream.writeUTF("Web");
        dataOutputStream.writeByte(27);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(3);
        dataOutputStream.writeUTF("");
        dataOutputStream.writeInt(cid);
        dataOutputStream.writeInt(lac);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.flush();
    }

    public void saveData() {

        // Toast.makeText(getApplicationContext(),"in saveData",
        // Toast.LENGTH_LONG).show();
        if (isInternetOn()) {
            appendLog("in saveDataAfter if internet is on, ");
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            imeino = tm.getDeviceId();

            // DBAdapter db=new DBAdapter(this);

            // --add contact----
            db.open();
            setFlag();
            datatype = String.valueOf(flag);
            id = db.insertData(imeino, gpslatitude, gpslongitude, datetime, gpsaltitude, speed, level1, datatype, "1");
            db.close();
        } else if (!isInternetOn()) {
            appendLog("in saveDataAfter if internet is not not on, ");
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            imeino = tm.getDeviceId();
            // DBAdapter db=new DBAdapter(this);

            // --add contact----
            db.open();
            setFlag();
            datatype = String.valueOf(flag);
            id = db.insertData(imeino, gpslatitude, gpslongitude, datetime, gpsaltitude, speed, level1, datatype, "1");

            db.close();
        }// elseif
    }// end of saveData() function

    public void sendData() throws ClientProtocolException, IOException {
        // Toast.makeText(getApplicationContext(),"in sendData",
        // Toast.LENGTH_LONG).show();
        appendLog("sendData, ");
        if (isInternetOn()) {

            JSONObject jObject = new JSONObject();
            try {
                // DBAdapter db=new DBAdapter(this);
                db.open();
                Cursor cursor = db.getAllData();
                if (cursor.moveToFirst()) {
                    do {
                        jObject = new JSONObject();
                        jObject.put("Imei", cursor.getString(1));
                        jObject.put("Lat", cursor.getString(2));
                        jObject.put("Long", cursor.getString(3));
                        jObject.put("Gpsdatetime", cursor.getString(4));
                        jObject.put("Altitude", cursor.getString(5));
                        jObject.put("Speed", cursor.getString(6));
                        jObject.put("Battery", cursor.getString(7));
                        jObject.put("DataType", cursor.getString(8));
                        jObject.put("DataSource", cursor.getString(9));

                        String datatoServer = jObject.toString() + "\n";

                        // Toast.makeText(getApplicationContext(),datatoServer,
                        // Toast.LENGTH_LONG).show();

                        HttpEntity entity;
                        HttpClient client = new DefaultHttpClient();
                        String url = "http://some IP/insertv2.php";

                        HttpPost request = new HttpPost(url);
                        StringEntity se = new StringEntity(datatoServer);
                        se.setContentEncoding("UTF-8");
                        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                        entity = se;
                        request.setEntity(entity);
                        HttpResponse response = client.execute(request);
                        entity = response.getEntity();
                        db.deleteContacts(cursor.getLong(0));
                    } while (cursor.moveToNext());
                }// if
                db.close();
            }// try
            catch (JSONException e) {
                e.printStackTrace();
            }
        }
    } // method
}// end of service class

Error log:

11-12 16:43:46.174: E/AndroidRuntime(23962): FATAL EXCEPTION: main
11-12 16:43:46.174: E/AndroidRuntime(23962): android.os.NetworkOnMainThreadException
11-12 16:43:46.174: E/AndroidRuntime(23962):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at bpcl.gps.tracker.GPSLoggerService.RqsLocation(GPSLoggerService.java:468)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at bpcl.gps.tracker.GPSLoggerService.cellID(GPSLoggerService.java:414)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at bpcl.gps.tracker.GPSLoggerService$3.onFinish(GPSLoggerService.java:288)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at android.os.Looper.loop(Looper.java:137)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at android.app.ActivityThread.main(ActivityThread.java:4947)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at java.lang.reflect.Method.invokeNative(Native Method)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at java.lang.reflect.Method.invoke(Method.java:511)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
11-12 16:43:46.174: E/AndroidRuntime(23962):    at dalvik.system.NativeStart.main(Native Method)
BenMorel
  • 34,448
  • 50
  • 182
  • 322
user2686960
  • 25
  • 10
  • 1
    post the error log tooo... – Renjith K N Nov 12 '13 at 11:08
  • You need to do network related operations inside `a new separate thread` inside your service. – Mehul Joisar Nov 12 '13 at 11:25
  • Are you performing your networking in the main thread? See this if so. http://developer.android.com/reference/android/os/NetworkOnMainThreadException.html – Darryl Bayliss Nov 12 '13 at 11:25
  • i am doing all network related operations in my service only. do I need to use a new thread for that? or an ansycTask? – user2686960 Nov 12 '13 at 11:30
  • I think asyncTask will be batter,because main thread is busy to handle click events of GUI,so if you try to do all network operation in main thread it will gives error. – Rupesh Nerkar Nov 12 '13 at 11:42
  • app has no GUI no clicks. – user2686960 Nov 12 '13 at 11:44
  • 1
    Services run in the main thread as well so you'll need a separate thread (e.g. an asynctask) to do network operations off the main thread. Suppressing the check like @RupeshNerkar suggests is bad advice, it just hides the problem. See e.g. http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception for more. – laalto Nov 12 '13 at 11:54
  • @laalto wht if we put all network operations in doInBackground method of asyncTask? – Rupesh Nerkar Nov 12 '13 at 12:00
  • @RupeshNerkar Yes that would be a much better solution than suppressing all thread policy checks. – laalto Nov 12 '13 at 12:03
  • ok i ll try doin this – user2686960 Nov 12 '13 at 12:11

1 Answers1

-2

try to use this code in onCreate method.

int SDK_INT = android.os.Build.VERSION.SDK_INT;

if (SDK_INT>8){

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

}

and Set the Android Manifest to something like this

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" android:maxSdkVersion="16"/>
Rupesh Nerkar
  • 391
  • 1
  • 3
  • 23