Оповещение о приближении не работает

#android

#Android

Вопрос:

Я знаю, что есть много подобных вопросов, но ни один из них, похоже, не подходит для меня, и это немного расстраивает, потому что у меня нет обратной связи о том, что происходит. Вот мой код

 package com.example;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.LocationManager;
import android.media.RingtoneManager;
import android.net.Uri;

import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.Spinner;

public class InformMe extends Activity implements OnClickListener{

private static final long EXPIRATION = -1;
private static final String PROXIMITY_ALERT = "com.example.PROXIMITY_ALERT";

private LocationManager locationManager;
private AttractionNearReceiver receiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_informme);

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    View btnAdd = findViewById(R.id.btn_set_inform);
    btnAdd.setOnClickListener(this);

    receiver = new AttractionNearReceiver();
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    float radius = Float.parseFloat(((EditText)findViewById(R.id.edit_radius)).getText().toString());

    addProximityAlert(41.8723889, 12.48018, radius);

}

private void addProximityAlert(double latitude, double longitude, float radius)
{
    Intent intent = new Intent(PROXIMITY_ALERT);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    locationManager.addProximityAlert(latitude, longitude, radius, EXPIRATION, pendingIntent);
}

@Override
protected void onResume() {
    super.onResume();

    IntentFilter filter = new IntentFilter(PROXIMITY_ALERT); 
    registerReceiver(receiver, filter);
}

@Override
protected void onPause() {
    super.onPause();

    unregisterReceiver(receiver);
}
}
  

И приемник

 package com.example;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;

public class AttractionNearReceiver extends BroadcastReceiver{

public static final int NOTIFICATION_ID = 1;

@Override
public void onReceive(Context context, Intent intent) {

    long[] vibratePatern = {0, 300, 200, 300, 200, 300};

    Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    Intent notificationIntent = new Intent(context, SeeAttractionOrComment.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, Intent.FLAG_ACTIVITY_NEW_TASK);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
                                            .setTicker("near you")
                                            .setContentText("Added by")
                                            .setContentTitle("beach")
                                            .setSmallIcon(R.drawable.beach) 
                                            .setAutoCancel(true)
                                            .setContentIntent(pendingIntent)
                                            .setSound(alarmSound)
                                            .setVibrate(vibratePatern);

    NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(NOTIFICATION_ID, notificationBuilder.build());
}
  

}

Никаких ошибок, никаких исключений, просто ничего. Я пробовал на эмуляторе и на реальном устройстве, но уведомление не приходит.

Кто-нибудь знает, почему? Спасибо

Ответ №1:

Как заявил @Gabe Sechan, вы указываете место, которое вам, вероятно, не нужно.

LocationManager.addProximityAlert нуждается в широте и долготе для правильной работы. Посмотрите документацию по Android:

http://developer.android.com/reference/android/location/LocationManager.html

public void addProximityAlert (double latitude, double longitude, float radius, long expiration, PendingIntent intent)

Примечание: Установите оповещение о приближении для местоположения, заданного позицией (широта, долгота) и заданным радиусом.

Вы могли бы использовать getLastKnowLocation, чтобы получить свою позицию через нужного поставщика, а затем вызвать addProximityAlert с полученными значениями.

public Location getLastKnownLocation (String provider)

Возвращает местоположение, указывающее данные из последнего известного исправления местоположения, полученного от данного поставщика.

Вот так:

Location lastKnownLocationGPS = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

addProximityAlert(lastKnownLocationGPS.getLatitude(), lastKnownLocationGPS.getLongitude(), radius);

Не забудьте проверить возврат null.

Комментарии:

1. Спасибо, но я прочитал документацию и объяснил выше, что координаты были 0,0 временными, но это все еще не работает…

2. Я не могу прокомментировать сообщение Гейба, но я хотел бы добавить, что если вы входите в регион и покидаете его очень быстро, вас могут не заметить. Примечание к документации Android: «Из-за приблизительного характера оценки местоположения, если устройство проходит через заданную область на короткое время, возможно, что намерение не будет запущено. Аналогично, намерение может быть запущено, если устройство проходит очень близко к заданной области, но фактически не входит в нее. » Это может быть проблемой в производственной среде (реальное устройство), поэтому будьте в курсе этого..

Ответ №2:

Вы добавляете оповещения о приближении для местоположения (0,0). Это было бы в Атлантическом океане. Предполагая, что вы не на круизном лайнере, это, вероятно, не то, что вы хотите.

Редактировать: вот рабочий код, который я использовал в прошлом для добавления сигнала тревоги. Не стесняйтесь адаптировать его.

 private int requestID = 0;

public void addProximityAlert(double latitude, double longitude, int radius, String category, Object data, ProximityListener listener) {
    Intent intent = new Intent(PROX_INTENT_NAME);
    intent.putExtra("latitude", latitude);
    intent.putExtra("longitude", longitude);

    LocationManager locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);

    //Request id parameter is not documented, but allows us to have multiple alerts outstanding so long as they are unique
    PendingIntent proximityIntent = PendingIntent.getBroadcast(mContext, requestID  , intent, 0);
    mAlerts.add(new AlertData(latitude, longitude, radius, category, data, listener, proximityIntent));
    locationManager.addProximityAlert(latitude, longitude, radius, 
                                       -1, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration 
                                       proximityIntent);
    IntentFilter filter = new IntentFilter(PROX_INTENT_NAME);  
    mContext.registerReceiver(proximityAlertReceiver, filter);

}
  

Комментарии:

1. Хорошо, это правда, я изменил это при попытке на эмуляторе, но я изменю это, это вносит путаницу. Но спасибо, что заметили. Что-нибудь еще?

2. Я добавил некоторый код, который я использовал в прошлом, чтобы сделать это, он был отлажен с помощью службы определения местоположения. Не стесняйтесь изменять его в соответствии с вашими потребностями

3. Тогда это ваша проблема — нет блокировки GPS, поэтому сигналы приближения не сработают. Выполняйте requestLocationUpdates, а не getLastKnownLocation. Кроме того, вам может потребоваться покинуть область и вернуться, она может не сработать, если начнется в радиусе.

4. Вам все равно нужно зарегистрироваться, чтобы кто-то использовал систему GPS и включил GPS-радио. Если вас не волнуют фактические обновления, игнорируйте их, ничего не делая в функции обновления. На самом деле вы не будете расходовать больше заряда батареи таким образом, его использует readio, а не небольшая вычислительная мощность.

5. ДА. GPS-радио требует много заряда аккумулятора. Отключено, если не требуется. Вот почему NETWORK_PROVIDER существует — для экономии энергии. Настройка GPS больше зависит от того, разрешено ли приложениям включать GPS-радио, на самом деле это не включает его.