Muhammadjon Xasanov
Muhammadjon Xasanov

Reputation: 409

android location - cannot get location in service when app is background

I cannot get location in service with interval time, when app is background. Service works and gets location but location is not updating, gets old location. I test via xiaomi, maybe problem with miui? I tried about 5-10 way but result is same. Get location old when I open app location get new and close the app, get location with old latitude and longitude

for example first way:

   locationManager = getApplicationContext().getSystemService(LOCATION_SERVICE) as LocationManager
    isGPSEnable = locationManager!!.isProviderEnabled(LocationManager.GPS_PROVIDER)
    isNetworkEnable = locationManager!!.isProviderEnabled(LocationManager.NETWORK_PROVIDER)

    if (!isGPSEnable && !isNetworkEnable) {

    } else {


        Log.e(TAG,"${isGPSEnable} ")
        if (isGPSEnable) {
            location = null
            locationManager!!.requestLocationUpdates(LocationManager.GPS_PROVIDER, LastKnownService.LOCATION_INTERVAL.toLong(), 0f, this)
            if (locationManager != null) {
                location = locationManager!!.getLastKnownLocation(LocationManager.GPS_PROVIDER)
                if (App.lastKnownLocation == null){

                    if (location != null) {
                        MLog.d(TAG,"${location!!.latitude}  ${location!!.longitude} == none")

                        App.lastKnownLocation = location



                        sendLocation(App.lastKnownLocation!!)



                        latitude = location!!.getLatitude()
                        longitude = location!!.getLongitude()
                        fn_update(location!!)
                    }


                }else{



                    if (location != null) {
                        MLog.d(TAG,"${location!!.latitude}  ${location!!.longitude} == ${location!!.distanceTo(App.lastKnownLocation)}")

                        App.lastKnownLocation = location




                        latitude = location!!.getLatitude()
                        longitude = location!!.getLongitude()
                        fn_update(location!!)


                            sendLocation(App.lastKnownLocation!!)

                    }

                }
            }
        }else if (isNetworkEnable) {
            location = null
            locationManager!!.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, LastKnownService.LOCATION_INTERVAL.toLong(), 0f, this)
            if (locationManager != null) {
                location = locationManager!!.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)
                if (App.lastKnownLocation == null){

                    if (location != null) {
                        MLog.d(TAG,"${location!!.latitude}  ${location!!.longitude} == none")

                        App.lastKnownLocation = location


                        sendLocation(App.lastKnownLocation!!)



                        latitude = location!!.getLatitude()
                        longitude = location!!.getLongitude()
                        fn_update(location!!)
                    }


                }else{



                    if (location != null) {

                        MLog.d(TAG,"${location!!.latitude}  ${location!!.longitude} == ${location!!.distanceTo(App.lastKnownLocation)}")

                        App.lastKnownLocation = location



                        latitude = location!!.getLatitude()
                        longitude = location!!.getLongitude()
                        fn_update(location!!)

                            sendLocation(App.lastKnownLocation!!)

                    }

                }
            }

        }

    }

second way:

mLocationManager!!.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL.toLong(), LOCATION_DISTANCE,
                mLocationListeners[1])

 private var mLocationListeners = arrayOf(LocationListener(LocationManager.GPS_PROVIDER), LocationListener(LocationManager.NETWORK_PROVIDER))

private inner class LocationListener(provider: String) : android.location.LocationListener {
    internal var mLastLocation: Location

    init {
        Log.e(TAG, "LocationListener $provider")
        mLastLocation = Location(provider)
    }

    override fun onLocationChanged(location: Location) {
        Log.e(TAG, "onLocationChanged: $location")
        try{


            val mBuilder = NotificationCompat.Builder(this@LocationService, "123")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("location sended")
                    .setContentText("onlocation changed")
                    .setStyle(NotificationCompat.BigTextStyle()
                            .bigText("onlocation changed"))
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)

            if (notificationManager != null) notificationManager!!.notify(1,mBuilder.build())


                val distance = location.distanceTo(mLastLocation)

                if (distance > 10){
                    mLastLocation = location
                  sendLocation(mLastLocation)
                }











        }catch (e :java.lang.Exception){
            Log.e(TAG, "send http lat lon exception: $e")

        }

        mLastLocation.set(location)
    }

    override fun onProviderDisabled(provider: String) {
        Log.e(TAG, "onProviderDisabled: $provider")
    }

    override fun onProviderEnabled(provider: String) {
        Log.e(TAG, "onProviderEnabled: $provider")
    }

    override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {
        Log.e(TAG, "onStatusChanged: $provider")
    }
}

Upvotes: 0

Views: 978

Answers (2)

mepfic
mepfic

Reputation: 19

call this method:

private fun openMiuiPowerKeeper(context: Context) {
    context.startActivity(Intent().apply {
        setClassName(
            "com.miui.powerkeeper",
            "com.miui.powerkeeper.ui.HiddenAppsConfigActivity"
        )
        putExtra("package_name", context.packageName)
        putExtra("package_label", context.getString(R.string.app_name))
        flags = Intent.FLAG_ACTIVITY_NEW_TASK
    })
}

it open window, where user need line "not restriction". And you need check is miui firmware on device or something else, for instance, like this:

 private fun isFirmwareMiui(context: Context): Boolean {
    if (Build.MANUFACTURER.equals("xiaomi", true)) {
        context.packageManager.getInstalledPackages(PackageManager.GET_META_DATA).forEach {
            return it.packageName.startsWith("com.miui.")
        }
    }
    return false
}

Upvotes: 1

Imran Khan Saifi
Imran Khan Saifi

Reputation: 569

You have to remove battery optimize restriction for your app in Battery optimization manually( go to battery option from Security app and select no restriction for your app), then it will work.. But how to do it programmatically , i am also searching for that..thanks

Upvotes: 2

Related Questions