Android GPS 临近警告( 地理围栏 )
临近警告就是固定一个点,当手机与该点的距离少于指定范围时,可以触发对应的处理
我们可以调用 LocationManager
的 addProximityAlert()
方法添加临近警告
addProximityAlert(double latitude,double longitude,float radius,long expiration,PendingIntent intent)
参数说明
参数 | 说明 |
---|---|
latitude | 指定固定点的经度 |
longitude | 指定固定点的纬度 |
radius | 指定半径长度 |
expiration | 指定经过多少毫秒后该临近警告就会过期失效,-1 表示永不过期 |
intent | 该参数指定临近该固定点时触发该 intent 对应的组件 |
范例
我们用一个简单的范例来演示地理地理围栏,范例运行效果如下
-
创建一个 空的 Android 项目
cn.twle.android.Proximity
-
添加注册一个广播接收者
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(); } }
-
修改
AndroidManifest.xml
注册 receiver 和添加地理定位权限注册 receiver
<receiver android:name=".MsProximityReceiver"/>
添加地理定位权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-
修改
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
改的非常大,就有效果了
地理围栏有啥作用呢? 小孩监护...