尝试从 android 中的地址或位置获取 LatLng
Trying to get LatLng from an address or location in android
好的下一个问题。
我正在尝试使用估算地址或位置并输出 LatLng 进行存储。
这是我目前基于 How can I find the latitude and longitude from address? 的第三个答案。
import java.util.List;
import com.google.android.gms.maps.model.LatLng;
import android.app.Fragment;
import android.location.Address;
import android.location.Geocoder;
public class Mapping extends Fragment
{
public LatLng getLocationFromAddress(String _address) {
Geocoder coder = new Geocoder(getActivity());
List<Address> address;
LatLng p1 = null;
try {
address = coder.getFromLocationName(_address, 1);
if (address == null) {
return null;
}
Address location = address.get(0);
location.getLatitude();
location.getLongitude();
p1 = new LatLng(location.getLatitude(), location.getLongitude() );
} catch (Exception ex) {
ex.printStackTrace();
}
return p1;
我试着在另一个class中这样调用它。
make.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//String _name = (String) txtName.getText().toString();
//String _address = (String) txtAddress.getText().toString();
String _name = "Some Name"; //Just to pass some information
String _address = "New York";
contact.setName(_name);
contact.setAddress(_address);
// Should populate lladdress with a LatLng
LatLng lladdress = mapping.getLocationFromAddress(_address);
contact.setLatLng(lladdress);
}
});
// Should populate lladdress with a LatLng
之前的所有代码都可以工作,但是如果我在我的应用程序中添加这部分代码就会停止工作。我过去曾使用 Toast 来测试代码,但我不知道如何测试它,我尝试调试但没有看到任何有用的东西。我的代码有什么问题吗?
更新:
感谢@bjiang 的代码。我决定对其进行更改,以便输出一个双精度 2 和 return,这样我就可以将它存储在数据库中或以后根据需要使用它。
public class Mapping extends Fragment
{
//String[] happy = new String[2];
protected double[] getLatLng(Context context, String address/*, boolean setDestination*/) {
String uri = "http://maps.google.com/maps/api/geocode/json?address="
+ address + "&sensor=false";
Message.message(context , ""+uri);
HttpGet httpGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int byteData;
while ((byteData = stream.read()) != -1) {
stringBuilder.append((char) byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
double[] _latlng = new double[2];
JSONObject jsonObject;
try {
jsonObject = new JSONObject(stringBuilder.toString());
_latlng[1] = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
_latlng[0] = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
} catch (JSONException e) {
e.printStackTrace();
}
return _latlng;
它仍然失败,根据我从异常中读取的内容,它根据 this post 抛出 "android.os.NetworkOnMainThreadException" 我需要 运行 它作为 AsyncTask 但我不确定如果这是真的或如何去做。我的代码看起来正确吗?有人有任何其他想法吗?
这是一些日志:
03-15 12:30:05.803:E/AndroidRuntime(17863):致命异常:main
03-15 12:30:05.803: E/AndroidRuntime(17863): 进程: edu.ecpi.myappv3, PID: 17863
03-15 12:30:05.803: E/AndroidRuntime(17863): android.os.NetworkOnMainThreadException
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:418)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 java.net.InetAddress.getAllByName(InetAddress.java:215)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:172)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167)
我使用以下方法获取 LatLng
表单地址:
protected void getLatLng(String address) {
String uri = "http://maps.google.com/maps/api/geocode/json?address="
+ address + "&sensor=false";
HttpGet httpGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int byteData;
while ((byteData = stream.read()) != -1) {
stringBuilder.append((char) byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
double lat = 0.0, lng = 0.0;
JSONObject jsonObject;
try {
jsonObject = new JSONObject(stringBuilder.toString());
lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
} catch (JSONException e) {
e.printStackTrace();
}
}
您需要将其放入AsyncTask
到doInBackground
以从互联网上获取数据。
整个项目源码请参考我的Githubhere。这表明 get LatLng form the address
也可以 set a marker to there
.
好的下一个问题。
我正在尝试使用估算地址或位置并输出 LatLng 进行存储。 这是我目前基于 How can I find the latitude and longitude from address? 的第三个答案。
import java.util.List;
import com.google.android.gms.maps.model.LatLng;
import android.app.Fragment;
import android.location.Address;
import android.location.Geocoder;
public class Mapping extends Fragment
{
public LatLng getLocationFromAddress(String _address) {
Geocoder coder = new Geocoder(getActivity());
List<Address> address;
LatLng p1 = null;
try {
address = coder.getFromLocationName(_address, 1);
if (address == null) {
return null;
}
Address location = address.get(0);
location.getLatitude();
location.getLongitude();
p1 = new LatLng(location.getLatitude(), location.getLongitude() );
} catch (Exception ex) {
ex.printStackTrace();
}
return p1;
我试着在另一个class中这样调用它。
make.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
//String _name = (String) txtName.getText().toString();
//String _address = (String) txtAddress.getText().toString();
String _name = "Some Name"; //Just to pass some information
String _address = "New York";
contact.setName(_name);
contact.setAddress(_address);
// Should populate lladdress with a LatLng
LatLng lladdress = mapping.getLocationFromAddress(_address);
contact.setLatLng(lladdress);
}
});
// Should populate lladdress with a LatLng
之前的所有代码都可以工作,但是如果我在我的应用程序中添加这部分代码就会停止工作。我过去曾使用 Toast 来测试代码,但我不知道如何测试它,我尝试调试但没有看到任何有用的东西。我的代码有什么问题吗?
更新: 感谢@bjiang 的代码。我决定对其进行更改,以便输出一个双精度 2 和 return,这样我就可以将它存储在数据库中或以后根据需要使用它。
public class Mapping extends Fragment
{
//String[] happy = new String[2];
protected double[] getLatLng(Context context, String address/*, boolean setDestination*/) {
String uri = "http://maps.google.com/maps/api/geocode/json?address="
+ address + "&sensor=false";
Message.message(context , ""+uri);
HttpGet httpGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int byteData;
while ((byteData = stream.read()) != -1) {
stringBuilder.append((char) byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
double[] _latlng = new double[2];
JSONObject jsonObject;
try {
jsonObject = new JSONObject(stringBuilder.toString());
_latlng[1] = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
_latlng[0] = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
} catch (JSONException e) {
e.printStackTrace();
}
return _latlng;
这是一些日志:
03-15 12:30:05.803:E/AndroidRuntime(17863):致命异常:main
03-15 12:30:05.803: E/AndroidRuntime(17863): 进程: edu.ecpi.myappv3, PID: 17863
03-15 12:30:05.803: E/AndroidRuntime(17863): android.os.NetworkOnMainThreadException
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 java.net.InetAddress.lookupHostByName(InetAddress.java:418)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 java.net.InetAddress.getAllByName(InetAddress.java:215)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:172)
03-15 12:30:05.803: E/AndroidRuntime(17863): 在 org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:167)
我使用以下方法获取 LatLng
表单地址:
protected void getLatLng(String address) {
String uri = "http://maps.google.com/maps/api/geocode/json?address="
+ address + "&sensor=false";
HttpGet httpGet = new HttpGet(uri);
HttpClient client = new DefaultHttpClient();
HttpResponse response;
StringBuilder stringBuilder = new StringBuilder();
try {
response = client.execute(httpGet);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int byteData;
while ((byteData = stream.read()) != -1) {
stringBuilder.append((char) byteData);
}
} catch (IOException e) {
e.printStackTrace();
}
double lat = 0.0, lng = 0.0;
JSONObject jsonObject;
try {
jsonObject = new JSONObject(stringBuilder.toString());
lng = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
lat = ((JSONArray) jsonObject.get("results")).getJSONObject(0)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
} catch (JSONException e) {
e.printStackTrace();
}
}
您需要将其放入AsyncTask
到doInBackground
以从互联网上获取数据。
整个项目源码请参考我的Githubhere。这表明 get LatLng form the address
也可以 set a marker to there
.