在Android应用程序上,Geocoder类由于无法使用grpc而丢失代码,因此会出现grpc failed exception。这是由于调用Geocoder.getFromLocation()方法时,它会尝试使用grpc进行调用,但如果grpc无法使用,则会抛出此异常。
解决此问题的最佳方法是使用备用方法直接查询地理编码,而无需使用Geocoder类。您可以使用Geo-APIs(如Google Maps API)或其他其它服务(例如Yahoo Place Finder API)来获取地址信息。以下是使用Google Maps API的示例代码:
private void getAddressFromLocation(final double latitude, final double longitude, final Context context, final Handler handler) {
Thread thread = new Thread() {
@Override
public void run() {
Geocoder geocoder = new Geocoder(context, Locale.getDefault());
String result = null;
try {
List addressList = geocoder.getFromLocation(
latitude, longitude, 1);
if (addressList != null && addressList.size() > 0) {
Address address = addressList.get(0);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
sb.append(address.getAddressLine(i)).append("\n");
}
sb.append(address.getLocality()).append("\n");
sb.append(address.getPostalCode()).append("\n");
sb.append(address.getCountryName());
result = sb.toString();
}
} catch (IOException e) {
Log.e(TAG, "Unable connect to Geocoder", e);
} finally {
Message message = Message.obtain();
message.setTarget(handler);
if (result != null) {
message.what = 1;
Bundle bundle = new Bundle();
bundle.putString("address", result);
message.setData(bundle);
} else {
message.what = 0;
}
message.sendToTarget();
}
}
};
thread.start();
}
此示例代码不使用Geocoder类,而使用Google Maps API获取地址信息。它使用一个线程来执行此操作,并将响应消息发送回主线程。
因此,当Geocoder grpc failed异常发生时,你可以使用类似的示例代码来解决此问题。