地理围栏功能

指定应用权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

在“AndroidManifest.xml”文件中注册广播接收器。

<!-- 注册地理围栏服务广播接收器 -->
        <receiver
            android:name=".GeoFenceBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION" />
            </intent-filter>
        </receiver>

地理围栏工具类

public class GeoFenceBroadcastReceiver extends BroadcastReceiver  {
    public static final String ACTION_PROCESS_LOCATION =
            "com.huawei.hmssample.geofence.GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION";
    private static final String TAG = "GeoFenceBroadcastReceiv";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_PROCESS_LOCATION.equals(action)) {
                // 从intent中解析出GeofenceData对象
                GeofenceData geofenceData = GeofenceData.getDataFromIntent(intent);
                if (geofenceData != null) {
                    // 获取错误码
                    int errorCode = geofenceData.getErrorCode();
                    // 获取地理围栏触发类型
                    int conversion = geofenceData.getConversion();
                    // 获取触发的地理围栏信息
                    List<Geofence> list = geofenceData.getConvertingGeofenceList();
                    // 获取触发时的位置信息
                    Location mLocation = geofenceData.getConvertingLocation();
                    // 是否是正常触发围栏事件,返回false时表示出现错误
                    boolean status = geofenceData.isSuccess();
                    // TODO: 您可以根据返回的地理围栏信息,做相应的
                    Log.i(TAG, "onReceive:是否正常触发地理位置 "+status);
                    Log.i(TAG, "onReceive: 设备与围栏状态码"+conversion);
                }
            }
        }

    }
}
通过PendingIntent动态注册GeoFenceBroadcastReceiver广播接收器,当触发围栏的时候,会通过广播通知。
  @SuppressLint("WrongConstant")
    private PendingIntent getPendingIntentGeo() {
        Intent intent = new Intent(this, GeoFenceBroadcastReceiver.class);
        intent.setAction(GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION);
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
            return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        } else {
            // 针对android12及以上设备需要主动配置pendingIntent的可变性,默认配置PendingIntent.FLAG_MUTABLE
            // 如果compileSdkVersion为30及以下,可将PendingIntent.FLAG_MUTABLE用 1<<25 替换
            return PendingIntent.getBroadcast(this, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT | 1 << 25);
        }
    }
地理围栏
 private void geographicalFunction() {
        GeofenceService geofenceService = LocationServices.getGeofenceService(this);
        // 获取PendingIntent对象
        PendingIntent pendingIntent = getPendingIntentGeo();
        //创建地理围栏请求
        GeofenceRequest.Builder builder = new GeofenceRequest.Builder();

        //Geofence 围栏对象
        Geofence geofence = new Geofence.Builder()
                .setUniqueId("mGeofence")//设置地理围栏的唯一表示
                .setValidContinueTime(10000)//设置地理围栏超时时间
                .setRoundArea(30.345145, 114.332095, 500)
                //进入或退出围栏时触发回调
                .setConversions(Geofence.ENTER_GEOFENCE_CONVERSION | Geofence.EXIT_GEOFENCE_CONVERSION)
                .build();

        // 当用户在围栏中时,添加围栏后立即触发回调
        builder.setInitConversions(GeofenceRequest.ENTER_INIT_CONVERSION);

        //创建围栏集合   我这边没有写集合
        builder.createGeofence(geofence);

        geofenceService.createGeofenceList(builder.build(), pendingIntent)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.i(TAG, "onSuccess: 地理围栏成功!!");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(Exception e) {
                        Log.i(TAG, "onFailure: 失败!!" + e.getMessage());
                    }
                });


    }

页面

<Button
        android:id="@+id/bt_5"
        android:text="地理围栏"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

后台

 private Button bt5;
 bt5 = findViewById(R.id.bt_5);
        bt5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                geographicalFunction();
            }
        });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值