我正在尝试使用Geocoder类将GeoCode当前的Lat / Long数据反转到管理区域和子管理区域。 我使用NETWORK_PROVIDER作为位置提供程序。这是我使用的代码,它的工作原理。问题是有时候它不会给我任何位置。
我正在使用的Android Manifest权限。
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
以下是其他代码,它不时给我正确的位置,但其他时间没有。
double latPoint = 0;
double lngPoint = 0;
List<Address> myList = null;
getApplicationContext();
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Location recentLoc = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (recentLoc != null){
latPoint = recentLoc.getLatitude();
lngPoint = recentLoc.getLongitude();
Geocoder myLocation = new Geocoder(getApplicationContext(), Locale.getDefault());
if (myLocation != null){
try {
myList = myLocation.getFromLocation(latPoint, lngPoint, 1);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (myList.size()> 0){
String AdminArea = myList.get(0).getAdminArea();
String SubAdminArea = myList.get(0).getSubAdminArea();
String Zipcode = myList.get(0).getPostalCode();
String urlocation = SubAdminArea + ", " + AdminArea + " " + Zipcode;
Context context1 = getApplicationContext();
int duration1 = Toast.LENGTH_LONG;
CharSequence text1 = urlocation;
Toast toast1 = Toast.makeText(context1, text1, duration1);
toast1.show();
}
}
网络提供商是否有限制请求位置数据的频率?
如何确保每次运行时都可以为我提供有效的位置数据。
提前感谢您对此的任何见解。
PS:我在运行Froyo 2.2(Verizon Wireless)的真实设备上运行此代码。目标API等级8.
这是我从调试中得到的。
始终提取纬度经度,但getFromLocation通常会为传递给它的纬度经度数据返回null。那么解决方法应该是什么?可以将Lat / Long信息传递给Google Maps API以进行反向地理编码。很高兴收到任何意见。
答案 0 :(得分:1)
这就是我解决它的方式。
由于NETWORK_PROVIDER每次都会提供纬度经度信息,我首先会为用户的当前位置获取该信息。
latPoint = recentLoc.getLatitude();
lngPoint = recentLoc.getLongitude();
我获取了Google Maps API密钥,然后用它来反向地理编码来自网络提供商的纬度,经度数据。这样每次都会返回所需的地址和邮政编码。
答案 1 :(得分:1)
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>
public static String getUserLocation(String lat, String lon) {
String userlocation = null;
String readUserFeed = readUserLocationFeed(lat.trim() + ","+ lon.trim());
try {
JSONObject Strjson = new JSONObject(readUserFeed);
JSONArray jsonArray = new JSONArray(Strjson.getString("results"));
userlocation = jsonArray.getJSONObject(1)
.getString("formatted_address").toString();
} catch (Exception e) {
e.printStackTrace();
}
Log.i("User Location ", userlocation);
return userlocation;
}
public static String readUserLocationFeed(String address) {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng="+ address + "&sensor=false");
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e(ReverseGeocode.class.toString(), "Failed to download file");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return builder.toString();
}