这是我注册我的应用程序以接收位置更新的方式:
mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(Consts.ONE_MINUTE * 10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setFastestInterval(Consts.ONE_MINUTE);
Builder builder = new GoogleApiClient.Builder(context);
builder.addApi(ActivityRecognition.API);
mGoogleApiClient = builder.addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
mGoogleApiClient.connect();
....
....
@Override
public void onConnected(Bundle connectionHint) {
   LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, locationUpdatespendingInent);
}
我的待处理意图几乎在确切的请求间隔内在后台调用了......
到现在为止还挺好.
问题: 当WIFI被禁用/未连接到任何网络,或者没有启用3G/4G网络数据时 - 融合位置提供商不提供新的位置更新!!
我的位置访问设置已打开,并且会检查GPS卫星和WI-FI以及移动网络位置.
在更严重的问题:有时候在这种情况下,我通过悬而未决的意图接收位置更新回调,但最后的位置就知道(即使是一个小时前,和我在很久很久不见了远离那个地方英里)
根据以下文件PRIORITY_BALANCED_POWER_ACCURACY:
与setPriority(int)一起使用以请求"块"级别的准确性.块级精度被认为是大约100米的精度.使用诸如此类的粗略精度通常会消耗更少的功率.
我期待融合位置提供商在没有其他选择的情况下打开GPS,或者如果他没有任何选择,至少不会提供新的位置更新.
另一个不可预测和令人不安的问题:
我改变了PRIORITY_BALANCED_POWER_ACCURACY对PRIORITY_HIGH_ACCURACY中才能看到它的行为(24小时).所有间隔保持不变(更新之间间隔10分钟).即使在没有网络/ SIM卡的手机中也确实收到了准确的位置,但是 - 电池耗尽快!当我查看电池历史时,我惊讶地发现GPS无线电一直处于全传输模式!    我还在我的日志中看到每分钟收到一个位置,即使我每十分钟请求一次位置(我没有任何其他安装的应用程序打开GPS接收位置..)
我注意到在多个设备上(如摩托X 2013,HTC One X的,Nexus 5的)这种行为,所有最新的谷歌播放服务(版本6.1.11),以及Android 4.4.4奇巧
我的应用程序很大程度上取决于用户当前位置,并且只要用户登录,就会在指定的时间间隔内定期接收位置更新,因此我不想使用该PRIORITY_HIGH_ACCURACY模式,以防止电池耗尽.
我的问题:
是融合位置提供商,如果它设置为接收更新PRIORITY_BALANCED_POWER_ACCURACY并且没有任何WI-FI或手机信息塔信息,则假设完全使用GPS ?
如果确实如此,那么我做错了什么?
为什么我得到这个误导性的位置更新不正确?(正如我在"更大问题"一节中所解释的那样..
为什么GPS无线电一直打开而不是在我使用PRIORITY_HIGH_ACCURACY参数时打开10分钟?(我没有其他安装的应用程序可以更快地触发位置更新..)
gps android android-location google-play-services location-services
我正在尝试创建一个允许用户记录路线(位置/ GPS)的应用程序.为了确保即使屏幕关闭也会记录位置,我已经foreground service为位置记录创建了一个.我将位置存储在一个Room Database注入我的服务中的位置Dagger2.
但是,这项服务被Android杀死,当然这并不好.我可以订阅低内存警告,但这并没有解决我的服务在运行Android 8.0的现代高端手机上大约30分钟后被杀的根本问题
我创建了一个只有"Hello world"活动和服务的最小项目:https://github.com/RandomStuffAndCode/AndroidForegroundService
该服务在我的Application课程中启动,路由记录通过以下方式启动Binder:
// Application
@Override
public void onCreate() {
    super.onCreate();
    mComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();
    Intent startBackgroundIntent = new Intent();
    startBackgroundIntent.setClass(this, LocationService.class);
    startService(startBackgroundIntent);
}
// Binding activity
bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
// mConnection starts the route logging through `Binder` once connected. The binder calls startForeground()
我可能不需要BIND_AUTO_CREATE旗帜,我一直在测试不同的旗帜,试图不让我的服务被杀 - 到目前为止没有运气.
使用分析器看起来我没有任何内存泄漏,内存使用率稳定在~35mb:
使用adb shell dumpsys activity …
android android-service android-location android-lifecycle android-doze
在我的Android应用程序中,我需要在应用程序启动时获取用户的当前GPS位置,仅当位置与先前位置有所不同时.但问题是当我在应用程序内部如果位置改变(即如果用户在使用应用程序时旅行)应用程序从头开始.
获取用户当前位置后,我需要停止位置监听器.removeUpdates方法对我不起作用.
请帮我解决这个问题.提前致谢 !
我有一群人报告了一个我无法重现的错误.当试图打开MapView它报告getBestProvider返回null并且我知道这意味着没有找到符合我的标准的提供者,ACCURACY_COARSE如果没有GPS那么它应该回落到任何一个,network or passive但它显然不在那些用户设备.那甚至意味着GPS关闭并且没有网络连接?
我尝试关闭GPS并将手机置于飞行模式以尝试重现问题,但我仍然能够在没有强制关闭的情况下打开mapview,所以我不知道如何处理这个问题.
locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
geocoder = new Geocoder(this);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
List<String> lProviders = locationManager.getProviders(false);
for(int i=0; i<lProviders.size(); i++){
    Log.d("LocationActivity", lProviders.get(i));
}
String provider = locationManager.getBestProvider(criteria, true); // null
long minTime = 60000;
float minDistance = 5;
locationManager.requestLocationUpdates(provider, minTime, minDistance, this);
错误
java.lang.RuntimeException: Unable to start activity ComponentInfo{ecm2.android/ecm2.android.LocationActivity}: 
java.lang.IllegalArgumentException: provider==null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at …我想知道如何使用gps在车辆中使用手机获得车辆的速度.我已经读过加速度计不是很准确.另一件事是; 坐在车内时可以访问GPS.你在建筑物里会不会产生同样的效果?
这是我尝试过的一些代码,但我使用的是NETWORK PROVIDER.我将非常感谢您的帮助.谢谢...
package com.example.speedtest;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends Activity {
    LocationManager locManager;
    LocationListener li;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        locManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
        li=new speed();
        locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, li);
    }
    class speed implements LocationListener{
        @Override
        public void onLocationChanged(Location loc) {
            Float thespeed=loc.getSpeed();
            Toast.makeText(MainActivity.this,String.valueOf(thespeed), Toast.LENGTH_LONG).show();
        }
        @Override
        public void onProviderDisabled(String arg0) {}
        @Override
        public void onProviderEnabled(String arg0) {}
        @Override
        public void onStatusChanged(String arg0, int arg1, Bundle …我在这个主题上提到了很多问题,但似乎缺少一些我的要求:
~0.0001准确地获得GPS位置有没有什么办法让刚刚的坐标与上述要求?任何示例代码段都将非常感谢.
检查各种应用程序,例如"找我","Maverick",声称显示离线位置.但在没有互联网的各种情况下,他们不会跟踪位置(在印度).
我在SO内外提到了很多旧/新问题.以下几点:  
[注意:我代表我的Android团队提出这个问题,如果被要求,我们很乐意澄清细节.如果你觉得这篇文章属于Android.Stackexchange,那么请移动它.]
我正在使用requestLocationUpdates()函数进行一些测试FusedLocationApi.我使用的是PRIORITY_BALANCED_POWER_ACCURACY.城市街区精度对我来说很好.
当我请求ACCESS_FINE_LOCATION权限时,我得到一个100米的精度,这是很好的GPS关闭.由于我不需要GPS精度但是城市街区精度,我只想请求ACCESS_COARSE_LOCATION许可.但是当我申请ACCESS_COARSE_LOCATION许可时,我得到了2公里的精度.似乎设备不再使用Wifi权限,只有单元塔精度.
如何使用ACCESS_COARSE_LOCATION权限获得更好的精度?
注意:GPS我的测试设备已禁用.
permissions gps android android-location fusedlocationproviderapi
为什么我这样问:(也是在应用程序中尝试它的原因)
当我们在Lollipop中使用Google地图时会发生这种情况.即使位置已禁用,也会在用户从地图应用输入后以高精度模式打开,而无需访问"设置".
可以实现类似的功能以启用蓝牙,其中操作在我的应用程序中启动; 用户需要做出选择,但用户不会重定向到"设置",使用:
startActivity(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));  
哪个可以在BluetoothAdapter上找到,现在我们知道没有LocationAdapter,所以我环顾了gms-> LocationServices,基本上几乎所有的位置API引用,android.location.LocationManager,但似乎没有任何像ACTION_REQUEST_ENABLE现在可用.  
希望有相同的其他方法,更多人尝试过.
请注意:
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));不起作用.   
android android-location google-play-services android-settings android-5.0-lollipop
我正在使用带有LocationListener的android LocationManager库的例程requestSingleUpdate()reoutine .我试图实现的功能是用户可以按下按钮,应用程序将获取其当前位置并执行反向地理编码以获取大致地址.
我的问题是,根据设备的网络情况,获取位置可能需要很长时间.如何实现超时,导致我的'requestSingleUpdate()'放弃并告诉用户找出他们自己的血腥地址?
我的代码:
LocationManager locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setPowerRequirement(Criteria.POWER_HIGH);
locationManager.requestSingleUpdate(criteria, new LocationListener(){
        @Override
        public void onLocationChanged(Location location) {
            // reverse geo-code location
        }
        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub
        }
        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            // TODO Auto-generated method stub
        }
    }, null);
我在Android Redmi Phones版本5.1.1中遇到了Google Place Picker的问题.我使用以下代码启动Google地方选择器.
try {
       PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
                    startActivityForResult(builder.build(SelectLocationActivity.this), 1);
    } catch (Exception e) {
              e.printStackTrace();
              Toast.makeText(SelectLocationActivity.this,""+e.getMessage(),Toast.LENGTH_LONG).show();
    }
我添加了以下权限和api密钥以及google play服务版本.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application>
<meta-data
      android:name="com.google.android.gms.version"
      android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="my-api-key" />
</application>
它正在开发除Android Redmi Note2之外的所有手机.任何建议将不胜感激.提前致谢.
android android-location google-places-api google-play-services
android ×10
android-location ×10
gps ×5
android-doze ×1
geolocation ×1
location ×1
permissions ×1