请求位置服务 Android

Posted

技术标签:

【中文标题】请求位置服务 Android【英文标题】:Requesting for Location Services Android 【发布时间】:2016-09-24 14:43:17 【问题描述】:

我正在使用此代码让用户激活位置服务。我想显示用户对话框以接受以启用位置服务,然后将它们重定向到 LOCATION_SETTINGS 页面。但是如果没有用户从用户那里接受它,它就会重定向到位置设置。

if(lm==null)
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
try
    gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
catch(Exception ex)
try
    network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
catch(Exception ex)

if(!gps_enabled && !network_enabled)
    dialog = new AlertDialog.Builder(this);
    dialog.setMessage(this.getResources().getString(R.string.gps_network_not_enabled));
    dialog.setPositiveButton(this.getResources().getString(R.string.open_location_settings), new DialogInterface.OnClickListener() 

        @Override
        public void onClick(DialogInterface paramDialogInterface, int paramInt) 
            // TODO Auto-generated method stub
            Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(myIntent);
            //get gps
        
    );
    dialog.setNegativeButton(this.getString(R.string.Cancel), new DialogInterface.OnClickListener() 

        @Override
        public void onClick(DialogInterface paramDialogInterface, int paramInt) 
            // TODO Auto-generated method stub
            finish();
        
    );
    dialog.show();


【问题讨论】:

【参考方案1】:

据我了解,您尝试启用该位置。

您可以显示一个对话框来启用该位置,而不是将它们重定向到 LOCATION_SETTING 页面。

一步一步的过程。

首先你需要设置一个 GoogleApiClient 并实现 GoogleApiClient CallBackMethods。

protected synchronized void buildGoogleApiClient() 
        mGoogleApiClient = new Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();
        mGoogleApiClient.connect();   

回调方法

@Override
public void onConnected(Bundle bundle) 
    Log.d("OnConnected", "Connection successful");
    settingsrequest();


@Override
public void onConnectionSuspended(int i) 
    mGoogleApiClient.connect();


@Override
public void onConnectionFailed(ConnectionResult connectionResult) 
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " + connectionResult.getErrorCode());

googleapiclient 连接后,onconnected 方法将调用,settingsRequest 方法将调用。

protected static final int REQUEST_CHECK_SETTINGS = 0x1;
LocationRequest locationRequest;


public void settingsrequest() 
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setNumUpdates(1);
    locationRequest.setExpirationDuration(20000);
    locationRequest.setFastestInterval(500);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
    builder.setAlwaysShow(true); //this is the key ingredient
    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();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) 
                case LocationSettingsStatusCodes.SUCCESS: 
                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this);
                
                // 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(MainTab.this, 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;
            
        
    );

status.startResolutionForResult(MainTab.this, REQUEST_CHECK_SETTINGS) 将显示一个对话框请求位置。

@Override
protected 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:
                    LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this);
                    break;
                case Activity.RESULT_CANCELED:
                    break;
            
            break;
    

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, locationRequest, this) 将为已更改的位置设置监听器。

随着位置的改变,onLocationChanged 方法将被调用。

 @Override
public void onLocationChanged(Location location) 
      prevLocation  = location;
      //Do you work

希望对您有所帮助。

【讨论】:

以上是关于请求位置服务 Android的主要内容,如果未能解决你的问题,请参考以下文章

从服务访问android位置?

Android O 在打盹模式下前台服务未接收位置更新

识别调用位置服务的应用程序 - Android 位置框架

如何使用服务来使用位置数据?

屏幕关闭时,Android 10 会阻止网络请求和 GPS 呼叫

考虑到电池,Android 在后台重复获取位置的最佳方法