我正在尝试开发一个android应用程序,该应用程序使用GPS或Network获取设备经度和经度,无论该进程可用哪种。当设备的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上测试了这个应用程序,它们都有相同的结果。
Update如果你下载百度地图并启动应用程序,它会要求你授予访问位置的权限,只要确保你的位置被关闭,只需给百度地图授予位置权限,你就会注意到,即使你的全球定位系统或定位服务关闭,它也会在百度地图上显示你的位置。
发布于 2017-01-25 13:52:01
https://stackoverflow.com/questions/41852770
复制相似问题