我的应用程序启动时只需要一个粗略的位置服务.
详细地说,我需要应用程序的粗略位置,以便为用户提供附近的商店信息.
该位置不需要不断更新.此外,在这种情况下,粗略定位就足够了.
我希望应用程序自动选择GSM,wifi或GPS,无论哪个可用.
定位服务也应该是一次性的,以节省电话能量.
我该怎么办?
我曾尝试单独使用GPS.
我的问题是我不知道如何停止GPS的持续刷新位置功能.我不知道如何让手机从三种方法中选择一种.
非常感谢一些示例代码或想法.
GeoCoder服务不可用
我正在用它GeoCoder来获得一个AddressLocation.不幸的是,该方法引发了一场IOException saying: "Service not Available".
这个StackOverFlow线程解释了发生了什么,因为我彻底测试了它(用户权限,构建版本,重启,GeoCoding API限制等).
你可以找到的Google Play-Services(或LocationService):Android设置 - >(管理)应用程序 - >运行进程,已崩溃或停止.它重新启动,但忘记将GeoCoderService绑定到NetworkLocator.
此错误的"解决方案"是重新启动Android手机,因为在重新启动时,GeoCoderService绑定到NetworkLocater.我当然不认为这是一个解决方案.
我的问题是,LocationService如何崩溃或首先停止?
我所做的是手动强制停止Google Play服务,一些设备重新启动了LocationService,但有些设备没有.
不工作(没有重启LocationService)
工作(确实重启了LocationService)
有人知道Google Play服务(LocationService)在运行一段时间后崩溃或停止的原因是什么?
我已将此问题上报给b.Android.com,并亲自联系了Android开发人员.
我已经看到我的问题已经在其他线程中讨论过,但没有得出任何结论:
android geocoding android-location google-geocoder google-play-services
我想知道如何捕捉事件或什么时候我的LocationReqest过期,继承人代码,然后我称之为
mLocationRequest = LocationRequest.create();
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mLocationRequest.setExpirationDuration(500);
mLocationRequest.setNumUpdates(1);
mLocationClient.requestLocationUpdates(mLocationRequest, this);
Run Code Online (Sandbox Code Playgroud)
现在我需要知道我的LocationRequest是休息,ty求助:)
编辑
我以为我能抓住它
public void onLocationChanged(Location location) {
//something is here
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用:(
EDIT2
我部分解决了它通过添加处理程序检查N + 500ms如果位置设置,我仍然想知道我是否可以没有处理程序
我使用NETWORK_PROVIDER来获得latitude和longitude的地方.
我已经检查了"位置和安全性"中的设置并启用了"使用无线网络".但"isProviderEnabled(LocationManager.NETWORK_PROVIDER)"总是回来false.
谁能帮我?先感谢您!
这是我的代码:
LocationManager locManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean isEnableGPS=locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean isEnableNTW=locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
Log.d(TAG, isEnableGPS+", "+isEnableNTW);
Run Code Online (Sandbox Code Playgroud)
AndroidMainfest.xml中的权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud) 我正在设计一个应用程序,其中服务器端的应用程序需要不断了解用户位置.我正在考虑创建一个在后台运行的Android服务,并不断查询用户位置并将结果发送到后端服务器中的应用程序.但是,我想知道这是否是节省电池方面的最佳方法.例如,在iOS中,有一种称为"重大变化"的东西用于此目的,Android有类似的东西.
首先,我检查了这个答案.
我想要做的是扩展Location类调用它LocationPlus有一些成员变量.我想要实现的功能是将LocationPlus类的对象从一个活动传递到另一个活动.
这是我的 CREATOR
public static final Parcelable.Creator<LocationPlus> CREATOR = new Parcelable.Creator<LocationPlus>() {
@Override
public LocationPlus createFromParcel(Parcel source) {
return new LocationPlus(source);
}
@Override
public LocationPlus[] newArray(int size) {
return new LocationPlus[size];
}
};
Run Code Online (Sandbox Code Playgroud)
我面临的问题是这个错误
Implicit super constructor Location() is undefined. Must explicitly invoke another constructor
Run Code Online (Sandbox Code Playgroud)
在尝试编写构造函数时
public LocationPlus(Parcel in) {
Run Code Online (Sandbox Code Playgroud)
有评论的人要求我发布LocationPlus类,所以在这里
public class LocationPlus extends Location{
private int mBattery = -1;
public LocationPlus(String locationName) {
super(locationName);
}
public LocationPlus(Location location) { …Run Code Online (Sandbox Code Playgroud) 在Criteria类中,有两个常量,ACCURACY_HIGH和ACCURACY_FINE,这是显然是用来要求LocationManager返回较高精度的定位更新.以下是文档中关于每个常量的说明:
public static final int ACCURACY_FINE (在API级别1中添加)
Run Code Online (Sandbox Code Playgroud)A constant indicating a finer location accuracy requirement Constant Value: 1 (0x00000001)public static final int ACCURACY_HIGH (在API级别9中添加)
Run Code Online (Sandbox Code Playgroud)a constant indicating a high accuracy requirement - may be used for horizontal, altitude, speed or bearing accuracy. For horizontal and vertical position this corresponds roughly to an accuracy of less than 100 meters. Constant Value: 3 (0x00000003)
有谁知道这两个常数中的哪一个提供(即要求)最高准确度?
我只是想做一个简单的"教程"应用程序来获取我的手机的位置(以便在以后的其他应用程序中学习如何使用它),但我只是没有到达任何地方.
Android Developer的教程:首先,我按照Android开发者网站(developer.android.com/training/location/receive-location-updates.html)中的教程进行操作.
就像那里所示,我使用了Location,LocationClient和LocationRequest,在onCreate中初始化它们(并设置它们).LocationClient在onStart和onStop上连接和断开连接.
我在连接后请求位置更新(在onConnected中).我在进行此调用之前验证了GooglePlayServices是否可用,而且我仍然没有在"onLocationChanged"中获得任何更新.
GoogleApiClient:我注意到不推荐使用LocationClient,而首选的是LocationServices(developer.android.com/reference/com/google/android/gms/location/LocationClient.html).
如下所示:https://developer.android.com/reference/com/google/android/gms/location/FusedLocationProviderApi.html,我使用GoogleApiClient并将其设置为LocationServices(也是/sf/answers/1750969531/).所以我把它全部设置为使用它,但我仍然没有得到任何关于位置的更新.
onLocationChanged如果有响应则应该打印.我还放了一个打印位置或"没有"的按钮.
我检查了使用谷歌地图,看看我是否有一些东西,但它的工作正常.
的build.gradle
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services:5.0.77'
compile "com.android.support:support-v4:20.0.+"
}
Run Code Online (Sandbox Code Playgroud)
表现
...
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
...
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
...
Run Code Online (Sandbox Code Playgroud)
码
public class MyActivity extends Activity implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener {
private GoogleApiClient mLocationClient;
private Location mCurrentLocation;
LocationRequest mLocationRequest;
...
/* Constant fields - request interval */
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
mLocationClient …Run Code Online (Sandbox Code Playgroud) android location android-location google-api-client google-play-services
我有一个例外
java.lang.RuntimeException: Unable to start service ...
java.lang.SecurityException: Requires ACCESS_MOCK_LOCATION secure setting
Run Code Online (Sandbox Code Playgroud)
但是我有Manifest文件:
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
有什么不对?
假设我想构建一个应用程序,它定期请求当前位置(例如,每 10 分钟一次,这个数字应该是可配置的)并提交到服务器。
我知道对于这种情况通常建议使用 Foreground Service 和 WorkManager。然而哪个更适合呢?以下是我的想法和疑问。
WorkManager - 主要用于可延迟的后台工作,其执行是有保证的。但我知道从 Android 8 (API 26) 开始引入了后台位置,并且限制位置每小时只能更新几次https://developer.android.com/about/versions/oreo/background-location-limits。因此,这可能不符合定期更新的要求。
ForegroundService - 非常适合运行并需要让用户意识到的东西。出于隐私目的,建议这种情况(位置跟踪)使用。Google 还创建了一个示例应用程序来推广这种做法https://github.com/android/location-samples/tree/master/LocationUpdatesForegroundService。
从上面的分析来看,似乎ForegroundService是这样的。但是我还发现它WorkManager具有内置支持,可ForegroundService通过androidx.work.impl.foreground.SystemForegroundService https://developer.android.com/topic/libraries/architecture/workmanager/advanced/long-running#long-running-kotlin结合使用 Worker
这让我很困惑,不知道我应该使用什么,以及谷歌针对这个特定场景真正推荐的是什么。
有人有什么想法吗?
android android-location foreground-service android-architecture-components android-workmanager
android ×10
android-location ×10
android-architecture-components ×1
android-wifi ×1
geocoding ×1
gps ×1
inheritance ×1
location ×1