Задача:
(Предполагая, что настройка «Местоположение»/GPS в настоящее время отключена), мне нужно, чтобы мое приложение постоянно прослушивало Настройка «Местоположение» должна быть включена. На этом этапе просто запустите действие.
Идеи:
Я думаю, что это все разные способы работы:
- LocationListener с использованием «onProviderEnabled»
- GpsStatusListener с использованием «onGpsStatusChanged» с «GPS_EVENT_STARTED»
- GpsProvider требует Satellite (чтобы определить, запускается ли он) или каким-то образом используйте константу/int «AVAILABLE» GpsProvider
- SettingInjectorService с помощью «ACTION_SERVICE_INTENT» (и/или) "ACTION_INJECTED_SETTING_CHANGED" с "onGetEnabled" или "isEnabled"
- Settings. Защищайте с помощью "LOCATION_MODE" != "LOCATION_MODE_OFF"
- a ContentObserver/ContentResolver
- Intent getAction (...)
- Некое «if/else»
Любые советы или ответы на любой из следующих вопросов очень приветствуются.
- Какая из приведенных выше идей будет лучшим способом реализации Задача? Чем проще, тем лучше, но, что наиболее важно, он должен постоянно подслушивать и мгновенно реагировать, когда включена настройка местоположения.
- Какая из приведенных выше идей работает лучше всего, как мне ее реализовать? (Например, нужен ли мне BroadcastListener? или Сервис? И как все это будет складываться воедино?
РЕДАКТИРОВАНИЕ:
ОК Итак, вот что у меня есть на данный момент...
Вот мой приемник:
MyReceiver.Java
Код: Выделить всё
public class MyReceiver extends BroadcastReceiver {
private final static String TAG = "LocationProviderChanged";
boolean isGpsEnabled;
boolean isNetworkEnabled;
public MyReceiver() {
// EMPTY
// MyReceiver Close Bracket
}
// START OF onReceive
@Override
public void onReceive(Context context, Intent intent) {
// PRIMARY RECEIVER
if (intent.getAction().matches("android.location.PROVIDERS_CHANGED")) {
Log.i(TAG, "Location Providers Changed");
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Toast.makeText(context, "GPS Enabled: " + isGpsEnabled + " Network Location Enabled: " + isNetworkEnabled, Toast.LENGTH_LONG).show();
// START DIALOG ACTIVITY
if (isGpsEnabled || isNetworkEnabled) {
Intent runDialogActivity = new Intent(context, DialogActivity.class);
context.startActivity(runDialogActivity);
}
}
// BOOT COMPLETED (REPLICA OF PRIMARY RECEIVER CODE FOR WHEN BOOT_COMPLETED)
if (intent.getAction().matches("android.intent.action.BOOT_COMPLETED")) {
Log.i(TAG, "Location Providers Changed Boot");
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Toast.makeText(context, "GPS Enabled Boot: " + isGpsEnabled + " Network Location Enabled Boot: " + isNetworkEnabled, Toast.LENGTH_LONG).show();
// START DIALOG ACTIVITY
if (isGpsEnabled || isNetworkEnabled) {
Intent runDialogActivity = new Intent(context, DialogActivity.class);
context.startActivity(runDialogActivity);
}
}
// onReceive CLOSE BRACKET
}
// CLOSE OF FULL CLASS
}
Manifest.XML
Код: Выделить всё
Код: Выделить всё
MainActivity.JavaКод: Выделить всё
activity_main.xmlИтак, если я правильно понимаю, когда пользователь загружает приложение и открывает его, запускается мой MainActivity.Java и соответствующий макет. Но я собираюсь использовать его только как экран настроек. Итак, как только они откроют приложение в первый раз, приемник вещания должен автоматически начать прослушивать настройку LOCATION, чтобы включить ее, верно? Я также хочу, чтобы прослушиватель широковещательной рассылки продолжал прослушивать даже после получения первоначальной широковещательной рассылки (чтобы мой onReceive все еще сработал, если они отключат параметр LOCATION, а затем снова включат его.
Итак (A) Как выглядит мой код на данный момент?
и (B) Чтобы выполнить то, что я только что описал, что нужно добавить?
и (C) Выполнение эта ошибка выдается, когда я включаю настройку LOCATION.
..Как это исправить?:
Код: Выделить всё
java.lang.RuntimeException: Unable to start receiver com.bryce.projects.servicesthreadsetc.MyReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?Подробнее здесь: https://stackoverflow.com/questions/363 ... ndroid-app
Мобильная версия