1

我和其他几个人正在开发一个适用于 android 的应用程序。它需要在纬度和经度上定位设备。我们已经能够创建一个位置对象,但该对象始终是空白的。我们甚至尝试在一个完全空的项目中重新创建代码,但这也失败了。这是我们的根活动:

package com.app.Locationtest;

import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;

public class locationtest extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LocationManager locman =(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
        Location loc = locman.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        if (loc==null)
        {
           finish();
        }
    }
}

这是清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.app.Locationtest"
      android:versionCode="1"
      android:versionName="1.0">
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_GPS" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".locationtest"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="8" />

</manifest> 

我们如何解决这个问题?

4

2 回答 2

1

getLastKnownLocation() javadoc 说:“.. 如果提供者当前被禁用,则返回 null。”

所以它依赖于 GPS 但它并没有打开它。它用于搭载使用 GPS 的其他应用程序。

于 2010-11-05T19:00:14.060 回答
0

有时设备需要太多时间来检索位置,这是检索android 网站上列出的位置的流程:

  1. 开始申请。
  2. 稍后,开始侦听来自所需位置提供商的更新。
  3. 通过过滤掉新的但不太准确的修复来保持“当前的最佳估计”位置。
  4. 停止监听位置更新。
  5. 利用最后的最佳位置估计。

我使用自定义位置侦听器并开始侦听位置更新,因为我的应用程序已初始化,即使我没有显示地图:

locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
locationListener = new CustomLocationListener(); 
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

我有一个线程正在监听位置,所以当用户点击并调用我的地图视图时,如果位置为空,我们会向用户发送一条消息,等待我们检索他的位置。

您可能想开发一种方法来选择更好的位置,因为最后一个位置可能不是最佳位置,请尝试以下操作:

private static final int TWO_MINUTES = 1000 * 60 * 2;

/** Determines whether one Location reading is better than the current Location fix
  * @param location  The new Location that you want to evaluate
  * @param currentBestLocation  The current Location fix, to which you want to compare the new one
  */
protected boolean isBetterLocation(Location location, Location currentBestLocation) {
    if (currentBestLocation == null) {
        // A new location is always better than no location
        return true;
    }

    // Check whether the new location fix is newer or older
    long timeDelta = location.getTime() - currentBestLocation.getTime();
    boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
    boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
    boolean isNewer = timeDelta > 0;

    // If it's been more than two minutes since the current location, use the new location
    // because the user has likely moved
    if (isSignificantlyNewer) {
        return true;
    // If the new location is more than two minutes older, it must be worse
    } else if (isSignificantlyOlder) {
        return false;
    }

    // Check whether the new location fix is more or less accurate
    int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
    boolean isLessAccurate = accuracyDelta > 0;
    boolean isMoreAccurate = accuracyDelta < 0;
    boolean isSignificantlyLessAccurate = accuracyDelta > 200;

    // Check if the old and new location are from the same provider
    boolean isFromSameProvider = isSameProvider(location.getProvider(),
            currentBestLocation.getProvider());

    // Determine location quality using a combination of timeliness and accuracy
    if (isMoreAccurate) {
        return true;
    } else if (isNewer && !isLessAccurate) {
        return true;
    } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
        return true;
    }
    return false;
}

/** Checks whether two providers are the same */
private boolean isSameProvider(String provider1, String provider2) {
    if (provider1 == null) {
      return provider2 == null;
    }
    return provider1.equals(provider2);
 }

此代码在我链接的同一页面上提供。

希望这可以帮助!

于 2011-11-19T13:43:25.183 回答