我正在構建一個應用程序,我需要獲取用戶的當前位置。該過程是我想先檢查用戶的Android版本的SDK版本是否爲23 - 棉花糖,如果是,則請求許可。獲得用戶的當前位置一次有權限
如果用戶允許,它將啓用或打開該位置。如果用戶拒絕,它會再次請求。
然而,如果用戶的Android版本低於23然後前進到處理:
應用程序獲取的位置,然後存儲的緯度和經度爲雙變量,並且可以訪問其他的方法。
你能告訴我如何正確實現這個功能嗎?像一步一步的過程。由於
我正在構建一個應用程序,我需要獲取用戶的當前位置。該過程是我想先檢查用戶的Android版本的SDK版本是否爲23 - 棉花糖,如果是,則請求許可。獲得用戶的當前位置一次有權限
如果用戶允許,它將啓用或打開該位置。如果用戶拒絕,它會再次請求。
然而,如果用戶的Android版本低於23然後前進到處理:
應用程序獲取的位置,然後存儲的緯度和經度爲雙變量,並且可以訪問其他的方法。
你能告訴我如何正確實現這個功能嗎?像一步一步的過程。由於
public class MainActivity extends ActionBarActivity implements
ConnectionCallbacks, OnConnectionFailedListener {
...
@Override
public void onConnected(Bundle connectionHint) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
mGoogleApiClient);
if (mLastLocation != null) {
mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
}
}}
onConnected是您實現GoogleApiClientCallback方法後,你得到的回調。以上方法只會取得最後一個已知位置的經緯度。請參閱@jitesh mohite回答的先決條件
以下將是這將解決您的問題
私有靜態最終詮釋PERMISSION_REQUEST_CODE = 1;
//用於檢查和MARSHMELLOW要求運行許可,並開始位置
private void requestRunTimePermissionAndStartTracking() {
if (Build.VERSION.SDK_INT >= 23) {
// Marshmallow+
if (!checkPermission(getBaseContext())) {
requestPermission(mActivity, PERMISSION_REQUEST_CODE);
} else {
// get location here
}
} else {
// get location here
}
}
// check whether we are having location permission for marshmellow
public static boolean checkPermission(Context context) {
int result = ContextCompat.checkSelfPermission(context, Manifest.permission
.ACCESS_FINE_LOCATION);
if (result == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
// used to request for location permission.
public static void requestPermission(Activity activity , int code) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission
.ACCESS_FINE_LOCATION)) {
Toast.makeText(activity, "GPS permission allows us to access location data. Please allow " +
"in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission
.ACCESS_FINE_LOCATION, Manifest.permission
.ACCESS_COARSE_LOCATION}, code);
}
}
的跟蹤,如果用戶接受下面的代碼在MARSHMELLOW設備覆蓋位置請求
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Util.showToast(getBaseContext(), getBaseContext().getString(R.string
.loc_permission_granted));
Util.startActivityAndLocationTracking(getApplicationContext());
} else {
Util.showToast(getBaseContext(), getBaseContext().getString(R.string
.loc_permission_denied));
}
break;
default:
break;
}
}
使用下面的類來獲得當前位置:
public class GPSTracker extends Service implements LocationListener {
// 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 = 3000; // 3 seconds
private final Context mContext;
// Declaring a Location Manager
protected LocationManager locationManager;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
Fragment frag;
public GPSTracker(Context context, Fragment frag) {
this.mContext = context;
this.frag = frag;
getLocation();
}
@SuppressWarnings("ResourceType")
public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
//
// Toast.makeText(mContext,"no network provider is enabled",Toast.LENGTH_SHORT).show();
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {
locationManager.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
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);
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;
}
@Override
public void onLocationChanged(Location location) {
this.location = location;
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
public double getLatitude() {
if (location != null) {
latitude = location.getLatitude();
}
return latitude;
}
public double getLongitude() {
if (location != null) {
longitude = location.getLongitude();
}
return longitude;
}
public boolean canGetLocation() {
return this.canGetLocation;
}
public void showSettingsAlert() {
if (mContext != null) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
alertDialog.setTitle("GPS Setting");
alertDialog
.setMessage("GPS is not enabled. Do you want to go to settings menu?");
alertDialog.setPositiveButton("Settings",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
alertDialog.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
alertDialog.show();
}
}
public void stopUsingGPS() {
if (locationManager != null) {
if (ActivityCompat.checkSelfPermission(Application.getAppContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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.
ActivityCompat.requestPermissions((Activity)mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 789);
}
locationManager.removeUpdates(GPSTracker.this);
}
}
}
然後按照提示S程序到你的活動/片段使用與運行時間許可
private void getGpsLink() {
if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)) {
Toast.makeText(getActivity(), "Location permission needed. Please allow in App Settings for additional functionality.", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getActivity().getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, 789);
}else{
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE_LOCATION);
}
} else {
GPSTracker gps = new GPSTracker(getActivity(), null);
if (gps.canGetLocation()) {
String latitude = String.valueOf(gps.getLatitude());
String longitude= String.valueOf(gps.getLongitude());
CallSearchApi();
} else {
showSettingsAlert();
}
}
}
希望它會幫助你
Donot使用android框架apis來定位,使用google服務位置apis,請看這裏:https:/ /developer.android.com/training/location/index.html –
謝謝Saurabh Srivastava,我會嘗試你的代碼,但我認爲他是對的。谷歌服務的位置apis更一致。但阿比納夫普里,你能告訴我怎麼樣? –
先生,我如何獲取用戶的位置?我需要存儲它,並且您的評論僅顯示權限請求。沒有地點給出。 –
你可以使用下面的鏈接以供參考https://developer.android.com/training/location/receive-location-updates.html –