草庐IT

android - 根据 gps 状态 android 可互换的网络和 GPS 位置提供者

coder 2023-12-05 原文

如果有人能帮助我,我将不胜感激。 我需要在我的应用程序中有一个准确的位置跟踪器,我希望它像这样。 它找到了有网络的人的第一个位置,同时我开始请求 GPS 定位。当 gps 给我一个位置时,我不想再听网络位置了。之后我只想从网络请求一个位置,并且只有在 Gps 不固定的情况下(不能给我一个位置)。当 Gps 再次固定时,我想停止收听网络,这是我想实现的循环,因为 GPS 更准确,我想将网络定位作为备份。 我看过这篇文章,但我似乎无法理解如何使其适应我的需要,

How can I check the current status of the GPS receiver?

需要想法,提前感谢 Stackoverflow 社区。

最佳答案

<强>1。停止监听网络位置更新: 这样做非常简单。只需调用

your_loc_manager.removeUpdates(network_location_listener);

<强>2。如果 GPS 提供商未提供任何修复,则从网络提供商处获取位置 您可以尝试下面给出的方法(而不是计时器,您可以尝试使用 GpsStatus Listener ...)

在获取网络提供商更新的方法中

boolean network_enabled ;
try {
    network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {
    ex.printStackTrace();
}

if(!network_enabled)
    return;

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener);

return;

获取GPS位置的方法内部

boolean gps_enabled;
try {
    gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {
    ex.printStackTrace();
}

if(!gps_enabled) {
    // call your method for getting network location updates 
    return;
}

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
new Timer().schedule(new TimerTask() {

    @Override
    public void run() {
        // You should call your method of getting Network locations based on some 
        // condition which would tell whether you really need to ask for network location 

    }
}, 20000 /* Time Value after which you want to stop trying for GPS and switch to Network*/); 

编辑 1:

此外“我不需要知道何时从 GPS 获取更新,我需要知道何时从网络获取更新(我的意思是我需要知道 gps 何时搜索,而不是何时修复)。以及如何控制网络和GPS之间的互换性"

...如果修复已丢失,那么您只需要查找网络更新,所以我建议您调用

if (hasGPSFix) { 
    Log.i("GPS","Fix Lost (expired)"); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 2000, 10, locationListener); //===> new line which I am suggesting  
} 
hasGPSFix = false;

这样,您将从网络获取位置更新,而 GPS 将继续尝试修复。一旦实现 GPS 定位 hasGPSFix 将更改其值,并且所述链接中的现有代码将停止寻找网络更新。至少这是我能理解的你想要实现的目标。可能是我没有完全理解你。

编辑 2: 这是我处理 GPS 和 NETWORK 提供商的类(class)

mapActivity 或任何需要获取位置更新的地方,您需要创建此 MyLocation 类的实例。此外,要继续获取位置更新,您需要在调用 Activity 中实现 LocationResultpublic abstract void gotLocation(Location location, boolean isGpsData); 会告诉你刚才收到的更新是来自网络还是来自 GPS。此外,如果从 GPS 返回数据,它会自动关闭网络监听器。如果您需要来自 GPS 等的数据,则需要调用 getFineLocation() 方法。您将需要根据您的目的增强给定的代码(就像您需要增强 closeListeners() 方法以在您只想删除网络更新时仅关闭一个提供者等...),但它提供了您想要的基本实现(当然还有 GpsStatus.Listener 实现,因此两者结合起来应该可以很好地满足您的目的)。

public class MyLocation {
    LocationManager locManager;
    LocationResult locationResult;
    boolean gps_enabled = false;
    boolean network_enabled = false;

    public boolean getCoarseLocation(Context context, LocationResult result) {
    locationResult = result;
    if(locManager == null)
        locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    try {
        network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    } catch(Exception ex) {
        ex.printStackTrace();
    }

    if(!network_enabled)
        return false;

    locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener);
    return true;
    }

    public boolean getFineLocation(Context context, LocationResult result) {
    locationResult = result;
    if(locManager == null)
        locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

    try {
        gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    } catch(Exception ex) {

    }

    if(!gps_enabled)
        return false;//No way to get location data

    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 100, locationListenerGps);
    return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
    public void onLocationChanged(Location location) {
        locationResult.gotLocation(location,true);
        locManager.removeUpdates(networkLocationListener);
    }
    public void onProviderDisabled(String provider) {}
    public void onProviderEnabled(String provider) {}
    public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    LocationListener networkLocationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
        locationResult.gotLocation(location,false);
    }
    public void onProviderDisabled(String provider) {}
    public void onProviderEnabled(String provider) {}
    public void onStatusChanged(String provider, int status, Bundle extras) {}
    };

    public void closeListeners() {
    if(locManager == null)
        return;

    if(locationListenerGps != null)
        locManager.removeUpdates(locationListenerGps);
    if(networkLocationListener != null)
        locManager.removeUpdates(networkLocationListener);
    }

    public static abstract class LocationResult {
    public abstract void gotLocation(Location location, boolean isGpsData);
    }

    public static boolean hasNetworkProvider(Context mContext) {
    List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false);
    return myProvidersList.contains("network");
    }

    public static boolean hasGPSProvider(Context mContext) {
    List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false);
    return myProvidersList.contains("gps");
    }
}

关于android - 根据 gps 状态 android 可互换的网络和 GPS 位置提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656489/

有关android - 根据 gps 状态 android 可互换的网络和 GPS 位置提供者的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  5. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

  8. ruby-on-rails - 为模型创建状态属性 - 2

    我想为我的Task模型创建一个status属性,该属性将按以下顺序指示它在三部分进度中的位置:打开=>进行中=>完成。它的工作方式类似于亚马逊包裹的交付方式:已订购=>已发货=>已交付。我想知道设置此属性的最佳方法是什么。我可能是错的,但创建三个独立的bool属性似乎有点多余。实现此目标的最佳方法是什么? 最佳答案 Rails4有一个内置的enummacro.它使用单个整数列并映射到键列表。classOrderenumstatus:[:ordered,:shipped,:delivered]end状态映射如下:{ordered:0,

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. ruby - 如何根据长度将路径数组转换为嵌套数组或散列 - 2

    我需要根据字符串路径的长度将字符串路径数组转换为符号、哈希和数组的数组给定以下数组:array=["info","services","about/company","about/history/part1","about/history/part2"]我想生成以下输出,对不同级别进行分组,根据级别的结构混合使用符号和对象。产生以下输出:[:info,:services,about:[:company,history:[:part1,:part2]]]#altsyntax[:info,:services,{:about=>[:company,{:history=>[:part1,:pa

随机推荐