TEL:400-8793-956
当前位置:程序、服务器

网络提供商和GPS提供商一起工作,需要根据可用的提供商将两者分开

提问者: 近期获赞: 浏览人数: 发布时间:2021-01-26 13:48:24

 问:我正在尝试开发一个Android应用程序,该应用程序可使用GPS或网络提供商获取设备的经度和纬度,以适用于该过程的方式为准。当设备的GPS开启时,该代码可以正常工作,但不幸的是,当设备的GPS关闭时,该代码永远无法工作。

 
例如,我想根据可用的提供程序获取设备的纬度和经度。如果设备的GPS处于打开状态,则应使用GPS提供程序获取设备的纬度和经度;如果GPS已关闭,则应使用网络提供者获取设备的纬度和经度。在我的情况下,网络提供商始终返回false,并且仅在设备的GPS开启时才起作用,因为它不应该打扰设备GPS的开启或关闭,它应该只是根据网络提供商获取经度和纬度。
 
我使用了Google的融合API,但即使遇到了同样的问题,我也只能使用GPS提供程序来获取经度和纬度,而当我关闭设备的GPS时,它永远不会使用网络提供程序来返回所需的经度和纬度,因为关闭设备的GPS时,GPS提供商均返回false。
 
GPS和网络提供商都在使用设备的GPS,我想分别将它们的过程分开。
 
我正在使用以下权限和功能
 
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.LOCATION_HARDWARE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-feature android:name="android.hardware.location" android:required="true"/>
<uses-feature android:name="android.hardware.location.network" android:required="true"/>
<uses-feature android:name="android.hardware.location.gps" android:required="true"/>
以下是我完整的Java代码,在GPS和网络情况下,该代码仅在设备的GPS开启时才有效。
 
package com.example.administrator.locationgetter;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
    public static final int MY_PERMISSIONS_REQUEST = 0;
    LocationManager locationManager;
    private LocationListener mLocationListener;
    private void showStatus(String st)
    {
        Toast.makeText(MainActivity.this,st,Toast.LENGTH_SHORT).show();
    }
    private LocationListener createLocationListener() {
        return new LocationListener() {
            @Override
            public void onLocationChanged(Location location) {
                // Called when a new location is found by the network location provider.
                Toast.makeText(MainActivity.this,"accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude(),Toast.LENGTH_SHORT).show();
            }
            public void onStatusChanged(String provider, int status, Bundle extras) {
                showStatus(provider + " -- " + status);
            }
            public void onProviderEnabled(String provider) {
                showStatus(provider + " -- " + "ENABLED!");
            }
            public void onProviderDisabled(String provider) {
                showStatus(provider + " -- " + "DISABLED!");
            }
        };
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        //setSupportActionBar(toolbar);
        mLocationListener = createLocationListener();
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
    @Override
    public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
                    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);
                } else {
                    Toast.makeText(MainActivity.this, "So sad! Give me the damn permissions!", Toast.LENGTH_SHORT).show();
                }
                return;
            }
        }
    }
    public void btnLocation(View v) {
        if ((ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED )){
            showStatus("Give me the permissions man!");
            ActivityCompat.requestPermissions(this,
                    new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST);
        }
        else
        {
            showStatus("Already have permission");
            locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
            String locationProvider = LocationManager.NETWORK_PROVIDER;
            Location location = locationManager.getLastKnownLocation(locationProvider);
            if(location != null)
            {
                Toast.makeText(MainActivity.this,"accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude(),Toast.LENGTH_SHORT).show();
            }
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);
        }
    }
    public void btnLocation1(View v) {
        if ((ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED )){
            showStatus("Give me the permissions man!");
            ActivityCompat.requestPermissions(this,
                    new String[]{ Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
                    MY_PERMISSIONS_REQUEST);
        }
        else
        {
            showStatus("Already have permission");
            locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
            String locationProvider = LocationManager.GPS_PROVIDER;
            Location location = locationManager.getLastKnownLocation(locationProvider);
            if(location != null)
            {
                Toast.makeText(MainActivity.this,"accuracy: " + location.getAccuracy() + " lat: " + location.getLatitude() + " lon: " + location.getLongitude(),Toast.LENGTH_SHORT).show();
            }
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        }
    }
}
我已经在KitKat,Lollipop和Marshmallow上测试了该应用程序,所有结果均相同。
 
如果您下载了百度地图并启动了应用程序,它将要求您授予位置访问权限,只需确保您的位置已关闭,然后简单地向百度地图授予位置权限,您就会注意到它将指向您的位置即使您的GPS或定位服务已关闭,百度地图也是如此。
 
 
答:以上问题看不出来有任何问题。
上一篇: 机器学习和人工智能将如何影响2021年及以后的市场?
下一篇: 基于聚合数据的Java对象模型的数据结构和设计?