2016-11-01 96 views
0

當我剛剛通過圖書館設處理的權限總是返回0.0,但我還是不能讓我的Android應用程序的經度和緯度。我正在使用名爲GPS_Service.java的服務。此外,我不是100%確定我的權限不是問題。對GPS_Service中的google API的調用仍然帶有下劃線,並且警告它需要可能會被拒絕的權限。即使使用第三方庫,這是否應該消失?這仍然是一個問題,因爲在我的設備上應用程序啓用了位置權限?緯度和經度使用lastKnownLocation

這裏是我的主要活動:

package com.example.paxie.stormy.ui; 

import android.Manifest; 
import android.annotation.TargetApi; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.content.pm.PackageManager; 
import android.graphics.drawable.Drawable; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.Settings; 
import android.support.annotation.NonNull; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.ActionBarActivity; 
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.GPS_Service; 
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.google.android.gms.maps.model.LatLng; 
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 broadcastReceiver; 
    private Location location; // location 
    private double latitude; // latitude 
    private double longitude; // longitude 
    private Context mContext; 

    @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 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(); 
      } 
     }); 


     getForecast(); 
     Log.d(TAG, "Main UI code is running!"); 
    } 

    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() { 
     GPS_Service gps_service = new GPS_Service(this); 
     gps_service.getLocation(); 
     mLatitude = gps_service.getLatitude(); 
     mLongitude = gps_service.getLongitude(); 
    } 

    @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.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 implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

    private Location location; // location 
    private double latitude; // latitude 
    private double longitude; // longitude 
    private GoogleApiClient mGAC; 
    private Context mContext; 
    public static final String TAG = "GPSresource"; 
    private static final int RC_GPS_PERMS = 124; 
    public String[] perm = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}; 

    public GPS_Service(Context c) { 
     mContext = c; 
     try { 
      buildGoogleApiClient(); 
      mGAC.connect(); 
     } catch (Exception e) { 
      Log.d(TAG, e.toString()); 
     } 
    } 



    protected synchronized void buildGoogleApiClient() { 
     mGAC = new GoogleApiClient.Builder(mContext) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 


    public double getLatitude() { 
     if (location != null) { 
      latitude = location.getLatitude(); 
     } 

     // return latitude 
     return latitude; 
    } 

    /** 
    * Function to get longitude 
    */ 
    public double getLongitude() { 
     if (location != null) { 
      longitude = location.getLongitude(); 
     } 

     // return longitude 
     return longitude; 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 

    } 


    @Override 
    public void onConnectionSuspended(int i) { 

    } 


    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

    } 

    public void getLocation() { 
     location = LocationServices.FusedLocationApi.getLastLocation(mGAC); 
    } 

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

回答

0

在這種情況下,使您的GPS,去谷歌地圖和擊中位置按鈕,稍等直到谷歌地圖找到你,然後回去測試你的應用程序。這應該工作,因爲如果u使用的是第一次烏爾手機沒有從來沒有conected到GPS它插上U這個問題

+0

沒有骰子。它仍然顯示0.0,0.0 –

0

它正在尋找具體「LastKnownLocation」,我有這個問題爲好。移動約3米,然後再試一次。如果沒有'最後已知的位置',那麼它發送一個空值。

我所做的是爲我的應用程序設置了一些if語句。如果GPS提供商正在吐出空值,然後使用網絡提供商位置座標,並且如果這是吐出空值,那麼我只是顯示一條消息,說「等待」或「稍後再試」。最終,您的GPS提供商會在激活一段時間後提取位置值。

 newLoc = _locationManager.GetLastKnownLocation(_locationProvider); 
     if (newLoc != null) 
     { 
      _latitudeUser = newLoc.Latitude; 
      _longitudeUser = newLoc.Longitude; 
      _locationText.Text = string.Format("{0:f6},{1:f6}", newLoc.Latitude, newLoc.Longitude); 
     } 
     else 
     { 
      _locationProvider = LocationManager.NetworkProvider; 
      newLoc = _locationManager.GetLastKnownLocation(_locationProvider); 
      if (newLoc != null) 
      { 
       _latitudeUser = newLoc.Latitude; 
       _longitudeUser = newLoc.Longitude; 
       _locationText.Text = string.Format("{0:f6},{1:f6}", newLoc.Latitude, newLoc.Longitude); 
      } 
      else 
      { 
       _locationText.Text = string.Format("We currently cannot determine your location, please try again later."); 
      } 
+0

它看起來像你使用一種不同的方法來獲取位置。我沒有使用LocationManager,因爲我認爲這與使用google位置api不兼容。 –

+0

location = LocationServices.FusedLocationApi.getLastLocation(mGAC); 是我正在使用 –