2016-11-19 43 views
0

为了保持干净的代码,我做了一个GPS_Service服务。另外为了测试我的结果,我将位置textview设置为GPS坐标。我一直把“0.0,0.0”作为我的坐标,我不知道为什么。在一个灵感的时刻,我添加了一个包含long和lat的Log.d语句,现在我发现它没有被记录,所以我的checkGPS方法从未被运行。我正在使用第三方插件作为我的权限管理员。我的checkGPS方法永远不会运行,GPS保持0.0,0.0

另外:

mManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, mListener); 

最初

mManager.requestLocationUpdates(LocationManager.GPS_SERVICE, 3000, 0, mListener); 

所以不能说。

我的主要活动:

package com.example.paxie.stormy.ui; 

import android.Manifest; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.graphics.drawable.Drawable; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.canelmas.let.AskPermission; 
import com.canelmas.let.DeniedPermission; 
import com.canelmas.let.Let; 
import com.canelmas.let.RuntimePermissionListener; 
import com.canelmas.let.RuntimePermissionRequest; 
import com.example.paxie.stormy.R; 
import com.example.paxie.stormy.weather.Current; 
import com.example.paxie.stormy.weather.Day; 
import com.example.paxie.stormy.weather.Forecast; 
import com.example.paxie.stormy.weather.Hour; 
import com.squareup.okhttp.Call; 
import com.squareup.okhttp.Callback; 
import com.squareup.okhttp.OkHttpClient; 
import com.squareup.okhttp.Request; 
import com.squareup.okhttp.Response; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.io.IOException; 
import java.util.List; 
import butterknife.BindView; 
import butterknife.ButterKnife; 
import butterknife.OnClick; 

public class MainActivity extends AppCompatActivity implements RuntimePermissionListener { 

    public static final String TAG = MainActivity.class.getSimpleName(); 
    public static final String DAILY_FORECAST = "DAILY_FORECAST"; 
    public static final String HOURLY_FORECAST = "HOURLY_FORECAST"; 
    private Forecast mForecast; 
    private double mLatitude; 
    private double mLongitude; 
    private BroadcastReceiver mBroadcastReceiver; 

    @BindView(R.id.timeLabel) 
    TextView mTimeLabel; 
    @BindView(R.id.temperatureLabel) 
    TextView mTemperatureLabel; 
    @BindView(R.id.humidityValue) 
    TextView mHumidityValue; 
    @BindView(R.id.precipValue) 
    TextView mPrecipValue; 
    @BindView(R.id.summaryLabel) 
    TextView mSummaryLabel; 
    @BindView(R.id.iconImageView) 
    ImageView mIconImageView; 
    @BindView(R.id.refreshImageView) 
    ImageView mRefreshImageView; 
    @BindView(R.id.progressBar) 
    ProgressBar mProgressBar; 
    @BindView(R.id.locationLabel) 
    TextView mLocationlabel; 


    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     Let.handle(this, requestCode, permissions, grantResults); 
    } 

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

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (mBroadcastReceiver != null){ 
      unregisterReceiver(mBroadcastReceiver); 
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 



     mProgressBar.setVisibility(View.INVISIBLE); 

     mRefreshImageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getForecast(); 
      } 
     }); 

     checkGPS(); 
     getForecast(); 
     Log.d(TAG, "Main UI code is running!"); 
    } 
@AskPermission({Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}) 
    private void getForecast() { 
     checkGPS(); 
     String apiKey = "1621390f8c36997cb1904914b726df52"; 
     String forecastUrl = "https://api.forecast.io/forecast/" + apiKey + 
       "/" + mLatitude + "," + mLongitude; 

     if (isNetworkAvailable()) { 
      toggleRefresh(); 

      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) { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          toggleRefresh(); 
         } 
        }); 
        alertUserAboutError(); 
       } 

       @Override 
       public void onResponse(Response response) throws IOException { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          toggleRefresh(); 
         } 
        }); 
        try { 
         String jsonData = response.body().string(); 
         Log.v(TAG, jsonData); 
         if (response.isSuccessful()) { 
          mForecast = parseForecastDetails(jsonData); 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            updateDisplay(); 
           } 
          }); 

         } else { 
          alertUserAboutError(); 

         } 
        } catch (IOException e) 

        { 
         Log.e(TAG, "Exception caught: ", e); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } else { 
      Toast.makeText(this, "Network is currently unavailable!", Toast.LENGTH_LONG).show(); 
     } 
    } 


    private void toggleRefresh() { 
     if (mProgressBar.getVisibility() == View.INVISIBLE) { 
      mProgressBar.setVisibility(View.VISIBLE); 
      mRefreshImageView.setVisibility(View.INVISIBLE); 
     } else { 
      mProgressBar.setVisibility(View.INVISIBLE); 
      mRefreshImageView.setVisibility(View.VISIBLE); 
     } 
    } 

    private void updateDisplay() { 
     mLocationlabel.setText(mLatitude + " " + mLongitude); 
     Current current = mForecast.getCurrent(); 
     mTemperatureLabel.setText(current.getTemperature() + ""); 
     mTimeLabel.setText("At " + current.getFormattedTime() + " it will be:"); 
     mHumidityValue.setText(current.getHumidity() + ""); 
     mPrecipValue.setText(current.getPrecipChance() + "%"); 
     mSummaryLabel.setText(current.getSummary()); 
     Drawable drawable = ContextCompat.getDrawable(this, current.getIconId()); 
     mIconImageView.setImageDrawable(drawable); 
    } 

    private Forecast parseForecastDetails(String jsonData) throws JSONException { 
     Forecast forecast = new Forecast(); 
     forecast.setCurrent(getCurrentDetails(jsonData)); 
     forecast.setHourlyForecast(getHourlyForecast(jsonData)); 
     forecast.setDailyForecast(getDailyForecast(jsonData)); 

     return forecast; 

    } 

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

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

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

      day.setSummary(jsonDay.getString("summary")); 
      day.setIcon(jsonDay.getString("icon")); 
      day.setTemperatureMax(jsonDay.getDouble("temperatureMax")); 
      day.setTime(jsonDay.getLong("time")); 
      day.setTimeZone(timezone); 

      days[i] = day; 

     } 
     return days; 
    } 

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

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

     for (int i = 0; i < data.length(); i++) { 
      JSONObject jsonHour = data.getJSONObject(i); 
      Hour hour = new Hour(); 
      hour.setSummary(jsonHour.getString("summary")); 
      hour.setTemperature(jsonHour.getDouble("temperature")); 
      hour.setIcon(jsonHour.getString("icon")); 
      hour.setTime(jsonHour.getLong("time")); 
      hour.setTimeZone(timezone); 

      hours[i] = hour; 

     } 
     return hours; 
    } 

    private Current getCurrentDetails(String jsonData) throws JSONException { 
     JSONObject forecast = new JSONObject(jsonData); 
     String timezone = forecast.getString("timezone"); 
     Log.i(TAG, "From JSON: " + timezone); 

     JSONObject currently = forecast.getJSONObject("currently"); 
     Current current = new Current(); 
     current.setHumidity(currently.getDouble("humidity")); 
     current.setTime(currently.getLong("time")); 
     current.setIcon(currently.getString("icon")); 
     current.setPrecipChance(currently.getDouble("precipProbability")); 
     current.setSummary(currently.getString("summary")); 
     current.setTemperature(currently.getDouble("temperature")); 
     current.setTimeZone(timezone); 

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

     return current; 
    } 

    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); 

    } 

    @OnClick(R.id.hourlyButton) 
    public void startHourlyActivity(View view) { 
     Intent intent = new Intent(this, HourlyForecastActivity.class); 
     intent.putExtra(HOURLY_FORECAST, mForecast.getHourlyForecast()); 
     startActivity(intent); 
    } 
@AskPermission({Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}) 
    private void checkGPS() { 
    if(mBroadcastReceiver == null){ 
     mBroadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       mLatitude = (double) intent.getExtras().get("latitude"); 
       mLongitude = (double) intent.getExtras().get("longitude"); 
       Log.d("wuddup", "Latitude is: " + mLatitude + " and Longitude is: " + mLongitude); 
      } 
     }; 
    } 
    registerReceiver(mBroadcastReceiver, new IntentFilter("location_update")); 
    } 

    @Override 
    public void onShowPermissionRationale(List<String> permissionList, RuntimePermissionRequest permissionRequest) { 

    } 

    @Override 
    public void onPermissionDenied(List<DeniedPermission> deniedPermissionList) { 
    } 
} 

我GPS_Service.java:

package com.example.paxie.stormy; 

import android.*; 
import android.Manifest; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

import com.canelmas.let.AskPermission; 
import com.canelmas.let.DeniedPermission; 
import com.canelmas.let.Let; 
import com.canelmas.let.RuntimePermissionListener; 
import com.canelmas.let.RuntimePermissionRequest; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationServices; 

import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by paxie on 10/27/16. 
*/ 

public class GPS_Service extends Service { 

    private LocationListener mListener; 
    private LocationManager mManager; 


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

    @Override 
    public void onCreate() { 
     mListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       Intent i = new Intent("location_update"); 
       i.putExtra("coordinates", location.getLatitude() + " " + location.getLatitude()); 
       i.putExtra("latitude", location.getLatitude()); 
       i.putExtra("longitude", location.getLongitude()); 
       sendBroadcast(i); 
      } 

      @Override 
      public void onStatusChanged(String provider, int status, Bundle extras) { 

      } 

      @Override 
      public void onProviderEnabled(String provider) { 

      } 

      @Override 
      public void onProviderDisabled(String provider) { 
       Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(i); 
      } 
     }; 

     mManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 

     //noinspection MissingPermission 
     mManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, mListener); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mManager != null) { 
      //noinspection MissingPermission 
      mManager.removeUpdates(mListener); 
     } 
     } 
    } 

回答

0

我发现的解决方案!我没有开始这项服务,我将其添加到我的onCreate和onResume。

Intent i =new Intent(getApplicationContext(),GPS_Service.class); 
    startService(i); 
1

请重新启动装置,它的工作对我来说

+0

我重新启动我的设备,我已经使用我的设备以及模拟器。 0.0,0.0是什么GPS显示...是巧合你在哪里? :-P –

相关问题