Получить местоположение GPS в широковещательном приемнике / или сервис для передачи данных широковещательного приемника

#android #service #broadcastreceiver

#Android #Обслуживание #broadcastreceiver

Вопрос:

Я новичок в Android.
Я хочу получить местоположение GPS в широковещательном приемнике, но он показывает ошибку.

Мой код :

 public void onReceive(Context context, Intent intent) {
    LocationManager locManager = (LocationManager) 
            getSystemService(Context.LOCATION_SERVICE);
    // errors in getSystemService method
    LocationListener locListener = new MyLocationListener();
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
            locListener);
    Location loc = locManager
            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
    Log.d(" **location**", " location"   loc.getLatitude());
}
  

Вопросы :

  1. Возможно ли получить данные о местоположении GPS в широковещательном приемнике?
  2. Другим альтернативным способом, который я пробовал до сих пор, было использование сервиса, который вызывается широковещательным приемником. Сервис может получать данные GPS, но как я могу получить их в широковещательном приемнике?

Ответ №1:

да, оба они возможны.

ваш сервис с таймером для отправки запроса на приемник местоположения в определенные периоды времени:

 public class SrvPositioning extends Service {

    // An alarm for rising in special times to fire the
    // pendingIntentPositioning
    private AlarmManager alarmManagerPositioning;
    // A PendingIntent for calling a receiver in special times
    public PendingIntent pendingIntentPositioning;

    @Override
    public void onCreate() {
        super.onCreate();
        alarmManagerPositioning = (AlarmManager) 
                getSystemService(Context.ALARM_SERVICE);
        Intent intentToFire = new Intent(
                ReceiverPositioningAlarm.ACTION_REFRESH_SCHEDULE_ALARM);
        intentToFire.putExtra(ReceiverPositioningAlarm.COMMAND,
                ReceiverPositioningAlarm.SENDER_SRV_POSITIONING);
        pendingIntentPositioning = PendingIntent.getBroadcast(this, 0,
                intentToFire, 0);
    };

    @Override
    public void onStart(Intent intent, int startId) {
        try {
            long interval = 60 * 1000;
            int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP;
            long timetoRefresh = SystemClock.elapsedRealtime();
            alarmManagerPositioning.setInexactRepeating(alarmType,
                    timetoRefresh, interval, pendingIntentPositioning);
        } catch (NumberFormatException e) {
            Toast.makeText(this,
                    "error running service: "   e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(this,
                    "error running service: "   e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public void onDestroy() {
        this.alarmManagerPositioning.cancel(pendingIntentPositioning);
        ReceiverPositioningAlarm.stopLocationListener();
    }
}
  

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

 public class ReceiverPositioningAlarm extends BroadcastReceiver {

    public static final String COMMAND = "SENDER";
    public static final int SENDER_ACT_DOCUMENT = 0;
    public static final int SENDER_SRV_POSITIONING = 1;
    public static final int MIN_TIME_REQUEST = 5 * 1000;
    public static final String ACTION_REFRESH_SCHEDULE_ALARM =
                    "org.mabna.order.ACTION_REFRESH_SCHEDULE_ALARM";
    private static Location currentLocation;
    private static Location prevLocation;
    private static Context _context;
    private String provider = LocationManager.GPS_PROVIDER;
    private static Intent _intent;
    private static LocationManager locationManager;
    private static LocationListener locationListener = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras){
            try {
                String strStatus = "";
                switch (status) {
                case GpsStatus.GPS_EVENT_FIRST_FIX:
                    strStatus = "GPS_EVENT_FIRST_FIX";
                    break;
                case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
                    strStatus = "GPS_EVENT_SATELLITE_STATUS";
                    break;
                case GpsStatus.GPS_EVENT_STARTED:
                    strStatus = "GPS_EVENT_STARTED";
                    break;
                case GpsStatus.GPS_EVENT_STOPPED:
                    strStatus = "GPS_EVENT_STOPPED";
                    break;
                default:
                    strStatus = String.valueOf(status);
                    break;
                }
                Toast.makeText(_context, "Status: "   strStatus,
                        Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onProviderEnabled(String provider) {}

        @Override
        public void onProviderDisabled(String provider) {}

        @Override
        public void onLocationChanged(Location location) {
            try {
                Toast.makeText(_context, "***new location***",
                        Toast.LENGTH_SHORT).show();
                gotLocation(location);
            } catch (Exception e) {
            }
        }
    };

    // received request from the calling service
    @Override
    public void onReceive(final Context context, Intent intent) {
        Toast.makeText(context, "new request received by receiver",
                Toast.LENGTH_SHORT).show();
        _context = context;
        _intent = intent;
        locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        if (locationManager.isProviderEnabled(provider)) {
            locationManager.requestLocationUpdates(provider,
                    MIN_TIME_REQUEST, 5, locationListener);
            Location gotLoc = locationManager
                    .getLastKnownLocation(provider);
            gotLocation(gotLoc);
        } else {
            Toast t = Toast.makeText(context, "please turn on GPS",
                    Toast.LENGTH_LONG);
            t.setGravity(Gravity.CENTER, 0, 0);
            t.show();
            Intent settinsIntent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            settinsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            _context.startActivity(settinsIntent);
        }
    }

    private static void gotLocation(Location location) {
        prevLocation = currentLocation == null ? null : new Location(
                currentLocation);
        currentLocation = location;
        if (isLocationNew()) {
            OnNewLocationReceived(location);
            Toast.makeText(_context, "new location saved",
                    Toast.LENGTH_SHORT).show();
            stopLocationListener();
        }
    }

    private static boolean isLocationNew() {
        if (currentLocation == null) {
            return false;
        } else if (prevLocation == null) {
            return true;
        } else if (currentLocation.getTime() == prevLocation.getTime()) {
            return false;
        } else {
            return true;
        }
    }

    public static void stopLocationListener() {
        locationManager.removeUpdates(locationListener);
        Toast.makeText(_context, "provider stoped", Toast.LENGTH_SHORT)
                .show();
    }

    // listener ----------------------------------------------------
    static ArrayList<OnNewLocationListener> arrOnNewLocationListener = 
            new ArrayList<OnNewLocationListener>();

    // Allows the user to set a OnNewLocationListener outside of this class
    // and react to the event.
    // A sample is provided in ActDocument.java in method: startStopTryGetPoint
    public static void setOnNewLocationListener(
            OnNewLocationListener listener) {
        arrOnNewLocationListener.add(listener);
    }

    public static void clearOnNewLocationListener(
            OnNewLocationListener listener) {
        arrOnNewLocationListener.remove(listener);
    }

    // This function is called after the new point received
    private static void OnNewLocationReceived(Location location) {
        // Check if the Listener was set, otherwise we'll get an Exception
        // when we try to call it
        if (arrOnNewLocationListener != null) {
            // Only trigger the event, when we have any listener
            for (int i = arrOnNewLocationListener.size() - 1; i >= 0; i--) {
                arrOnNewLocationListener.get(i).onNewLocationReceived(
                        location);
            }
        }
    }
}
  

интерфейс для прослушивания:

 import android.location.Location;

public interface OnNewLocationListener {
    public abstract void onNewLocationReceived(Location location);
}
  

в вашей деятельности за получение всего одного балла:

 protected void btnGetPoint_onClick() {
    Intent intentToFire = new Intent(
            ReceiverPositioningAlarm.ACTION_REFRESH_SCHEDULE_ALARM);
    intentToFire.putExtra(ReceiverPositioningAlarm.COMMAND,
            ReceiverPositioningAlarm.SENDER_ACT_DOCUMENT);
    sendBroadcast(intentToFire);
    OnNewLocationListener onNewLocationListener = new OnNewLocationListener() {

        @Override
        public void onNewLocationReceived(Location location) {
            // use your new location here then stop listening
            ReceiverPositioningAlarm.clearOnNewLocationListener(this);
        }
    };
    // start listening for new location
    ReceiverPositioningAlarm
            .setOnNewLocationListener(onNewLocationListener);
}
  

Редактировать:

если вы хотите запустить сервис в своей деятельности:

 this.startService(new Intent(this, SrvPositioning.class));
  

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

Редактировать

Добавьте следующие строки в манифест

 <service
            android:name="org.mabna.order.services.SrvPositioning"
            android:enabled="true" />

<receiver android:name="org.mabna.order.receivers.ReceiverPositioningAlarm" >

            <!-- this Broadcast Receiver only listens to the following intent -->
            <intent-filter>
                <action android:name="org.mabna.order.ACTION_REFRESH_SCHEDULE_ALARM" />
            </intent-filter>
        </receiver>
  

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

1. Просто интересно, вы измерили, сколько батареи расходуется при этом подходе (обновления за 1 минуту), и всегда ли у вас активен LocationListener (не для GPS, а для сети).).

2. Большое спасибо. Еще один вопрос.. Если я не запустил сервис с какого-либо действия, то служба автоматически запустится по истечении заданного времени или расстояния. ограничения??

3. Я думаю, вам нужно запустить сервис в Activity. Поиск по нему 🙂

4. и, пожалуйста, скажите мне еще одну вещь… что вы подразумеваете под «в вашей деятельности для получения только одного балла:»…?!? заголовок вашего 4-го блока кодирования…

5. напишите этот код в своем действии, чтобы получить одно очко от слушателя. речь идет об использовании слушателя.

Ответ №2:

Из BroadcastReceiver я также не смог запустить диспетчер местоположений. Итак, я запустил службу в BroadcastReceiver, и в этой службе я манипулировал Location Manager. Я думаю, что нашел это решение в документации по разработке Android. Вы также можете запустить действие вместо сервиса.

Вот код переключения на сервис в BroadcastReceiver:

напишите это в onReceive методе

     Intent serviceIntent = new Intent(context,MyService.class);
    serviceIntent.putExtra("locateRequest", "locateRequest"); // if you want pass parameter from here to service
    serviceIntent.putExtra("queryDeviceNumber", results[1]);
    context.startService(serviceIntent); //start service for get location
  

Ответ №3:

ШАГ 1: Открыть AndroidManifest.xml и добавьте широковещательный приемник.

 <receiver
        android:name=".Util.GpsConnectorReceiver"
        android:enabled="true">
        <intent-filter>
            <!-- Intent filters for broadcast receiver -->
             <action android:name="android.location.PROVIDERS_CHANGED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>`
  

ШАГ 2: создайте действие с темой диалога:

 <activity
            android:name=".Activity.ActivityDialogGps"
            android:theme="@style/AppTheme.Dark.Dialog"></activity>
  

ШАГ 3:
Создайте класс BroadcastReceiver с именем GpsConnectorReceiver

 public class GpsConnectorReceiver extends BroadcastReceiver {

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

   if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
        Intent pushIntent = new Intent(context, ConnectivityCheck .class);
                context.startService(pushIntent);
    }
}}
  

ШАГ 4: создайте другой класс сервиса с именем ConnectivityCheck :

 public class ConnectivityCheck extends Service {

@Override
public void onCreate() {
    super.onCreate();
    if (!checkConnection()) {
        Toast.makeText(context, "off", Toast.LENGTH_LONG).show();
        Intent dialogIntent = new Intent(this, ActivityDialogInternet.class);
        dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(dialogIntent);
    }
    stopSelf();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

private boolean checkConnection() {
     final LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    return manager.isProviderEnabled(LocationManager.GPS_PROVIDER);

}}
  

ШАГ 5: создайте действие с именем ActivityDialogGps

 public class ActivityDialogGps extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog_gps);
}}
  

ШАГ 6: Когда GPS-соединение отключено, вызывается ActivityDialogGps и отображается диалоговое окно: