如何解决使用多位置地理围栏
我使用了这段代码
(https://github.com/trulymittal/Geofencing)
但是我想在启动时将地理围栏再做一个固定标记,并再使用一个地理围栏。
所以我修改了这段代码(MapsActivity.java),
package com.example.geofencing;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.app.PendingIntent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.google.android.gms.location.Geofence;
import com.google.android.gms.location.GeofencingClient;
import com.google.android.gms.location.GeofencingRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import java.util.ArrayList;
import java.util.List;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private static final String TAG = "MapsActivity";
private GoogleMap mMap;
private GeofencingClient geofencingClient;
private GeofenceHelper geofenceHelper;
private float GEOFENCE_RADIUS = 20;
private String GEOFENCE_ID = "SOME_GEOFENCE_ID";
private int FINE_LOCATION_ACCESS_REQUEST_CODE = 10001;
private int BACKGROUND_LOCATION_ACCESS_REQUEST_CODE = 10002;
private List<LatLng> latLng;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
geofencingClient = LocationServices.getGeofencingClient(this);
geofenceHelper = new GeofenceHelper(this);
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines,add listeners or move the camera. In this case,* we just add a marker near Sydney,Australia.
* If Google Play services is not installed on the device,the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//move the camera to the starting point
LatLng latLng_start = new LatLng(37.462749,126.910311);
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng_start,16));
latLng = new ArrayList<>();
latLng.add(new LatLng(38.462349,123.909955));
latLng.add(new LatLng(38.463194,123.911317));
latLng.add(new LatLng(38.462720,123.910768));
latLng.add(new LatLng(38.462743,123.910317));
for (LatLng i : latLng) {
addMarker(i);
addCircle(i,GEOFENCE_RADIUS);
addGeofence(i,GEOFENCE_RADIUS);
}
// for (int i = 0; i < markerLocation.length; i++) {
// LatLng latLng = new LatLng(markerLocation[i][0],markerLocation[i][1]);
// addMarker(latLng);
// addCircle(latLng,GEOFENCE_RADIUS);
// addGeofence(latLng,GEOFENCE_RADIUS);
// }
enableuserLocation();
}
private void enableuserLocation() {
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
mMap.setMyLocationEnabled(true);
} else {
//Ask for permission
if (ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)) {
//We need to show user a dialog for displaying why the permission is needed and then ask for the permission...
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},FINE_LOCATION_ACCESS_REQUEST_CODE);
} else {
ActivityCompat.requestPermissions(this,FINE_LOCATION_ACCESS_REQUEST_CODE);
}
}
}
private void addMarker(LatLng latLng) {
MarkerOptions markerOptions = new MarkerOptions().position(latLng);
mMap.addMarker(markerOptions);
}
private void addCircle(LatLng latLng,float radius) {
CircleOptions circleOptions = new CircleOptions();
circleOptions.center(latLng);
circleOptions.radius(radius);
circleOptions.strokeColor(Color.argb(255,255,0));
circleOptions.fillColor(Color.argb(64,0));
circleOptions.strokeWidth(4);
mMap.addCircle(circleOptions);
}
private void addGeofence(LatLng latLng,float radius) {
Geofence geofence = geofenceHelper.getGeofence(GEOFENCE_ID,latLng,radius,Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_DWELL | Geofence.GEOFENCE_TRANSITION_EXIT);
GeofencingRequest geofencingRequest = geofenceHelper.getGeofencingRequest(geofence);
PendingIntent pendingIntent = geofenceHelper.getPendingIntent();
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// Todo: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions,and then overriding
// public void onRequestPermissionsResult(int requestCode,String[] permissions,// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
geofencingClient.addGeofences(geofencingRequest,pendingIntent)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG,"onSuccess: Geofence Added...");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String errorMessage = geofenceHelper.getErrorString(e);
Log.d(TAG,"onFailure: " + errorMessage);
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
if (requestCode == FINE_LOCATION_ACCESS_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//We have the permission
mMap.setMyLocationEnabled(true);
} else {
//We do not have the permission..
}
}
if (requestCode == BACKGROUND_LOCATION_ACCESS_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//We have the permission
Toast.makeText(this,"You can add geofences...",Toast.LENGTH_SHORT).show();
} else {
//We do not have the permission..
Toast.makeText(this,"Background location access is neccessary for geofences to trigger...",Toast.LENGTH_SHORT).show();
}
}
}
}
结果,启动应用程序时,地图上添加了四个标记和Circles(我添加了fout latLng)!
但是只有最后一个latLng可以使用地理围栏功能 (LatLng(38.462743,123.910317),例如进入该位置时发出的警报),
其他人无法使用地理围栏功能。
我想让其他位置都能正常使用地理围栏功能,大声笑
Plz。帮帮我:(
解决方法
您正在为每个LatLng坐标创建一个新的Geofencing请求。相反,您应该创建一个包含所有要监视的地理围栏列表的地理围栏请求:
创建一个函数来构建您的地理围栏请求:
private GeofencingRequest getGeofencingRequest() {
ArrayList<Geofence> geofenceList = new ArrayList<>();
// Iterate through your LatLng(s) to build the Geofence list
for(LatLng coordinate: latLngList){
// Set up each Geofence with your corresponding values
geofenceList.add(new Geofence.Builder()
.setRequestId("My Geofence ID") // A string to identify this geofence
.setCircularRegion(coordinate.latitude,coordinate.longitude,Constants.GEOFENCE_LARGE_RADIUS_IN_METERS)
.setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER)
.build()
);
}
GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
// The INITIAL_TRIGGER_ENTER flag indicates that geofencing service should trigger a
// GEOFENCE_TRANSITION_ENTER notification when the geofence is added and if the device
// is already inside that geofence.
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
// Add the geofences to be monitored by geofencing service using the list we created.
builder.addGeofences(geofenceList);
return builder.build();
}
您应该将addGeofence()更改为如下所示:
private void addGeofences() {
PendingIntent pendingIntent = geofenceHelper.getPendingIntent();
if (ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions,and then overriding
// public void onRequestPermissionsResult(int requestCode,String[] permissions,// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
// Pass the request built with the getGeofencingRequest() function to the Geofencing Client
geofencingClient.addGeofences(getGeofencingRequest(),pendingIntent)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG,"onSuccess: Geofence Added...");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String errorMessage = geofenceHelper.getErrorString(e);
Log.d(TAG,"onFailure: " + errorMessage);
}
});
}
最后,在您的onMapReady()内部:
latLngList = new ArrayList<>();
latLngList.add(new LatLng(38.462349,123.909955));
latLngList.add(new LatLng(38.463194,123.911317));
latLngList.add(new LatLng(38.462720,123.910768));
latLngList.add(new LatLng(38.462743,123.910317));
addGeofences(); // Add all of your geofences to the client
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。