Отключить GPS без перенаправления на экран настроек устройства - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу реализовать функциональность, когда приложение выходит в фоновом режиме, GPS должен автоматически выключаться, а когда приложение на переднем плане, GPS должно автоматически включаться.Я включил https://stackoverflow.com/a/44668999/9635628 для включения GPS. Оно работает нормально, но как я могу отключить его, когда приложение работает в фоновом режиме?

Пожалуйста, помогите мне решить эту проблему!

Iпробовал ниже код

    class ArchLifecycleApp : Application(), LifecycleObserver {

        override fun onCreate() {
            super.onCreate()
            ProcessLifecycleOwner.get().lifecycle.addObserver(this)
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun onAppBackgrounded() {
            Log.d("App", "App in background")
            offGPS() 
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun onAppForegrounded() {
            Log.d("App", "App in foreground")
            enableLoc() 
        }
    }

private fun enableLoc() {

        if (googleApiClient == null) {
            googleApiClient = GoogleApiClient.Builder(this@MainActivity)
                    .addApi(LocationServices.API)
                    .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks {
                        override fun onConnected(bundle: Bundle?) {

                        }

                        override fun onConnectionSuspended(i: Int) {
                            googleApiClient!!.connect()
                        }
                    })
                    .addOnConnectionFailedListener { connectionResult -> Log.d("Location error", "Location error " + connectionResult.errorCode) }.build()
            googleApiClient!!.connect()

            val locationRequest = LocationRequest.create()
            locationRequest.priority = LocationRequest.PRIORITY_NO_POWER
            locationRequest.interval = (30 * 1000).toLong()
            locationRequest.fastestInterval = (5 * 1000).toLong()
            val builder = LocationSettingsRequest.Builder()
                    .addLocationRequest(locationRequest)

            builder.setAlwaysShow(true)

            val result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
            result.setResultCallback(object : ResultCallback<LocationSettingsResult> {
                override fun onResult(result: LocationSettingsResult) {
                    val status = result.status
                    when (status.statusCode) {
                        LocationSettingsStatusCodes.RESOLUTION_REQUIRED -> try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(this@MainActivity, REQUEST_LOCATION)

//                            finish()
                        } catch (e: IntentSender.SendIntentException) {
                            // Ignore the error.
                        }
                    }
                }
            })
        }
    }
fun offGPS() {
        var provider = Settings.Secure.getString(contentResolver, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)
        if (provider.contains("gps")) { //if gps is enabled
            var poke: Intent = Intent();
            poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
            poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
            poke.setData(Uri.parse("3"));
            sendBroadcast(poke);
        }
    }

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Второе решение -

/ ** * Метод проверяет, находится ли приложение в фоновом режиме или нет * /

fun isAppIsInBackground(context : Context) : Boolean{
    var isInBackground = true
    val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        val runningProcesses = am.runningAppProcesses
        for (processInfo in runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (activeProcess in processInfo.pkgList) {
                    if (activeProcess.equals(context.packageName)) {
                        isInBackground = false
                    }
                }
            }
        }
    } else {
        val taskInfo = am.getRunningTasks(1)
        val componentInfo = taskInfo.get(0).topActivity
        if (componentInfo.packageName.equals(context.packageName)) {
            isInBackground = false
        }
    }

    return isInBackground
}
0 голосов
/ 20 сентября 2018

Во-первых, в своем классе Application вы должны зарегистрировать детектор, например, так:

registerActivityLifecycleCallbacks(new Detector());

В детекторе, который является экземпляром Application.ActivityLifecycleCallbacks, вы должны вести счет действий, которые возобновляются и приостанавливаются следующим образом.:

/**Detector class**/

@Override
public void onActivityResumed(Activity activity) {
    mActivitiesResumed++;
    if (mInBackground) {
        mInBackground = false;
        // App is in background
    }
}

@Override
public void onActivityPaused(Activity activity) {
    mActivitiesResumed--;
}

@Override
public void onActivityStopped(Activity activity) {
    if (mActivitiesResumed == 0) {
        mInBackground = true;
        // App is in foreground
    }
}

И это должно быть.У меня этот класс работает на производстве безупречно.

0 голосов
/ 20 сентября 2018

Попробуйте это решение

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

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

Надеюсь, это сработает для вас.

...