2016-05-31 4 views
3

画面に入ると、GPSがオンになっているかどうかをチェックし、そうでなければGPSを有効にするダイアログが表示されます。ユーザーが[はい]をクリックすると、onActivityResult - > GPSがオンになり、場所を取得しようとしましたが、これは常にnullを返します。ダイアログでGPSを有効にした後、Androidの場所を返す

GPSを使用して画面に入ると、私は数日間このことに苦しんでいて、リソースを見つけることができないようです。

UserLocationUtilities.java

public class UserLocationUtilities implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener{ 

    GoogleApiClient googleApiClient; 
    Activity activity; 
    protected static final int REQUEST_CHECK_SETTINGS = 0x1; 

    boolean isGPSEnabled = false; 
    // flag for network status 
    boolean isNetworkEnabled = false; 
    // flag for GPS status 
    boolean canGetLocation = false; 

    protected LocationManager locationManager; 
    protected LocationListener locationListener; 
    protected Location location; 
    protected double latitude,longitude; 
    protected boolean gps_enabled,network_enabled; 

    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 
    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1 * 1000 * 60; // 1 minute 

    public UserLocationUtilities(Activity activity){ 
     this.activity = activity; 
    } 

    public void settingsRequest() 
    { 
     if(googleApiClient == null){ 
      googleApiClient = new GoogleApiClient.Builder(activity) 
        .addApi(LocationServices.API) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this).build(); 
      googleApiClient.connect(); 
     } 

     LocationRequest locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     locationRequest.setInterval(30 * 1000); 
     locationRequest.setFastestInterval(5 * 1000); 
     LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(locationRequest); 
     builder.setAlwaysShow(true); //this is the key ingredient 

     PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build()); 
     result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
      @Override 
      public void onResult(LocationSettingsResult result) { 
       final Status status = result.getStatus(); 
       final LocationSettingsStates state = result.getLocationSettingsStates(); 
       switch (status.getStatusCode()) { 
        case LocationSettingsStatusCodes.SUCCESS: 
         // All location settings are satisfied. The client can initialize location 
         // requests here. 

         break; 
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
         // Location settings are not satisfied. But could be fixed by showing the user 
         // a dialog. 
         try { 
          // Show the dialog by calling startResolutionForResult(), 
          // and check the result in onActivityResult(). 
          status.startResolutionForResult(activity, REQUEST_CHECK_SETTINGS); 
         } catch (IntentSender.SendIntentException e) { 
          // Ignore the error. 
         } 
         break; 
        case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
         // Location settings are not satisfied. However, we have no way to fix the 
         // settings so we won't show the dialog. 
         break; 
       } 
      } 
     }); 
    } 

    public Location getLocation() { 
     if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      try { 
       locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); 

       isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
       isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

       if (!isGPSEnabled && !isNetworkEnabled) { 
        // no network provider is enabled 
       } else { 
        this.canGetLocation = true; 
        if (isNetworkEnabled) { 
         locationManager.requestLocationUpdates(
           LocationManager.NETWORK_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("Network", "Network"); 
         if (locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
        // if GPS Enabled get lat/long using GPS Services 
        if (isGPSEnabled) { 
         if (location == null) { 
          locationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            MIN_TIME_BW_UPDATES, 
            MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
          Log.d("GPS Enabled", "GPS Enabled"); 
          if (locationManager != null) { 
           location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
           if (location != null) { 
            latitude = location.getLatitude(); 
            longitude = location.getLongitude(); 
           } 
          } 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     return location; 
    } 

    public boolean isLocationEnabled() { 
     int locationMode = 0; 
     String locationProviders; 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ 
      try { 
       locationMode = Settings.Secure.getInt(activity.getApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE); 

      } catch (Settings.SettingNotFoundException e) { 
       e.printStackTrace(); 
      } 

      return locationMode != Settings.Secure.LOCATION_MODE_OFF; 

     }else{ 
      locationProviders = Settings.Secure.getString(activity.getApplicationContext().getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); 
      return !TextUtils.isEmpty(locationProviders); 
     } 


    } 

    @Override 
    public void onConnected(Bundle bundle) { 


    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

    } 

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

    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 
} 

ユーザが設定ダイアログ、onActivityResultでYesを選択した後、私は)位置= userlocationutilities.getLocationを(行います。常にnullを返します。画面を切り替えて戻ると、場所が検索されます。

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
// Check for the integer request code originally supplied to startResolutionForResult(). 
      case REQUEST_CHECK_SETTINGS: 
       switch (resultCode) { 
        case Activity.RESULT_OK: //location settings dialog, user selected YES to enabling location 

         location = userLocationUtilities.getLocation(); 
         if(location != null){ 
          //location of user FOUND 
          Toast.makeText(getActivity(), "Lat: "+location.getLatitude()+" Long: "+location.getLongitude(), Toast.LENGTH_LONG).show(); 
          getRingsNearMeCall(); 

         }else{ 
          //location of user NOT FOUND 
          Toast.makeText(getActivity(), "null location", Toast.LENGTH_LONG).show(); 

         } 

         break; 
        case Activity.RESULT_CANCELED: //location settings dialog, user selected NO to enabling location 
         userLocationUtilities.settingsRequest(); //ask user again with Location Settings Dialog 
         break; 
       } 
       break; 
     } 
    } 

Editted:私は、権限が付与されたフラグメントでrequestPermissionを作る

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(getActivity(), new String[] { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }, 
        PERMISSION_ACCESS_FINE_LOCATION); 
     }else{ 
      checkLocationSettingsGetRings(); 
     } 
+0

チェックこのhttp://stackoverflow.com/questions/39490661/current-location-failed-googlemap/39491524#39491524働いていた私にとって、このオーバーライドメソッドを追加します。リンク –

答えて

0

LocationSettingsRequestあなたがして、より正確な(HIGH_ACCURACY)の場所を受け取りたい例えば、単に場所の設定が適切で作る使用されていますGPSが有効になっている必要があります。その場合、LocationSettingsRequestは、ダイアログにAPiの変更設定を許可するように要求します。

OKを押すと、GPSが有効になっていることがわかります。しかし、それはまだあなたが場所の要求を行うことを許可されているわけではありません。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_CHECK_SETTINGS: 
      switch (resultCode) { 
       case Activity.RESULT_OK: 
       // Here means required settings are adequate. 
       // We can make location request. 
       // But are we granted to use request location updates ? 
       break; 
      } 
      break; 
     } 
    } 
} 

大丈夫厥ていますが、許可をチェックしているが、あなたはrequestPermissionsを作ることはありませんでした。これがヌルを得る最初の理由です。

public Location getLocation() { 
    if (ContextCompat.checkSelfPermission(activity, 
     Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
     ... 
    } 
    return location; 
} 

がさえ以前にロケーション要求にnullを返すことができ

location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

getLastKnownLocation()メソッドを作るために付与され、これは予期しない動作ではありません。これは、nullを取得する2番目の理由です。

ロケーションの要求は行っていますが、グローバルロケーション変数はonLocationChangedコールバックに割り当てられません。

@Override 
public void onLocationChanged(Location location) { 
    // global location variable is not assigned ? 
    // getLocation() method will return null if getLastKnownLocation() 
    // did not return null previously. 
} 

これは、3番目に可能なnullの理由です。

+0

私は許可されていない場合、許可を要求する私の断片の許可リクエストを作成しています。場所の許可が与えられたと仮定することができます。 GPSの設定を有効にして、私は私のアプリの情報に行くことができ、場所の許可が与えられていることを確認することができるので – yellowmonkey

+0

私の研究に基づいて、それは他のアプリはそれを有効にして以来それを使用していないので、他のアプリで最後に知られている場所を探しているので、それはnullを返す理由です。私はちょうどこの問題を修正する方法についてはわからない – yellowmonkey

+0

こんにちは、@ shiv.s。まだ解決策はありますか?私も同じ問題を抱えています。 –

0

最後に、私は解決策を見つける: 私はスレッドを作成し、私の場所が利用できるのを待つ。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode){ 
     case REQUEST_LOCATION: 
      switch (resultCode){ 
       case Activity.RESULT_OK: 
        mHandler = new Handler(); 
        runnable = new Runnable() { 
         @Override 
         public void run() { 
          mHandler.postDelayed(this,1000); 
          checkLocationAvailable(); 
         } 
        }; 
        mHandler.postDelayed(runnable,1000); 
        break; 
       case Activity.RESULT_CANCELED: 
        break; 
      } 
    } 
} 

私の場所が利用可能なときにスレッドを停止する関数を作成します。

private void checkLocationAvailable(){ 
    if (mMap.getMyLocation() != null) { 
    mHandler.removeCallbacks(runnable); 
    // do stuff 
    } 
} 

これは良い解決策ではありませんが、役立つことを願っています。

0

そのfine--

@Override public void onLocationChanged(Location location) { getLocation("onLocationChanged"); }

関連する問題