2016-09-05 2 views
1

버튼 하나를 클릭하면 사용자의 현재 lat를 길게 가져오고 싶습니다. FusedLocationApi를 사용하여 마지막으로 알려진 위치를 얻을 수 있다는 것을 알고 있습니다. 하지만 내가 이해할 수없는 것은 gps 또는 위치 서비스가이 기능을 사용하도록 설정해야한다는 것입니다. 예인 경우 사용자가 위치를 켜고 현재 위치를 가져 왔는지 확인하는 방법. 또한, 위치를 알아내는 데 마쉬맬 로우 권한 검사를 포함시키는 방법. 1) googlesamples/android-play-location 2) googlesamples/android-XYZTouristAttractions 많은 다른 링크를하지만 전체 흐름을 만들 수 없습니다 :안드로이드에서 사용자의 현재 위치를 얻는 방법

은 내가 이미 언급했다.

코드

public class AccessLocationFragment extends BaseFragment implements View.OnClickListener, LocationListener, 
    GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, GeneralDialogFragment.GeneralDialogClickListener { 

private static final int MY_PERMISSIONS_REQUEST_LOCATION = 101; 
private static final String TAG = AccessLocationFragment.class.getSimpleName(); 
private static final int REQUEST_CHECK_SETTINGS = 102; 
private Button mAccessLocation; 
private EditText mZipCode; 
private Dialog progressDialog; 
private GoogleApiClient mGoogleApiClient; 
private Location mLastLocation; 

public static AccessLocationFragment newInstance() { 
    return new AccessLocationFragment(); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_access_location, container, false); 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    RecycleApplication.getEventBus().register(this); 
    mAccessLocation = (Button) view.findViewById(R.id.access_location); 
    mZipCode = (EditText) view.findViewById(R.id.zip_code); 
    mAccessLocation.setOnClickListener(this); 

    mZipCode.setOnEditorActionListener(new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (actionId == EditorInfo.IME_ACTION_DONE) { 
       String zipCode = mZipCode.getText().toString().trim(); 
       if (TextUtils.isEmpty(zipCode)) { 
        Toast.makeText(mActivity, "Please enter zip code", Toast.LENGTH_SHORT).show(); 
       } else { 
        Call<Address> response = mRecycleService.getAddress(zipCode); 
        response.enqueue(new GetLocationCallback(AccessLocationFragment.this)); 
       } 
      } 
      return false; 
     } 
    }); 
    // Create an instance of GoogleAPIClient. 
    if (mGoogleApiClient == null) { 
     mGoogleApiClient = new GoogleApiClient.Builder(mActivity) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 
    if (!LocationUtils.checkFineLocationPermission(mActivity)) { 
     // See if user has denied permission in the past 
     if (shouldShowRequestPermissionRationale(android.Manifest.permission.ACCESS_FINE_LOCATION)) { 
      // Show a simple snackbar explaining the request instead 
      showPermissionSnackbar(); 
     } else { 
      requestFineLocationPermission(); 
     } 
    } else { 
     displayLocationSettingsRequest(); 
    } 
} 

private void startHomeActivity(Address address) { 
    RecyclePreferences.getInstance().setCity(address.getCity()); 
    RecyclePreferences.getInstance().setState(address.getState()); 
    RecyclePreferences.getInstance().setLatitude(address.getLatitude()); 
    RecyclePreferences.getInstance().setLongitude(address.getLongitude()); 
    RecyclePreferences.getInstance().setZipCode(address.getZipCode()); 
    startActivity(new Intent(mActivity, HomeActivity.class)); 
    mActivity.finish(); 
} 

@Override 
public void onSuccess(Call<Address> call, Response<Address> response) { 
    mActivity.hideProgressDialog(progressDialog); 
    if (response.isSuccessful()) { 
     Address address = response.body(); 
     startHomeActivity(address); 
    } 
} 

@Override 
public void onFailure(Call<Address> call, Throwable t) { 
    mActivity.hideProgressDialog(progressDialog); 
} 

@Override 
public void onClick(View view) { 
    if (view.getId() == R.id.access_location) { 
     fetchAddress(mLastLocation); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       displayLocationSettingsRequest(); 
      } 
     } 
    } 
} 

private void fetchAddress(Location location) { 
    mRecycleService = new RecycleRetrofitBuilder(mActivity).getService(); 
    Call<Address> response = mRecycleService.getAddress(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude())); 
    progressDialog = mActivity.showProgressDialog(mActivity); 
    response.enqueue(new GetLocationCallback(AccessLocationFragment.this)); 
} 

private void requestFineLocationPermission() { 
    requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_LOCATION); 
} 

private void showPermissionSnackbar() { 
    GeneralDialogFragment generalDialogFragment = GeneralDialogFragment. 
      newInstance("Permissions", "Allow Recycle the World to use your location.", "Allow", "Go Back", this); 
    mActivity.showDialogFragment(generalDialogFragment); 
    displayLocationSettingsRequest(); 
} 

private void displayLocationSettingsRequest() { 
    LocationRequest locationRequest = LocationRequest.create(); 
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationRequest.setInterval(10000); 
    locationRequest.setFastestInterval(10000/2); 

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest); 
    builder.setAlwaysShow(true); 

    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() { 
     @Override 
     public void onResult(LocationSettingsResult result) { 
      final Status status = result.getStatus(); 
      switch (status.getStatusCode()) { 
       case LocationSettingsStatusCodes.SUCCESS: 
        getLocation(); 
        break; 
       case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
        Log.i(TAG, "Location settings are not satisfied. Show the user a dialog to upgrade location settings "); 
        try { 
         status.startResolutionForResult(mActivity, REQUEST_CHECK_SETTINGS); 
        } catch (IntentSender.SendIntentException e) { 
         Log.i(TAG, "PendingIntent unable to execute request."); 
        } 
        break; 
       case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 
        Log.i(TAG, "Location settings are inadequate, and cannot be fixed here. Dialog not created."); 
        break; 
      } 
     } 
    }); 
} 

private void getLocation() { 
    if (ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED 
      && ActivityCompat.checkSelfPermission(mActivity, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     return; 
    } 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == REQUEST_CHECK_SETTINGS) { 
     getLocation(); 
    } 
} 

@Override 
public void onStart() { 
    mGoogleApiClient.connect(); 
    super.onStart(); 
} 

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

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    getLocation(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    RecycleApplication.getEventBus().unregister(this); 
} 


@Override 
public void onConnectionSuspended(int i) { 

} 

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

} 

@Override 
public void onOk(DialogFragment dialogFragment) { 
    dialogFragment.dismiss(); 
    requestFineLocationPermission(); 
} 

@Override 
public void onCancel(DialogFragment dialogFragment) { 
    dialogFragment.dismiss(); 

} 

}

+0

많은 관련 리소스를 참조 했으므로 자신의 코드를 포함하고 얼마나 멀리 있는지 보도록하십시오. 어떤 오류가 발생했는지 파악하고 지원할 수 있습니다. – ishmaelMakitla

+0

위 코드를 참조하십시오. – Chetna

답변

2

죄송합니다 귀하의 질문에. , 당신은 거의 항상 API 레벨 23 이후에 위치 권한을 요청할 수 있습니다 onConnected() 함수를 호출되는 내 경험이 후

private synchronized void buildGoogleApiClient(){ 
    mGoogleApiClient = new GoogleApiClient.Builder(GTApplication.getContext()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

: 첫째, 당신은 같은 API 클라이언트를 Google에 연결을 구축 할 필요가

public void checkLocationPermission(){ 
    if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 
     // You don't have the permission you need to request it 
     ActivityCompat.requestPermissions(this, Manifest.permission.ACCESS_FINE_LOCATION), REQ_CODE); 
    }else{ 
     // You have the permission. 
     requestLocationAccess(); 
    } 
} 

onRequestPermissionsResult() 함수는 REQ_CODE과 함께 호출됩니다. 이벤트를 구현하기 위해 더 많은 정보가 필요하다면 런타임 허가를 위해 original documentation을 확인하면 매우 유용합니다. 필요한 수 있도록 위치 대화 상자가 사용자에게 표시하는 경우) 당신이 요청 코드 REQUEST_LOCATIONonActivityResult() 기능에 콜백을 얻을 것이다

public void requestLocationAccess(){ 
    LocationRequest mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval((long) (LocationHelper.UPDATE_INTERVAL_IN_MILLISECONDS*1.1)); 
    mLocationRequest.setFastestInterval(LocationHelper.UPDATE_INTERVAL_IN_MILLISECONDS); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    final LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(mLocationRequest); 
    builder.setAlwaysShow(true); //this is the key ingredient 
    com.google.android.gms.common.api.PendingResult<LocationSettingsResult> result = 
       LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 
    result.setResultCallback(new ResultCallback<LocationSettingsResult>(){ 
     @Override 
     public void onResult(@NonNull LocationSettingsResult result){ 
      if(requester != null){ 
       final Status resultStatus = result.getStatus(); 
       switch(resultStatus.getStatusCode()){ 
        case LocationSettingsStatusCodes.SUCCESS: 
         // All location settings are satisfied. You can ask for the user's location HERE 



         break; 
        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 
         // Location settings are not satisfied. But could be fixed by showing the user a dialog. 
         try{ 
          resultStatus.startResolutionForResult(this, REQUEST_LOCATION); 
          break; 
         }catch(IntentSender.SendIntentException ignored){} 
        } 
       } 
      } 
     } 
    }); 
} 

: 당신은 당신이 확인할 수있는 권한이 때
위치가 같이 사용하는 경우

이 과정을 모두 마친 후에는 locationManager.getLastKnownLocation()으로 전화하거나 위치 요청 또는 원하는 것을 시작할 수 있습니다.

추신 : 나는 더 큰 클래스에서이 코드를 잘라 냈으니, 실수를하면 언제든지 물어보십시오. 본질을 포함하고 있기 때문에 모든 것이 잘 진행되는 경우에만 지정했습니다. 예외를 스스로 처리 할 수 ​​있기를 바랍니다.

0

이 코드를 시도 : 난 그냥 당신이 요구 한 기능을 쓰고, 코드를 통과하지 않은

public void showMap() { 

    mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); 
    if (map == null) { 
     map = mapFragment.getMap(); 
    } 


    // Enable Zoom 
    map.getUiSettings().setZoomGesturesEnabled(true); 

    //set Map TYPE 
    map.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

    //enable Current location Button 
    map.setMyLocationEnabled(true); 

    LocationManager locationManager = (LocationManager)getActivity().getSystemService(getActivity().LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    String bestProvider = locationManager.getBestProvider(criteria, true); 
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    Location location = locationManager.getLastKnownLocation(bestProvider); 
    if (location != null) { 
     onLocationChanged(location); 
    } 
    locationManager.requestLocationUpdates(bestProvider, 2000, 0, this); 
} 

@Override 
public void onLocationChanged(Location location) { 

    latitude= location.getLatitude(); 
    longitude=location.getLongitude(); 

    LatLng loc = new LatLng(latitude, longitude); 

    if (marker!=null){ 
     marker.remove(); 
    } 

    marker= map.addMarker(new MarkerOptions().position(loc).title("Sparx IT Solutions")); 
    map.moveCamera(CameraUpdateFactory.newLatLng(loc)); 
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, 16.0f)); 

} 

@Override 
public void onProviderDisabled(String provider) { 

    Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
    startActivity(intent); 
    Toast.makeText(getActivity().getBaseContext(), "Gps is turned off!!", 
      Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onProviderEnabled(String provider) { 

    Toast.makeText(getActivity().getBaseContext(), "Gps is turned on!! ", 
      Toast.LENGTH_SHORT).show(); 
} 
관련 문제