标签: android-location

我们如何监听 Android 中的位置权限变化(不触发权限请求)?

甚至有可能吗?我希望能够创建一个侦听器,该侦听器将收到有关位置权限更改的通知(无论应用程序是否触发它们)。据我所知,有获取当前权限状态的方法和请求权限的方法,但没有任何方法可以简单地允许应用程序监听更改。

例如,在 iOS 中,我们可以在 a 上设置一个委托,CLLocationManager然后通过locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)在授权状态的任何更改上调用该委托。有谁知道 Android 中的任何等价物(最好与 API >= 17 兼容)?

java android android-location kotlin android-fusedlocation

7
推荐指数
1
解决办法
3838
查看次数

Android Q 中引入的 ACCESS_BACKGROUND_LOCATION 对地理围栏 API 有何影响?

为了使用地理围栏 API,用户必须向应用程序提供ACCESS_FINE_LOCATION. 这个位置被认为是危险的,可以随时撤销;一旦此权限被撤销,应用程序将无法请求地理围栏更新。

ACCESS_BACKGROUND_LOCATION这张图片中的权限如何?我们确信这种​​许可也是危险的,并且可以随时撤销。是不是说如果我们要在IntentService每次geofence变化发生时注册一些被调用的,还要确保用户已经提供了ACCESS_BACKGROUND_LOCATION权限?还是当我们尝试在自己的后台 Service/BroadcastReceiver 中获取当前位置时才需要使用此权限?

我问这个问题的原因是文档在这一点上似乎有点含糊:描述Q Developer Preview的文档提到地理围栏是后台位置检索的用例之一,而地理围栏API 页面确实如此ACCESS_BACKGROUND_LOCATION在它的要求中没有提到。

android android-location android-geofence android-10.0

7
推荐指数
2
解决办法
8671
查看次数

Android 10 (Q) 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)

如果可能,我需要唯一的权限选项是“始终允许”。检查和设置权限时如何设置?

java android android-location

7
推荐指数
1
解决办法
8948
查看次数

什么位置提供商"被动"?在Android 2.2上看到HTC Desire

在我进入基于位置的模式之前,我通过调用检查是否存在任何位置提供者

List<String> android.location.LocationManager.getProviders(boolean enabledOnly) //enabledOnly = true
Run Code Online (Sandbox Code Playgroud)

并检查结果列表的大小.

现在我在Android 2.2的HTC Desire上测试了我的应用程序.系统设置不允许任何位置跟踪(GPS和移动设备已关闭).

但是,返回的列表有1个条目,其值为"被动".它是什么?我可以使用它吗?提供者似乎很慢/不工作.

android locationmanager android-location

6
推荐指数
1
解决办法
6102
查看次数

MyLocationOverlay dispatchTap()不会传播

我有MapView一些叠加和一个子类,MyLocationOverlay因为我希望用户当前位置显示在其他标记之上.

我正在处理onTap事件,标记显示一个面板,其中包含点击标记的信息,如果在标记之外(即使在位置标记中)点击,面板应该隐藏.

如果我点击标记或空白点一切都很好,面板会按预期显示或隐藏,但如果我点击位置标记没有任何反应(如果位置标记位于另一个标记上,则信息不会显示,如果它在外面,信息显示它不隐藏).

在我的MyLocationOverlay重写dispatchTap()函数中,使其返回false,如文档中所述:

返回:如果处理此点击,则返回true; 如果应该将其发送到其他叠加层,则为false.

但仍然无法正常工作,即使我试过以及以防万一也没有...

有人知道如何将onTap事件传播到其他叠加层吗?

android android-maps android-location

6
推荐指数
1
解决办法
682
查看次数

为什么locationmanager使用新的gettime-timestamp返回旧的位置修复?

我们有一个应用程序,在用户操作尝试获取位置修复.它可以监听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分钟的地方.

这使得很难准确地确定手机的位置......

android locationmanager android-location

6
推荐指数
1
解决办法
2513
查看次数

我可以完全在后台服务中运行Android GeoFencing吗?

我有一个几乎不需要用户交互的应用程序,但需要Geofences.我可以在后台服务中完全运行吗?

首次运行服务时会有一个Activity.此Activity将启动一个服务并为BOOT_COMPLETED注册一个BroadcastReceiver,因此该服务将在启动时启动.此活动不太可能再次运行.

该服务将设置警报定期关闭,这将导致IntentService从网络下载位置列表.然后,此IntentService将围绕这些位置设置Geofences,并创建PendingIntents,这些PendingIntents将在接近位置时触发.反过来,那些PendingIntents将导致另一个IntentService采取一些行动.

所有这些都需要在后台进行,除了在安装后第一次启动Activity之外没有用户交互.因此,Activity不会与LocationClient或任何位置服务进行交互.

我实际上已经使用proximityAlerts设置了这个设置,但是出于电池寿命的原因,我希望转向新的Geofencing API.但是,我听说在服务中使用LocationClient可能会有一些问题.具体来说,我听到了(抱歉,没有参考,只是传闻声称):

  • 位置客户端依赖于ui可用性来进行错误处理
  • 当从后台线程调用时,LocationClient.connect()假定它是从主ui线程(或带有事件循环器的其他线程)调用的,所以如果我们从后台线程中运行的服务调用此方法,则永远不会调用连接回调

当我调查时,我看不出有什么理由会这样,或者为什么它会阻止我做我想做的事情.我希望它几乎可以替代proximityAlerts ...

任何人都可以对这里的事情有所了解吗?

android-location android-geofence

6
推荐指数
1
解决办法
2728
查看次数

需要Android活动等到GPS位置获得

对不起我的英语不好.我正试图从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)

gps android wait android-location android-activity

6
推荐指数
1
解决办法
1万
查看次数

requestLocationUpdates()在单独的Thread中

我需要requestLocationUpdates()在一个单独的线程中,以便不阻止我的应用程序的其余部分(它将在大多数时间运行).最好的方法是什么?

android location android-location

6
推荐指数
1
解决办法
3153
查看次数

检测位置的"蓝牙扫描"是否已打开

从Android M开始,如果您在位置设置中启用了蓝牙扫描选项,即使全局位置已关闭,也可以在后台扫描蓝牙设备(请参见屏幕截图).

要扫描BLE设备,必须满足以下条件:

  • COARSE_LOCATIONFINE_LOCATION许可.

以下之一:

  • 启用全局位置选择器.
  • 启用蓝牙扫描选项(见屏幕截图).

我可以检查授予权限和位置选择器的状态就好了.我无法做到的是弄清楚如何检查Bluetooth Scanning选项的状态?

任何见解都非常感谢!

棉花糖蓝牙扫描选项

android bluetooth android-location bluetooth-lowenergy android-bluetooth

6
推荐指数
1
解决办法
859
查看次数