以编程方式启用 gps 的问题

Posted

技术标签:

【中文标题】以编程方式启用 gps 的问题【英文标题】:Issue with enabling gps programmatically 【发布时间】:2019-09-01 22:45:28 【问题描述】:

我编写了一个代码来检查是否启用了 gps,如果未启用,用户会收到一个提示,要求启用 gps。单击“确定”后,gps 将自动启用。以下是我编写的用于检查 GPS 连接的代码。

private void locationPermissions() 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
            if (ContextCompat.checkSelfPermission(this,
                    android.Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) 

                ActivityCompat.requestPermissions(this,
                        new String[]android.Manifest.permission.ACCESS_FINE_LOCATION, 22);
             else 
               gpssettings(this);
            
         else 
            gpssettings(this);
        
    

private void gpssettings(Context applicationContext) 
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

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

        Task<LocationSettingsResponse> task =
                LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());
        task.addOnCompleteListener(new OnCompleteListener<LocationSettingsResponse>() 
            @Override
            public void onComplete(Task<LocationSettingsResponse> task) 
                try 
                    LocationSettingsResponse response = task.getResult(ApiException.class);
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    fireauth();
                 catch (ApiException exception) 
                    switch (exception.getStatusCode()) 
                        case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                            // Location settings are not satisfied. But could be fixed by showing the
                            // user a dialog.
                            try 
                                // Cast to a resolvable exception.
                                ResolvableApiException resolvable = (ResolvableApiException) exception;
                                // Show the dialog by calling startResolutionForResult(),
                                // and check the result in onActivityResult().
                                resolvable.startResolutionForResult(
                                        SplashScreen.this,
                                        99);
                             catch (IntentSender.SendIntentException e) 
                                // Ignore the error.
                             catch (ClassCastException e) 
                                // Ignore, should be an impossible 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;
                    
                
            
        );
    

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) 
            case 99:
                switch (resultCode) 
                    case RESULT_OK:
                        fireauth();
                        break;
                    case RESULT_CANCELED:
                        Toast.makeText(this, "Requires gps connection", Toast.LENGTH_SHORT).show();
                        finish();
                        break;
                
                break;
        
    

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 22)
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED)
                gpssettings(this);
             else 
                Toast.makeText(this, "Location permissions required", Toast.LENGTH_SHORT).show();
                finish();
            
        
    

但从过去 10 天开始,它的行为很奇怪。即使用户单击“确定”,我也会在 activityResult 中得到 result_cancelled。请检查代码并判断是否有任何问题或其他问题。

【问题讨论】:

【参考方案1】:

请使用此功能强制开启 GPS 定位

分级:

实现 'com.google.android.gms:play-services:12.0.1'

public class MainActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener

    Activity activity;
    private GoogleApiClient mGoogleApiClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = this;

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();

        if (!mGoogleApiClient.isConnected()) 
            mGoogleApiClient.connect();
            locationChecker(mGoogleApiClient);
        
    

    @Override
    public void onConnected(@Nullable Bundle bundle) 

    

    @Override
    public void onConnectionSuspended(int i) 

    

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 

    

    public void locationChecker(GoogleApiClient mGoogleApiClient) 
        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);
        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:
                        // 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, 1000);

                         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;
                
            


        );
    

【讨论】:

没用,还是一样。 请使用这个最终的 LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) // 禁用 else // 启用 我应该在哪里添加这些行? 应用程序的任何屏幕,您要在其中检查 GPS 的开启或关闭。

以上是关于以编程方式启用 gps 的问题的主要内容,如果未能解决你的问题,请参考以下文章

ICS Android以编程方式启用gps?

以 Android 编程方式启用 GPS(无需导航到位置设置)

如何在 Android 中以编程方式启用禁用 GPS? [复制]

如何在Android上以编程方式启用或禁用GPS?

如何在Android 6.x上以编程方式启用或禁用GPS?

像 Ola Cabs Android 应用程序一样以编程方式打开 GPS