从用户当前位置Android显示半径10公里的用户

时间:2017-12-20 04:56:21

标签: android gps location appserver

我有一个要求,我想获取用户的当前位置,并根据用户的当前位置,我想从应用服务器获取其他用户的信息,并希望显示它们在列表中。用户应在半径5或10公里范围内 我从服务器中获取用户数据,在应用程序中显示它,但我想在该特定半径内显示。 任何帮助都很明显

2 个答案:

答案 0 :(得分:1)

您需要使用Geofences,请按照以下步骤确定您想要的结果。

让我们看看它是如何运作的。

地理围栏结合了用户对当前位置的了解以及用户对可能感兴趣的位置的接近度的意识。要标记感兴趣的位置,请指定其纬度和经度。要调整位置的接近度,请添加半径。 纬度,经度和半径定义地理围栏,围绕感兴趣的位置创建圆形区域或围栏

您可以拥有多个有效地理围栏,每个设备用户的限制为100。

enter image description here

现在,让我们看看我们如何在我们的应用程序中使用它,

设置地理围栏监控

请求地理围栏监控的第一步是请求必要的权限。要使用地理围栏,您的应用必须申请ACCESS_FINE_LOCATION。要请求此权限,请将以下元素添加为应用清单中<manifest>元素的子元素:

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

如果要使用IntentService侦听地理围栏转换,请添加指定服务名称的元素。此元素必须是<application>元素的子元素:

<application
   android:allowBackup="true">
   ...
   <service android:name=".GeofenceTransitionsIntentService"/>
<application/>

要访问位置API,您需要创建Geofencing客户端的实例。要了解如何连接您的客户:

private GeofencingClient mGeofencingClient;

// ...

mGeofencingClient = LocationServices.getGeofencingClient(this);

创建并添加Geofences

  

注意:在单用户设备上,每个地图限制为100个   应用程序。对于多用户设备,限制为每个应用每个100个地理围栏   设备用户。

  • 创建地理围栏对象

首先,使用Geofence.Builder创建地理围栏,为地理围栏设置所需的半径,持续时间和过渡类型。例如,要填充名为mGeofenceList的列表对象:

 mGeofenceList.add(new Geofence.Builder()
    // Set the request ID of the geofence. This is a string to identify this
    // geofence.
    .setRequestId(entry.getKey())

    .setCircularRegion(
            entry.getValue().latitude,
            entry.getValue().longitude,
            Constants.GEOFENCE_RADIUS_IN_METERS
    )
    .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
    .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER |
            Geofence.GEOFENCE_TRANSITION_EXIT)
    .build());

指定地理围栏和初始触发器

以下代码段使用GeofencingRequest类及其嵌套的GeofencingRequestBuilder类来指定要监控的地理围栏以及设置触发相关地理围栏事件的方式:

private GeofencingRequest getGeofencingRequest() {
    GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
    builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
    builder.addGeofences(mGeofenceList);
    return builder.build();
}

定义地理围栏过渡的意图

从位置服务发送的Intent可以触发您应用中的各种操作,但您不应该让它启动活动或片段,因为组件应该只在响应用户操作时才可见。在许多情况下,IntentService是处理意图的好方法。 IntentService可以发布通知,执行长时间运行的后台工作,向其他服务发送意图或发送广播意图。以下代码段显示了如何定义启动PendingIntentIntentService

public class MainActivity extends AppCompatActivity {

    // ...

    private PendingIntent getGeofencePendingIntent() {
        // Reuse the PendingIntent if we already have it.
        if (mGeofencePendingIntent != null) {
            return mGeofencePendingIntent;
        }
        Intent intent = new Intent(this, GeofenceTransitionsIntentService.class);
        // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when
        // calling addGeofences() and removeGeofences().
        mGeofencePendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.
                FLAG_UPDATE_CURRENT);
        return mGeofencePendingIntent;
    }

添加地理围栏

要添加地理围栏,请使用GeofencingClient.addGeofences()方法。提供GeofencingRequest对象和PendingIntent。以下代码段演示了如何处理结果:

mGeofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences added
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to add geofences
                // ...
            }
        });

处理地理围栏过渡

  

注意:在Android 8.0(API级别26)及更高版本上,如果应用程序在监控地理围栏时在后台运行,则设备   每隔几分钟响应地理围栏事件。要学习如何   使您的应用适应这些响应限制,请参阅背景位置   限制。

public class GeofenceTransitionsIntentService extends IntentService {
    // ...
    protected void onHandleIntent(Intent intent) {
        GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
        if (geofencingEvent.hasError()) {
            String errorMessage = GeofenceErrorMessages.getErrorString(this,
                    geofencingEvent.getErrorCode());
            Log.e(TAG, errorMessage);
            return;
        }

        // Get the transition type.
        int geofenceTransition = geofencingEvent.getGeofenceTransition();

        // Test that the reported transition was of interest.
        if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
                geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {

            // Get the geofences that were triggered. A single event can trigger
            // multiple geofences.
            List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();

            // Get the transition details as a String.
            String geofenceTransitionDetails = getGeofenceTransitionDetails(
                    this,
                    geofenceTransition,
                    triggeringGeofences
            );

            // Send notification and log the transition details.
            sendNotification(geofenceTransitionDetails);
            Log.i(TAG, geofenceTransitionDetails);
        } else {
            // Log the error.
            Log.e(TAG, getString(R.string.geofence_transition_invalid_type,
                    geofenceTransition));
        }
    }

停止地理围栏监控

mGeofencingClient.removeGeofences(getGeofencePendingIntent())
        .addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                // Geofences removed
                // ...
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Failed to remove geofences
                // ...
            }
        });

答案 1 :(得分:1)

你应该根据纬度和经度在服务器上实现逻辑并返回数据