2016-11-01 7 views
0

방금 ​​라이브러리를 통해 처리되는 사용 권한을 얻었습니다.하지만 여전히 Android 앱에서 경도와 위도를 가져올 수 없습니다. GPS_Service.java라는 서비스를 사용하고 있습니다. 또한 나는 나의 허가가 문제가 아니라는 것을 100 % 확신하지 못한다. GPS_Service의 Google API 호출에 여전히 거부 될 수있는 권한이 필요하다는 경고가 밑줄로 표시됩니다. 제 3 자 도서관과도 떨어져있어? 내 기기에서 앱에 위치 권한이 사용 설정되어 있어도 여전히 문제가됩니까? 여기 lastKnownLocation을 사용할 때 위도와 경도는 항상 0.0을 반환합니다.

내 주요 활동 :

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입니다 : 잠깐, 당신의 GPS를 활성화하고지도를 구글로 이동하고 위치 버튼을 누르면

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

이 경우 때까지 Google지도를 찾아서 다시 돌아가서 어플 리케이션을 테스트합니다. u가 처음으로 UR 전화를 사용하는 경우 GPS에 연결되지 않은 상태에서 U 문제가 발생합니다.

+0

주사위 없음. 그것은 여전히 ​​0.0, 0.0 –

0

특별히 "LastKnownLocation"을 찾고 있기 때문에이 문제도있었습니다. 3 미터 정도 이동하고 다시 시도하십시오. '마지막으로 알려진 위치'가 없으면 널값을 전송합니다.

내가 한 것은 응용 프로그램에 대한 몇 가지 if 문을 설정 한 것입니다. GPS 공급자가 Null 값을 누설했다면 네트워크 공급자 위치 좌표를 사용하고 Null 값이 나왔다면 "기다리십시오"또는 "나중에 다시 시도하십시오"라는 메시지를 표시했습니다. 결국 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

을 보여줍니다. 위치를 얻는 데 다른 방법을 사용하고있는 것처럼 보입니다. 내가 Google 위치 API를 사용하는 것과 호환되지 않는다고 생각했기 때문에 LocationManager를 사용하지 않습니다. –

+0

location = LocationServices.FusedLocationApi.getLastLocation (mGAC); 내가 사용하고있는 것입니다. –

관련 문제