El programador escribió una aplicación de mayordomo de viajes en 10 minutos, y su novia usó una llamada directa y reflexiva.

1

" Oye, ¿sabes? Escuché que la velocidad de caída de las flores de cerezo es de cinco centímetros por segundo " .

Al escuchar a A Zhen recitar de nuevo esta línea clásica, A Qiang, un programador poco sensible al período de floración en el mundo natural, también recibió la señal de que "las flores de cerezo están floreciendo".

Las flores de cerezo en primavera no se pueden perder. Ver las flores de cerezo es una acción de registro de primavera escrita en los valores de A Zhen. Durante la videollamada, A Zhen planeó un largo viaje: volvería a su alma mater, la Universidad de Wuhan, para ver los cerezos en flor el fin de semana. Pero esta vez, Aqiang, que estaba de viaje de negocios, no pudo acompañarla.

Así que Aqiang todavía sacó su capacidad para comer, escribió su cuidadoso cuidado en una aplicación inteligente de mayordomo de viaje y acompañó a Azhen a Wuhan para ver los cerezos en flor . Incluso si ella no está cerca, bríndele una experiencia de viaje meticulosa:

  1. No es necesario recordar el itinerario de salida: recuérdele el tiempo de viaje antes de la salida para que nunca se pierda itinerarios importantes;
  2. El tiempo en el destino se conoce temprano: de acuerdo con el pronóstico del tiempo en el destino, se darán consejos sobre el equipo de viaje y la ropa con anticipación;
  3. El juego de estrategia es totalmente recomendable: déjelo ahorrar el tiempo de hacer la estrategia, llegar al destino e impulsar la estrategia de juego requerida y las políticas preferenciales ...

Por encima de las capacidades de servicio de viaje inteligente de ama de llaves, con la percepción del tiempo de servicio consciente del contexto de Huawei (kit de concientización) y servicios basados ​​en la ubicación y con conocimiento del clima (kit de ubicación), capacidades de geo-cercado y servicios de empuje (kit de empuje) bendición, implementación y No es difícil .

Ejemplo de efecto

Haga clic en el video para ver un ejemplo

Explicación del principio

Los servicios sensibles al contexto pueden percibir la hora actual del usuario, la ubicación, el estado de la actividad, el estado de los auriculares, las condiciones climáticas, la luz ambiental, el estado de la conexión del vehículo, el estado de la conexión de la baliza y otros escenarios, y se pueden combinar libremente a través de la capacidad de la cerca que puede estar funcionando permanentemente. en el fondo Estas habilidades de percepción construyen una valla combinada.

El servicio de posicionamiento adopta GNSS, Wi-Fi, estación base y otros modos de posicionamiento híbridos para el posicionamiento, que pueden obtener información de posición de forma rápida y precisa y realizar las capacidades del servicio de posicionamiento global.

El servicio push es una plataforma de envío de mensajes proporcionada por Huawei para desarrolladores, que establece un canal de envío de mensajes desde la nube al terminal. Los desarrolladores pueden enviar mensajes a los terminales de los usuarios en tiempo real mediante la integración de Push Kit.

Código de combate

1. Servicios integrados sensibles al contexto

 Preparación para el desarrollo

La integración de servicios sensibles al contexto requiere los siguientes 3 pasos clave. Puede consultar la documentación de Huawei Developer Alliance

1. Configuración de AppGallery Connect

2. Integrar HMS Awareness SDK

3. Configure la secuencia de comandos ofuscada

https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/awareness-preparation?ha_source=hms1

Pasos clave en el desarrollo de código

1. Especifique los permisos en el manifiesto:

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

2. Lograr obtener información meteorológica por nombre de ciudad:

String city = edCity.getText().toString();
if (city != null && !city.equals("")) {
    WeatherPosition weatherPosition = new WeatherPosition();
    weatherPosition.setCity(city);
    //传入指明传入地址用的语言类型,例如“zh_CN”、“en_US”等,“语言码_国家码”的格式。
    weatherPosition.setLocale("zh_CN");
// 获取Awareness Kit的“Capture Client”,调用天气查询能力
    Awareness.getCaptureClient(getApplicationContext()).getWeatherByPosition(weatherPosition)
            .addOnSuccessListener(new OnSuccessListener<WeatherStatusResponse>() {
                @Override
                public void onSuccess(WeatherStatusResponse weatherStatusResponse) {
                    // 处理返回的天气数据
                    WeatherStatus weatherStatus = weatherStatusResponse.getWeatherStatus();
                    WeatherSituation weatherSituation = weatherStatus.getWeatherSituation();
                    Situation situation = weatherSituation.getSituation();
                    String weather;
                    // 将天气id与天气名称匹配
                    weather = getApplicationContext().getResources().getStringArray(R.array.cnWeather)[situation.getCnWeatherId()];
                    // 更新UI
                    ((TextView) findViewById(R.id.tv_weather)).setText(weather);
                    ((TextView) findViewById(R.id.tv_windDir)).setText(situation.getWindDir());
                    ((TextView) findViewById(R.id.tv_windSpeed)).setText(situation.getWindSpeed() + " km/h");
                    ((TextView) findViewById(R.id.tv_temperature)).setText(situation.getTemperatureC() + "℃");
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(Exception e) {

        }
    });
}

3. Después de darse cuenta del recordatorio de tiempo e ingresar el destino, recibe el mensaje push:
(1) Debido a que necesita recibir notificaciones incluso cuando la aplicación se apaga, debe registrarse para la transmisión estática:
En el manifiesto:

<receiver android:name=".BarrierReceiver">
<intent-filter>
    <action android:name="com.test.awarenessdemo.TimeBarrierReceiver.BARRIER_RECEIVER_ACTION"/>
</intent-filter>
</receiver>

 En el código java:

Intent intent = new Intent();
intent.setComponent(new ComponentName(MainActivity.this, BarrierReceiver.class));
mPendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

(2) Defina la Barrera de tiempo (cerca) y su etiqueta correspondiente Etiqueta, y luego agregue Barrera:

// 获取输入的时间
String timeHour = edTimeHour.getText().toString();
String timeMinute = edTimeMinute.getText().toString();
int hour = 0;
int minute = 0;
if (!timeHour.equals("")) {
    hour = Integer.parseInt(timeHour);
    if (!timeMinute.equals("")) {
        minute = Integer.parseInt(timeMinute);
    }
}
long oneHourMilliSecond = 60 * 60 * 1000L;
long oneMinuteMilliSecond = 60 * 1000L;
// 定义"duringPeriodOfDay"围栏,在指定时区的指定时间段内发送通知
AwarenessBarrier periodOfDayBarrier = TimeBarrier.duringPeriodOfDay(TimeZone.getDefault(),
        // 这里设置的是提前2小时通知
        (hour - 2) * oneHourMilliSecond + minute * oneMinuteMilliSecond,
        hour * oneHourMilliSecond + minute * oneMinuteMilliSecond);

String timeBarrierLabel = "period of day barrier laber";
// 定义更新围栏的请求
BarrierUpdateRequest.Builder builder = new BarrierUpdateRequest.Builder();
BarrierUpdateRequest request = builder.addBarrier(timeBarrierLabel, periodOfDayBarrier, mPendingIntent).build();
Awareness.getBarrierClient(getApplicationContext()).updateBarriers(request)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(Exception e) {
            }
        });

(3) Defina la barrera geográfica (valla) y su etiqueta correspondiente Etiqueta, y luego agregue la barrera:

if (city != null && !city.equals("")) {
    //根据城市名称获取城市经纬度,这里是从内部文件中获取
    String data = cityMap.get(city);
    if (data != null){
        int flag = data.indexOf(",");
        double latitude = Double.parseDouble(data.substring(flag+1));
        double longitude = Double.parseDouble(data.substring(0,flag));
        double radius = 50;
        long timeOfDuration = 5000;
        // 定义"stay"围栏,在进入指定区域并驻留超过指定时间后触发围栏事件上报
        AwarenessBarrier stayBarrier = LocationBarrier.stay(latitude, longitude, radius, timeOfDuration);
        String stayBarrierLabel = "stay barrier label";
        // 定义更新围栏的请求
        BarrierUpdateRequest.Builder builder = new BarrierUpdateRequest.Builder();
        BarrierUpdateRequest request = builder.addBarrier(stayBarrierLabel, stayBarrier, mPendingIntent).build();
        Awareness.getBarrierClient(getApplicationContext()).updateBarriers(request)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(Exception e) {
                    }
                });
    }
}

(4) Defina el receptor de transmisión, que se utiliza para monitorear el evento de barrera, y realice el procesamiento comercial de la aplicación después de recibir el evento:

class BarrierReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        BarrierStatus barrierStatus = BarrierStatus.extract(intent);
        String label = barrierStatus.getBarrierLabel();
        int barrierPresentStatus = barrierStatus.getPresentStatus();
        String city = intent.getStringExtra("city");
        switch (label) {
            case DURING_PERIOD_OF_DAT_BARRIER_LABEL:
                if (barrierPresentStatus == BarrierStatus.TRUE) {

                    initNotification(context,"1","time_channel","行程提醒","离出发还剩2小时");
                } else if (barrierPresentStatus == BarrierStatus.FALSE) {
                    showToast(context, "It's not between ");
                } else {
                    showToast(context, "The time status is unknown.");
                }
                break;

            case STAY_BARRIER_LABEL:
                if (barrierPresentStatus == BarrierStatus.TRUE) {

                    initNotification(context,"2","area_channel","欢迎来到"+city,"查看旅行攻略");
                } else if (barrierPresentStatus == BarrierStatus.FALSE) {
                    showToast(context,"You are not staying in the area set by locationBarrier" +
                            " or the time of duration is not enough.");
                } else {
                    showToast(context, "The location status is unknown.");
                }
                break;
        }
    }
}

2. Impulso de información basada en la ubicación

 Preparación para el desarrollo

1. Agregue el
archivo build.gradle de nivel de proyecto AndroidStudio del almacén maven de Huawei al gradle a nivel del proyecto y agregue las siguientes direcciones de maven de forma incremental:

buildscript {
    repositories {
        maven { url 'http://developer.huawei.com/repo/'}
    }
dependencies {
        ...
        // 增加agcp配置。
        classpath 'com.huawei.agconnect:agcp:1.4.2.300'
    }
}allprojects {
    repositories {
        maven { url 'http://developer.huawei.com/repo/'}
    }
}

2. Agregue las dependencias del SDK a build.gradle a nivel de la aplicación

dependencies {
    implementation 'com.huawei.hms:location:5.0.2.300'
    implementation 'com.huawei.hms:push: 5.0.2.301'
}

Descripción de los pasos clave

 1. Declare los permisos del sistema en el archivo AndroidManifest.xml.
Debido a que el servicio de ubicación de Huawei usa múltiples modos de posicionamiento híbrido como GNSS, Wi-Fi y estaciones base para el posicionamiento, debe usar la red, permisos de ubicación precisos y permisos de ubicación aproximada Si necesita aplicar El programa también tiene la capacidad de localizar continuamente cuando se ejecuta en segundo plano, y es necesario solicitar el permiso ACCESS_BACKGROUND_LOCATION en el archivo de manifiesto:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="com.huawei.hms.permission.ACTIVITY_RECOGNITION" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />

Nota: Como ACCESS_FINE_LOCATION, WRITE_EXTERNAL_STORAGE y READ_EXTERNAL_STORAGE son permisos de sistema peligrosos, es necesario solicitar estos permisos de forma dinámica. Si los permisos son insuficientes, el Servicio de ubicación se negará a habilitar la ubicación para la aplicación.

2. Cree una valla de activación
Primero cree una valla / grupo de valla según sea necesario y complete los parámetros relevantes.

LocationSettingsRequest.Builder builders = new LocationSettingsRequest.Builder();
builders.addLocationRequest(mLocationRequest);
LocationSettingsRequest locationSettingsRequest = builders.build();
// Before requesting location update, invoke checkLocationSettings to check device settings.
Task<LocationSettingsResponse> locationSettingsResponseTasks = mSettingsClient.checkLocationSettings(locationSettingsRequest);
locationSettingsResponseTasks.addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        Log.i(TAG, "check location settings success");
        mFusedLocationProviderClient
                .requestLocationUpdates(mLocationRequest, mLocationCallbacks, Looper.getMainLooper())
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        LocationLog.i(TAG, "geoFence onSuccess");
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(Exception e) {
                        LocationLog.e(TAG,
                                "geoFence onFailure:" + e.getMessage());
                    }
                });
    }
})

3. Configure para activar notificaciones
automáticas . Después de que onReceive de GeoFenceBroadcastReceiver recibe la notificación de que la cerca se activó correctamente, se enviarán notificaciones automáticas y las notificaciones se recibirán y mostrarán en la barra de notificaciones.

if (geofenceData != null) {
    int errorCode = geofenceData.getErrorCode();
    int conversion = geofenceData.getConversion();
    ArrayList<Geofence> list = (ArrayList<Geofence>) geofenceData.getConvertingGeofenceList();
    Location myLocation = geofenceData.getConvertingLocation();
    boolean status = geofenceData.isSuccess();
    sb.append("errorcode: " + errorCode + next);
    sb.append("conversion: " + conversion + next);
    if (list != null) {
        for (int i = 0; i < list.size(); i++) {
            sb.append("geoFence id :" + list.get(i).getUniqueId() + next);
        }
    }
    if (myLocation != null) {
        sb.append("location is :" + myLocation.getLongitude() + " " + myLocation.getLatitude() + next);
    }
    sb.append("is successful :" + status);
    LocationLog.i(TAG, sb.toString());
    Toast.makeText(context, "" + sb.toString(), Toast.LENGTH_LONG).show();
    //
    new PushSendUtils().netSendMsg(sb.toString());
}

Nota: Después de que esta valla de código se haya creado con éxito, activará dos devoluciones de llamada, conversión: 1 y 4, que representan respectivamente la devolución de llamada de activación de entrada y la devolución de llamada de activación residente una vez. El significado de la entrada de activación 7 ingresada en el código significa que la devolución de llamada incluye todas las situaciones, es decir, entrar, permanecer, salir y otras situaciones.

 

>> Visite el sitio web oficial de Huawei Developer Alliance para obtener más información al respecto

>> Obtenga documentos de orientación de desarrollo

>> Dirección del almacén de código abierto del servicio móvil de Huawei: GitHub , Gitee

Síganos y conozca la información técnica más reciente de los servicios móviles de Huawei por primera vez ~

Supongo que te gusta

Origin blog.csdn.net/HUAWEI_HMSCore/article/details/114700315
Recomendado
Clasificación