如何检测用户何时打开/关闭gps状态?

时间:2013-04-03 04:21:13

标签: android gps broadcastreceiver

我想阻止用户更改我的应用程序中的WiFi,GPS和加载设置。用户在运行我的应用程序时无需打开/关闭WiFi和GPS。(来自通知栏)。是否有BroadcastReceiver用于收听GPS开/关?

11 个答案:

答案 0 :(得分:29)

我做了很多挖掘,发现在API 24中已经弃用了addGpsStatusListener(gpsStatusListener)。对我来说,这甚至都没有用!所以,这是另一个替代解决方案。

如果在您的应用中,您想要收听GPS状态更改(我的意思是用户开启/关闭)。使用广播肯定是最好的方法。

实现:

/**
 * Following broadcast receiver is to listen the Location button toggle state in Android.
 */
private BroadcastReceiver mGpsSwitchStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
            // Make an action or refresh an already managed state.
        }
    }
};

不要忘记在Fragment / Activity Lifecycle中有效注册和取消注册。

registerReceiver(mGpsSwitchStateReceiver, new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION));

例如,如果您使用Fragment,请在onResume中注册并注销onDestroy。此外,如果您要将用户引导至设置以启用位置切换,则在onStop中取消注册将无法运行,因此,您的活动将转至onPause并且片段已停止。

这个解决方案可能有很多答案,但这个解决方案很容易管理和使用。提出你的解决方案。

答案 1 :(得分:22)

您可以使用GpsStatus.Listener收听GPS状态 并使用LocationManager注册它。

LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.addGpsStatusListener(new android.location.GpsStatus.Listener()
{
    public void onGpsStatusChanged(int event)
    {
        switch(event)
        {
        case GPS_EVENT_STARTED:
            // do your tasks
            break;
        case GPS_EVENT_STOPPED:
            // do your tasks
            break;
        }
    }
});

您需要有权访问上下文(例如在“Activity”或“Application”类中)。

答案 2 :(得分:3)

这是不可能的。您不能随心所欲地控制/限制硬件的状态。这在API中是非常危险的,因此不存在这样的API。

答案 3 :(得分:2)

您可以注册BroadcastReceiver来收听Intent动作PROVIDERS_CHANGED_ACTION。这将在配置的位置提供程序更改时进行广播。您可以参考此link

答案 4 :(得分:1)

您可以通过以下方式检测GPS的状态。

看看GpsStatus.Listener。使用locationManager.addGpsStatusListener(gpsStatusListener)注册它。

同时检查此SO link以便更好地理解。

答案 5 :(得分:1)

科特琳中尝试以下操作:

添加扩展 BroadcastReceiver 的类:

class GPSCheck(private val locationCallBack: LocationCallBack) :
    BroadcastReceiver() {
    interface LocationCallBack {
        fun turnedOn()
        fun turnedOff()
    }

    override fun onReceive(context: Context, intent: Intent) {
        val locationManager =
            context.getSystemService(LOCATION_SERVICE) as LocationManager
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) locationCallBack.turnedOn() else locationCallBack.turnedOff()
    }

}

然后以这种方式使用它:

class MainActivity :AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        registerReceiver(GPSCheck(object : GPSCheck.LocationCallBack {
            override fun turnedOn() {
                Log.d("GpsReceiver", "is turned on")
            }

            override fun turnedOff() {
                Log.d("GpsReceiver", "is turned off")
            }
        }), IntentFilter(LocationManager.MODE_CHANGED_ACTION))
    }}

答案 6 :(得分:1)

我们可以使用 LocationListener 来了解GPS何时开启和关闭。

class HomeActivity : AppCompatActivity() {
    private var locManager: LocationManager? = null
    private val locListener: LocationListener =
        object : LocationListener {
            override fun onLocationChanged(loc: Location) {
            }

            override fun onProviderEnabled(provider: String) {
                Log.d("abc", "enable")
            }

            override fun onProviderDisabled(provider: String) {
                Log.d("abc", "disable")
            }

            override fun onStatusChanged(
                provider: String,
                status: Int,
                extras: Bundle
            ) {
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        locManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
    }

    override fun onResume() {
        super.onResume()
        startRequestingLocation()
    }

    override fun onStop() {
        super.onStop()
        try {
            locManager!!.removeUpdates(locListener)
        } catch (e: SecurityException) {
        }
    }

    private fun startRequestingLocation() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
            checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        ) {
            requestPermissions(
                arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
                PERMISSION_REQUEST
            )
            return
        }
        locManager!!.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locListener)
    }

    companion object {
        private const val PERMISSION_REQUEST = 1
    }
}

有关更多详细信息,请参见此项目:https://github.com/pR0Ps/LocationShare

答案 7 :(得分:0)

从API 19开始,您可以注册BroadcastReceiver以收听意图操作LocationManager.MODE_CHANGED_ACTION

参考:https://developer.android.com/reference/android/location/LocationManager.html#MODE_CHANGED_ACTION

您可以使用

获取位置模式
try
{
    int locationMode = android.provider.Settings.Secure.getInt(context.getContentResolver(), android.provider.Settings.Secure.LOCATION_MODE);
} catch (android.provider.Settings.SettingNotFoundException e)
{
    e.printStackTrace();
}

返回的值应为以下之一:

android.provider.Settings.Secure.LOCATION_MODE_BATTERY_SAVING
android.provider.Settings.Secure.LOCATION_MODE_HIGH_ACCURACY
android.provider.Settings.Secure.LOCATION_MODE_OFF
android.provider.Settings.Secure.LOCATION_MODE_SENSORS_ONLY

答案 8 :(得分:0)

在活动的onResume()方法中监听LocationManager.PROVIDERS_CHANGED_ACTION个事件:

IntentFilter filter = new IntentFilter(LocationManager.PROVIDERS_CHANGED_ACTION);
filter.addAction(Intent.ACTION_PROVIDER_CHANGED);
mActivity.registerReceiver(gpsSwitchStateReceiver, filter);

将此BroadcastReceiver实例添加到您的“活动”中:

private BroadcastReceiver gpsSwitchStateReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {

            if (LocationManager.PROVIDERS_CHANGED_ACTION.equals(intent.getAction())) {

                LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
                boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
                boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                if (isGpsEnabled || isNetworkEnabled) {
                    // Handle Location turned ON
                } else {
                    // Handle Location turned OFF
                }
            }
        }
    };

通过onPause()方法注销接收者:

mActivity.unregisterReceiver(gpsSwitchStateReceiver);

答案 9 :(得分:-1)

您无法使用GpsStatus.Listener执行此操作。您必须使用广播接收器。使用LocationManager.PROVIDERS_CHANGE_ACTION。不使用Intent.ACTION_PROVIDER_CHANE。 祝你好运!

答案 10 :(得分:-1)

我为此使用android.location.LocationListener

`class MyOldAndroidLocationListener implements android.location.LocationListener {
    @Override public void onLocationChanged(Location location) { }

    //here are the methods you need
    @Override public void onStatusChanged(String provider, int status, Bundle extras) {}
    @Override public void onProviderEnabled(String provider) { }
    @Override public void onProviderDisabled(String provider) { }
}`

注意(来自docs):如果已经使用LocationManager.requestLocationUpdates(String, long, float, LocationListener)方法向位置管理器服务注册了LocationListener服务,则会调用这些方法

由于我将Fused Location API用于与位置相关的内容,因此我只设置了 long minTime = 1小时, float minDistance = 1公里,在requestLocationUpdates中 这样对我的应用程序的开销很小。

当然,当您完成操作后,别忘了locationManager.removeUpdates