如何使应用程序识别启动后启用位置

时间:2016-01-03 18:03:02

标签: java android networking gps location

我解决了“检查位置是否已启用”的问题,但现在我卡住了。如果位置被禁用,我希望应用程序显示祝酒,并且一旦用户启用它,我希望应用程序正常进行,就像首先启用位置一样。我的代码对我来说是正确的,我不知道问题出在哪里。请注意,访问位置,网络和内容时没有任何问题。这只是我在启用位置后总是需要重新启动应用程序,否则它将不会继续并继续向我发出警告吐司。提前谢谢。

编辑:所以我刚添加了一个警告对话框方法而不是Toast消息。用户现在可以使用该对话框进入设置并打开位置和网络。我想请你看一下getForecast()方法中的网络检查if-else语句。 else包含警告对话框,引导用户进行设置 - 数据漫游。当用户激活移动数据并返回应用程序时,一切都很好,应用程序可以获取信息。我为位置if-else语句做了同样的事情,但是当用户打开位置并返回应用程序时,无论我做什么(等待几分钟,刷新几次),我都没有获得位置信息。我需要每次关闭并重新打开应用程序。这就是我面临的确切问题。

代码:

public class MainActivity extends AppCompatActivity {

public static final String TAG = MainActivity.class.getSimpleName();
public static final String DAILY_FORECAST = "DAILY_FORECAST";
private Forecast mForecast;

@Bind(R.id.timeLabel) TextView mTimeLabel;
@Bind(R.id.tempLabel) TextView mTempLabel;
@Bind(R.id.humidityValue) TextView mHumidityValue;
@Bind(R.id.precipValue) TextView mPrecipValue;
@Bind(R.id.summaryLabel) TextView mSummaryLabel;
@Bind(R.id.windSpeedValue) TextView mWindSpeedValue;
@Bind(R.id.relativeLayout) RelativeLayout mRelativeLayout;
@Bind(R.id.container) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.locationLabel) TextView mLocationLabel;

double latitude;
double longitude;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    final GPSTracker gpsTracker = new GPSTracker(this);

    mSwipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN);
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    mSwipeRefreshLayout.setRefreshing(false);
                }
            }, 1500);
            if (gpsTracker.getIsGPSTrackingEnabled()){
                getForecast(gpsTracker);
                updateDisplay(gpsTracker);

            } else {
            Toast.makeText(MainActivity.this, "Please enable location services.!!", Toast.LENGTH_LONG).show();
            gpsTracker.showSettingsAlert();
            }
        }
    });
    getForecast(gpsTracker);
    }


private void getForecast(final GPSTracker gpsTracker) {

        latitude = gpsTracker.getLatitude();
        longitude = gpsTracker.getLongitude();
        String apiKey = "7d22cdb138cd70f2e9e8d2006cd0461c";
        String forecastUrl = "https://api.forecast.io/forecast/" + apiKey
                + "/" + latitude + "," + longitude;

        if (isNetworkAvailable()) {
            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder().url(forecastUrl).build();

            Call call = client.newCall(request);

            call.enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {
                    alertUserAboutError();
                }

                @Override
                public void onResponse(Response response) throws IOException {
                    try {
                        String jsonData = response.body().string();
                        Log.v(TAG, jsonData);
                        if (response.isSuccessful()) {
                            mForecast = parseForecastDetails(jsonData);
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (gpsTracker.getIsGPSTrackingEnabled()) {
                                        updateDisplay(gpsTracker);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Please enable location services.", Toast.LENGTH_LONG).show();
                                    }
                                }
                            });

                        } else {
                            alertUserAboutError();
                        }
                    } catch (IOException | JSONException e) {
                        Log.e(TAG, "Exception caught: ", e);
                    }
            }
        });
        } else {
            gpsTracker.showSettingsAlert2();
        }


}

private void updateDisplay(GPSTracker gpsTracker) {

    Currently currently = mForecast.getCurrently();

        String area = gpsTracker.getSubLocality(this);
        String city = gpsTracker.getAdminArea(this);
        String country = gpsTracker.getCountryName(this);
        mLocationLabel.setText(area + "\n" + city + ", " + country);
        mTempLabel.setText(currently.getTemperature() + "");
        mTimeLabel.setText(currently.getFormattedTime());
        mHumidityValue.setText(currently.getHumidity() + "%");
        mPrecipValue.setText(currently.getPrecipChance() + "%");
        mSummaryLabel.setText(currently.getSummary());
        mWindSpeedValue.setText(currently.getWindSpeed() + "");
        Drawable drawable = getResources().getDrawable(currently.getBackgroundId());
        mRelativeLayout.setBackground(drawable);
}

// irrelevant after this point. (I guess)

private Forecast parseForecastDetails(String jsonData) throws JSONException {
    Forecast forecast = new Forecast();

    forecast.setCurrently(getCurrentlyDetails(jsonData));
    forecast.setHourlyForecast(getHourlyForecast(jsonData));
    forecast.setDailyForecast(getDailyForecast(jsonData));

    return forecast;
}

private Daily[] getDailyForecast(String jsonData) throws JSONException {
    JSONObject forecast = new JSONObject(jsonData);
    String timezone = forecast.getString("timezone");
    JSONObject jsonDaily = forecast.getJSONObject("daily");
    JSONArray data = jsonDaily.getJSONArray("data");

    Daily[] days = new Daily[data.length()];

    for (int i = 0; i < data.length(); i++) {
        JSONObject daily = data.getJSONObject(i);
        Daily day = new Daily();

        day.setSummary(daily.getString("summary"));
        day.setTempMax(daily.getDouble("temperatureMax"));
        day.setTempMin(daily.getDouble("temperatureMin"));
        day.setIcon(daily.getString("icon"));
        day.setTime(daily.getLong("time"));
        day.setTimezone(timezone);

        days[i] = day;
    }
    return days;
}

private Hourly[] getHourlyForecast(String jsonData) throws JSONException{
    JSONObject forecast = new JSONObject(jsonData);
    String timezone = forecast.getString("timezone");
    JSONObject jsonHourly = forecast.getJSONObject("hourly");
    JSONArray data = jsonHourly.getJSONArray("data");

    Hourly[] hours = new Hourly[data.length()];

    for(int i=0; i < data.length(); i++) {
        JSONObject hourly = data.getJSONObject(i);
        Hourly hour = new Hourly();

        hour.setSummary(hourly.getString("summary"));
        hour.setTemp(hourly.getDouble("temperature"));
        hour.setIcon(hourly.getString("icon"));
        hour.setTime(hourly.getLong("time"));
        hour.setTimezone(timezone);

        hours[i] = hour;
    }
    return hours;
}

private Currently getCurrentlyDetails(String jsonData) throws JSONException {
    JSONObject forecast = new JSONObject(jsonData);
    String timezone = forecast.getString("timezone");
    JSONObject currently = forecast.getJSONObject("currently");

    Currently currentWeather = new Currently();
    currentWeather.setHumidity(currently.getDouble("humidity"));
    currentWeather.setTime(currently.getLong("time"));
    currentWeather.setPrecipChance(currently.getDouble("precipProbability"));
    currentWeather.setSummary(currently.getString("summary"));
    currentWeather.setTemperature(currently.getDouble("temperature"));
    currentWeather.setWindSpeed(currently.getDouble("windSpeed"));
    currentWeather.setTimeZone(timezone);
    currentWeather.setBackgroundId(currently.getString("icon"));

    Log.d(TAG, currentWeather.getFormattedTime());

    return currentWeather;
}

private boolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager)
            getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    boolean isAvailable = false;
    if (networkInfo != null && networkInfo.isConnected()){
        isAvailable = true;
    }
    return isAvailable;
}

private void alertUserAboutError() {
    AlertDialogFragment dialog = new AlertDialogFragment();
    dialog.show(getFragmentManager(), "error_dialog");
}

@OnClick (R.id.dailyButton)
public void startDailyActivity(View view){
    Intent intent = new Intent(this, DailyForecastActivity.class);
    intent.putExtra(DAILY_FORECAST, mForecast.getDailyForecast());
    startActivity(intent);
}

}

0 个答案:

没有答案