Android GPS 临近警告( 地理围栏 )

临近警告就是固定一个点,当手机与该点的距离少于指定范围时,可以触发对应的处理

我们可以调用 LocationManageraddProximityAlert() 方法添加临近警告

addProximityAlert(double latitude,double longitude,float radius,long expiration,PendingIntent intent)

参数说明

参数 说明
latitude 指定固定点的经度
longitude 指定固定点的纬度
radius 指定半径长度
expiration 指定经过多少毫秒后该临近警告就会过期失效,-1 表示永不过期
intent 该参数指定临近该固定点时触发该 intent 对应的组件

范例

我们用一个简单的范例来演示地理地理围栏,范例运行效果如下

  1. 创建一个 空的 Android 项目 cn.twle.android.Proximity

  2. 添加注册一个广播接收者 MsProximityReceiver.java

    package cn.twle.android.proximity;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.location.LocationManager;
    import android.widget.Toast;
    
    public class MsProximityReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            boolean isEnter = intent.getBooleanExtra( LocationManager.KEY_PROXIMITY_ENTERING, false);
            if(isEnter) Toast.makeText(context, "你已到达北京 CBD 万达广场", Toast.LENGTH_LONG).show();
            else Toast.makeText(context, "你离开了北京 CBD 万达广场", Toast.LENGTH_LONG).show();
        }
    }
    
  3. 修改 AndroidManifest.xml 注册 receiver 和添加地理定位权限

    注册 receiver

    <receiver android:name=".MsProximityReceiver"/>
    

    添加地理定位权限

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
  4. 修改 MainActivity.java

    package cn.twle.android.proximity;
    
    import android.Manifest;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.location.LocationManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    import static android.Manifest.permission.ACCESS_FINE_LOCATION;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    
            // 定义固定点的经纬度
            double longitude = 116.477329;
            double latitude = 39.916453;
    
            float radius = 100;     //定义半径,米
    
            Intent intent = new Intent(this, MsProximityReceiver.class);
            PendingIntent pi = PendingIntent.getBroadcast(this, -1, intent, 0);
    
            // 检查权限
    
            if ( checkCallingOrSelfPermission(ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    
                try {
                    lm.addProximityAlert(latitude, longitude, radius, -1, pi);
                } catch (Exception e) {
                }
            }
        }
    }
    

有可能会立即没效果,那是因为我们还没靠近 CBD 100 m,你可以把 radius 改的非常大,就有效果了

地理围栏有啥作用呢? 小孩监护...

参考文档

  1. 官方 API 文档:LocationManager

  2. 官方 API 文档:LocationProvider

  3. 官方 API 文档: Location

  4. 官方 API 文档: Criteria

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.