甚至有可能吗?我希望能够创建一个侦听器,该侦听器将收到有关位置权限更改的通知(无论应用程序是否触发它们)。据我所知,有获取当前权限状态的方法和请求权限的方法,但没有任何方法可以简单地允许应用程序监听更改。
例如,在 iOS 中,我们可以在 a 上设置一个委托,CLLocationManager然后通过locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)在授权状态的任何更改上调用该委托。有谁知道 Android 中的任何等价物(最好与 API >= 17 兼容)?
为了使用地理围栏 API,用户必须向应用程序提供ACCESS_FINE_LOCATION. 这个位置被认为是危险的,可以随时撤销;一旦此权限被撤销,应用程序将无法请求地理围栏更新。
ACCESS_BACKGROUND_LOCATION这张图片中的权限如何?我们确信这种许可也是危险的,并且可以随时撤销。是不是说如果我们要在IntentService每次geofence变化发生时注册一些被调用的,还要确保用户已经提供了ACCESS_BACKGROUND_LOCATION权限?还是仅当我们尝试在自己的后台 Service/BroadcastReceiver 中获取当前位置时才需要使用此权限?
我问这个问题的原因是文档在这一点上似乎有点含糊:描述Q Developer Preview的文档提到地理围栏是后台位置检索的用例之一,而地理围栏API 页面确实如此ACCESS_BACKGROUND_LOCATION在它的要求中没有提到。
我需要用户检查并设置对 ACCESS_BACKGROUND_LOCATION(“始终允许”)的权限,而没有“仅在使用应用程序时允许”选项。即使应用程序被最小化,我的 GPS 跟踪应用程序也需要继续访问位置。
我已经有权限为 Android 9 的 ACCESS_FINE_LOCATION 工作。
AndroidManifest.xml--------------------------------------------------->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
TrackingActivity.java (need to include ACCESS_BACKGROUND_LOCATION)---->
private void permissionCheck1() {
int permissionCheck1 = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck1 != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
} else {
grantedSetupGPSandMap();
}
}
Run Code Online (Sandbox Code Playgroud)
如果可能,我需要唯一的权限选项是“始终允许”。检查和设置权限时如何设置?
在我进入基于位置的模式之前,我通过调用检查是否存在任何位置提供者
List<String> android.location.LocationManager.getProviders(boolean enabledOnly) //enabledOnly = true
Run Code Online (Sandbox Code Playgroud)
并检查结果列表的大小.
现在我在Android 2.2的HTC Desire上测试了我的应用程序.系统设置不允许任何位置跟踪(GPS和移动设备已关闭).
但是,返回的列表有1个条目,其值为"被动".它是什么?我可以使用它吗?提供者似乎很慢/不工作.
我有MapView一些叠加和一个子类,MyLocationOverlay因为我希望用户当前位置显示在其他标记之上.
我正在处理onTap事件,标记显示一个面板,其中包含点击标记的信息,如果在标记之外(即使在位置标记中)点击,面板应该隐藏.
如果我点击标记或空白点一切都很好,面板会按预期显示或隐藏,但如果我点击位置标记没有任何反应(如果位置标记位于另一个标记上,则信息不会显示,如果它在外面,信息显示它不隐藏).
在我的MyLocationOverlay重写dispatchTap()函数中,使其返回false,如文档中所述:
返回:如果处理此点击,则返回true; 如果应该将其发送到其他叠加层,则为false.
但仍然无法正常工作,即使我试过以及以防万一也没有...
有人知道如何将onTap事件传播到其他叠加层吗?
我们有一个应用程序,在用户操作尝试获取位置修复.它可以监听GPS和网络,并且具有基于时间/准确度的决策矩阵,以确定何时停止收听以及返回什么修复.
我们偶尔会注意到一种非常奇怪的行为.我们使用经典的方式来查看修复程序的年龄,如下所示:
long age = now - newLocation.getTime();
if(age >= prefs.getLocationMaxAge()){
Log.d(TAG, "location too old.");
return;
}
Run Code Online (Sandbox Code Playgroud)
但有时候,根据返回的时间戳,从操作系统返回的location.getTime的年龄可能是15-20秒,尽管我们可以肯定它已经很老了.例如,如果经度/纬度修正来自手机30分钟前的位置!
它似乎既发生在Wi-Fi和网络上,也不发生在GPS上.对我来说,这完全是疯了.有没有其他人看过这个,有什么办法吗?
我们已经在几款不同的手机上使用它,最近的一款是三星Galaxy S II.
非常欢迎帮助.
编辑:要非常清楚,问题是操作系统调用"onlocationchanged"回调,其时间戳可能是几秒钟,当我确定"新"中的经度/纬度时修复是手机至少没有使用30分钟的地方.
这使得很难准确地确定手机的位置......
我有一个几乎不需要用户交互的应用程序,但需要Geofences.我可以在后台服务中完全运行吗?
首次运行服务时会有一个Activity.此Activity将启动一个服务并为BOOT_COMPLETED注册一个BroadcastReceiver,因此该服务将在启动时启动.此活动不太可能再次运行.
该服务将设置警报定期关闭,这将导致IntentService从网络下载位置列表.然后,此IntentService将围绕这些位置设置Geofences,并创建PendingIntents,这些PendingIntents将在接近位置时触发.反过来,那些PendingIntents将导致另一个IntentService采取一些行动.
所有这些都需要在后台进行,除了在安装后第一次启动Activity之外没有用户交互.因此,Activity不会与LocationClient或任何位置服务进行交互.
我实际上已经使用proximityAlerts设置了这个设置,但是出于电池寿命的原因,我希望转向新的Geofencing API.但是,我听说在服务中使用LocationClient可能会有一些问题.具体来说,我听到了(抱歉,没有参考,只是传闻声称):
当我调查时,我看不出有什么理由会这样,或者为什么它会阻止我做我想做的事情.我希望它几乎可以替代proximityAlerts ...
任何人都可以对这里的事情有所了解吗?
对不起我的英语不好.我正试图从GPS获取一个位置以放置全局变量纬度,经度.GPS打开,但在从GPS检索数据之前,活动仍在继续.
换句话说,我的需要...方法getCurrentLocation()只有在找到位置并填充经度和纬度变量时才能完成,所以我可以在其他方法中使用它们.我知道......用户必须等待......我将在屏幕上显示一些内容.我该怎么办?谢谢
我想我正在某个地方跳过停止听GPS.哪里更好?
代码如下:
//Method to retrieve coordinates
public void getCurrentLocation() {
//Use GPS if possible
if(manager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
//assign Listener to GPS
manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
Toast.makeText(this, LocationManager.GPS_PROVIDER, Toast.LENGTH_SHORT).show();
}
else if(manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){//toherwise, use NETWORK
//assign Listener to NETWORK
manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
Toast.makeText(this, LocationManager.NETWORK_PROVIDER, Toast.LENGTH_SHORT).show();
}
}
//Class to store the location recived in two variables
final class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
//coordinates storing
latitude = String.valueOf(location.getLatitude());
longitude = String.valueOf(location.getLongitude());
Toast.makeText(getApplicationContext(), latitude + longitude, …Run Code Online (Sandbox Code Playgroud) 我需要requestLocationUpdates()在一个单独的线程中,以便不阻止我的应用程序的其余部分(它将在大多数时间运行).最好的方法是什么?
从Android M开始,如果您在位置设置中启用了蓝牙扫描选项,即使全局位置已关闭,也可以在后台扫描蓝牙设备(请参见屏幕截图).
要扫描BLE设备,必须满足以下条件:
COARSE_LOCATION或FINE_LOCATION许可.以下之一:
我可以检查授予权限和位置选择器的状态就好了.我无法做到的是弄清楚如何检查Bluetooth Scanning选项的状态?
任何见解都非常感谢!
android bluetooth android-location bluetooth-lowenergy android-bluetooth
android-location ×10
android ×9
java ×2
android-10.0 ×1
android-maps ×1
bluetooth ×1
gps ×1
kotlin ×1
location ×1
wait ×1