【问题标题】:ANDROID: Help with LocationProviderANDROID:帮助 LocationProvider
【发布时间】:2011-04-16 23:19:22
【问题描述】:

我正在尝试获取我正在处理的应用程序的位置。但是,当它尝试选择最佳提供商时,我收到一个错误然后强制关闭。对此问题的任何帮助将不胜感激...我是否需要在 onCreate 中声明某些内容才能使其正常工作?这是一段 sn-p 代码,后面跟着错误:

public void onStart(){
    super.onStart();
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    best = locationManager.getBestProvider(criteria, true);//Selects best location provider given options between GPS and poor man's
    locationProvider = locationManager.getProvider(best);

        if (locationProvider != null) {
            locationManager.requestLocationUpdates(locationProvider.getName(), 60000, 1,
                this.locationListenerRecenterMap);
        } else {
            Log.e(TAG, "NO LOCATION PROVIDER AVAILABLE");
            Toast.makeText(this, "The GPS location provider is not available at this time.", Toast.LENGTH_SHORT).show();
            finish();
        }

    GeoPoint location = this.getLastKnownPoint();
    this.mapController.animateTo(location);
}
public void onResume(){
    super.onResume();
    locationManager.requestLocationUpdates(best, 15000, 1, (LocationListener) this);
}
public void onPause(){
    locationManager.removeUpdates((LocationListener) this);
}
private GeoPoint getLastKnownPoint(){
    GeoPoint lastKnownPoint = GeoUpdateHelper.SCRANTON;
    Location lastKnownLocation = this.locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if(lastKnownLocation != null){
    lastKnownPoint = GeoUpdateHelper.getGeoPoint(lastKnownLocation);
    }else{
        lastKnownPoint = GeoUpdateHelper.SCRANTON;
    }
    return lastKnownPoint;
}

这是错误:

04-16 19:07:25.077: ERROR/AndroidRuntime(4998): Caused by: java.lang.IllegalArgumentException: name==null
04-16 19:07:25.077: ERROR/AndroidRuntime(4998):     at android.location.LocationManager.getProvider(LocationManager.java:324)
04-16 19:07:25.077: ERROR/AndroidRuntime(4998):     at com.example.mapMain.onStart(mapMain.java:76)

编辑:这是在我的 OG Droid 上运行的。当我点击打开应用程序的地图部分时,它会强制关闭。

【问题讨论】:

    标签: android geolocation location locationmanager location-provider


    【解决方案1】:

    错误表示没有找到最佳提供者,调用getBestProvider()返回null。

    虽然您并没有真正指定任何标准,但人们会期望此调用至少返回“某物”。 javadocs有点含糊,没有提到这个方法可以返回null。 (看source code,居然可以返回null)

    但是,您的应用/设备可能没有任何可用的提供程序。 您可以执行以下调用来检查它是否返回任何提供程序(它将返回所有启用的提供程序,不考虑任何条件)?

    locationManager.getProviders(true) 
    

    假设这是应用程序的限制,请仔细检查您是否定义了以下权限,因为它们需要返回某种提供程序。

    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
    

    【讨论】:

    • 我确实确定了这些权限...也是粗略的位置。我只是不知道哪里出了问题......
    • 这是在模拟器还是真实设备上?模拟器/设备上是否启用了提供程序?
    • 呃。我遇到了和op一样的问题。我注意到关于 Google 的一件事是,似乎有人假设如果出现问题,他们的废话会返回 null,但我不确定这种行为是否已经明确
    【解决方案2】:

    在我的情况下,我在没有在系统设置中启用任何位置服务(Google 位置服务、独立 GPS 服务、VZW 位置服务)的设备上进行测试。因此requestLocationUpdates 导致应用程序崩溃。我将该代码包围在一个 try/catch 块中,应用程序不再崩溃。

    【讨论】:

    • 啊抱歉,用 catch 块包围它是什么意思?我希望您没有发现 IllegalArgumentException... 尽管这是一种不好的风格,但您可以通过检查您是否提供 NULL 来避免它。这也将节省您的性能,因此 java 处理简单检查比跳入 catch-block 更有效
    • 我听到你在说代码风格。但是这种情况下的性能效率是疏忽的。
    • 我很清楚你在某些情况下性能最重要 - 但异常处理很昂贵,所以 - 如果可以 - 尝试检查参数以避免异常比获取更快抛出的异常。一些更准确的讨论已经在stackoverflow.com/questions/299068/how-slow-are-java-exceptions IAE:也许这可以帮助你? stackoverflow.com/questions/9990129/…
    • @Chris 感谢您的信息。如果您在此处查看相机应用程序的 Android 源代码:androidxref.com/4.2.2_r1/xref/packages/apps/Camera/src/com/… 您将看到他们如何使用 try/catch 语句进行 requestLocationUpdates
    • 啊好吧,我撤回了性能卡,这里似乎真的是为了在侦听器设置时捕获异常的稳健性。 requestLocationUpdates 的 API 说: 如果条件为空,则抛出 IllegalArgumentException IllegalArgumentException 如果侦听器为空 SecurityException 如果没有合适的权限因此尽管检查权限,但如果您检查 NULL 值,绕过 catch 子句非常简单 - 但如果该方法抛出该异常,它可以捕获它。
    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2011-03-26
    • 1970-01-01
    • 2011-08-15
    相关资源
    最近更新 更多