Задача:
(Предполагая, что «Местоположение»/ Настройка GPS в настоящее время отключена), мне нужно, чтобы мое приложение постоянно прослушивало настройку «Местоположение». На этом этапе просто запустите действие.
< h2>Идеи:
По моему мнению, это может сработать по-разному:
- LocationListener с использованием «onProviderEnabled»
- GpsStatusListener с использованием «onGpsStatusChanged» с «GPS_EVENT_STARTED»
- GpsProvider требует Satellite (чтобы определить, запускается ли он) или каким-то образом используйте константу/int «AVAILABLE» GpsProvider
- SettingInjectorService с помощью «ACTION_SERVICE_INTENT» " (и/или) "ACTION_INJECTED_SETTING_CHANGED" с "onGetEnabled" или "isEnabled"
- Настройки. Защитите с помощью "LOCATION_MODE" != "LOCATION_MODE_OFF"
- ContentObserver/ContentResolver
- Intent getAction (...)
Какое-то «если/иначе»
Мы будем очень признательны за любые советы или ответы на любой из следующих вопросов..
- Какая из приведенных выше идей будет лучшим способом выполнения задачи? Чем проще, тем лучше, но самое главное — он должен постоянно прослушиваться и мгновенно реагировать, когда включена настройка местоположения.
- В зависимости от того, какой из них Идеи, приведенные выше, работают лучше всего, как мне их реализовать? (Например, нужен ли мне 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, а затем снова включают ее..
Итак (А) Как выглядит мой код на данный момент?
И (Б) Что нужно добавить, чтобы выполнить то, что я только что описал?
и (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
Мобильная версия