2016-06-29 8 views
0

Ich hoffe, dass dies eine einfache Lösung sein wird und jemand mir helfen kann.Ortserlaubnis in Android Fragment

Ich habe eine App, die Benutzer Standort benötigt, um die lat und lng zu verwenden, um das Wetter ihres Standorts zu erhalten. Ich bin in der Lage, den Benutzerstandort zu erhalten, nachdem ich die Erlaubnis erlaubt habe, lasse das Fragment und gehe dann wieder hinein. Das Problem liegt, wenn ich auf dem Popup-Menü zulassen auswählen. Ich muss sofort den Standort bekommen. Hoffentlich ist mein Code selbsterklärend.

Ich habe mir die Freiheit genommen, den gesamten Code zu entfernen, der für mein Problem nicht relevant war. Außerdem habe ich versucht, Start() ohne Erfolg aufzurufen.

public class FragmentLocalWeather extends Fragment implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 

private static final int PERMISSION_ACCESS_COARSE_LOCATION = 0; 
private GoogleApiClient googleApiClient; 

public FragmentLocalWeather() { 
    // Required empty public constructor 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.local_weather_fragment, container, false); 

    googleApiClient = new GoogleApiClient.Builder(this.getActivity(), this, this).addApi(LocationServices.API).build(); 

    if (ContextCompat.checkSelfPermission(this.getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this.getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
       PERMISSION_ACCESS_COARSE_LOCATION); 
    } 

    setHasOptionsMenu(true); 

    return view; 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if (googleApiClient != null) { 
     googleApiClient.connect(); 
    } 
} 

@Override 
public void onStop() { 
    googleApiClient.disconnect(); 
    super.onStop(); 

} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case PERMISSION_ACCESS_COARSE_LOCATION: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // ********** problem Area ********** 
       // Need to user location here. 
      } else { 
       Toast.makeText(this.getActivity(), "Need your location!", Toast.LENGTH_SHORT).show(); 
      } 
      break; 
    } 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.menu_local_weather, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    switch (id) { 
     case R.id.action_settings: { 

     } 
     case R.id.action_refresh: { 
      onStart(); 
     } 
    } 

    return true; 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    if (ContextCompat.checkSelfPermission(this.getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     Location lastLocation = LocationServices.FusedLocationApi.getLastLocation(googleApiClient); 

     double lat = lastLocation.getLatitude(), lon = lastLocation.getLongitude(); 
     Log.d("dozer74", "===========================>>>>>>>>>>>>> " + lat + " : " + lon); 
    } 
} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

} 
+1

Können Sie nur 'googleApiClient.connect nennen()' in Ihrem '********** Problem Bereich **********'? –

+1

"Ich muss sofort den Standort bekommen" - das wird nicht unbedingt möglich sein. – CommonsWare

+0

Versuchte Aufruf von googleApiClient.connect() und es hat nicht funktioniert. Ist es möglich, das Fragment neu zu laden, das den onStart() aufrufen würde? – jdubicki

Antwort

3

Zusätzlich zu dem, was Marcin vorschlug (googleApiClient.connect() in der Problemzone Aufruf) Ich glaube, Sie brauchen die requestPermissions Methode in dem Fragment zu verwenden, anstatt ActivityCompat.requestPermissions.

Die Methode requestPermissions im Fragment ruft das onRequestPermissionsResult auf, das Sie im Fragment definiert haben, während die Methode, die Sie gerade verwenden, onRequestPermissionsResult() innerhalb Ihrer Aktivität aufruft (was ich nicht für überflüssig halte).

So onCreate Sie sehen eher aus wie:

if (ContextCompat.checkSelfPermission(this.getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
    requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
      PERMISSION_ACCESS_COARSE_LOCATION); 
} 
1

dieses Versuchen in Fragment manifestieren die Erlaubnis zu bekommen

if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && 
      ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    }