自己为了获取手机的位置,这几天去网上拜读了多篇文章,试了N种代码,但是没有一个能用的。现把最终源代码贴出,求高人指点:
这是acvivity类:
package com.example.locationtest;import java.util.List;
import java.util.Locale;import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity { /** Called when the activity is first created. */
private LocationManager locationManager;
private String provider;
private Location location;
private Address address;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取LocationManager服务
locationManager =(LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
// 获取Location Provider
getProvider();
// 如果未设置位置源,打开GPS设置界面
openGPS();
// 获取位置
location = locationManager.getLastKnownLocation(provider);
// 显示位置信息到文字标签
updateWithNewLocation(location);
MyLocationListener locationListener=new MyLocationListener();
// 注册监听器locationListener,第2、3个参数可以控制接收gps消息的频度以节省电力。第2个参数为毫秒,
// 表示调用listener的周期,第3个参数为米,表示位置移动指定距离后就调用listener
locationManager.requestLocationUpdates(provider, 1000, (float)0.001,
locationListener);
int i=0;
location = locationManager.getLastKnownLocation(provider);
while(location==null){
Log.e("log",String.valueOf(i)+ location+"");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
location =locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(i++>100)break;
}; }
// 判断是否开启GPS,若未开启,打开GPS设置界面
private void openGPS() {
if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)
||locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)
) {
Toast.makeText(this, "位置源已设置!", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(this, "位置源未设置!", Toast.LENGTH_SHORT).show();
// 转至GPS设置界面
Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
startActivityForResult(intent,0);
}
// 获取Location Provider
private void getProvider(){
// 构建位置查询条件
Criteria criteria = new Criteria();
// 查询精度:高
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否查询海拨:否
criteria.setAltitudeRequired(false);
// 是否查询方位角:否
criteria.setBearingRequired(false);
// 是否允许付费:是
criteria.setCostAllowed(true);
// 电量要求:低
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 返回最合适的符合条件的provider,第2个参数为true说明,如果只有一个provider是有效的,则返回当前provider
provider = locationManager.getBestProvider(criteria,true);
Log.e("log", provider);
}
// Gps消息监听器
private final class MyLocationListener implements LocationListener{
// 位置发生改变后调用
public void onLocationChanged(Location location) {
Log.e("log", "location 变了");
updateWithNewLocation(location);
}
// provider被用户关闭后调用
public void onProviderDisabled(String provider){
Log.e("log", "provider 被用户关闭了");
updateWithNewLocation(null);
}
// provider被用户开启后调用
public void onProviderEnabled(String provider){
Log.e("log", "provider 被用户开启了");
}
// provider状态变化时调用
public void onStatusChanged(String provider, int status,
Bundle extras){ }
};
// Gps监听器调用,处理位置信息
private void updateWithNewLocation(Location location) {
String latLongString;
TextView myLocationText= (TextView)findViewById(R.id.text);
if (location != null) {
double lat =location.getLatitude();
double lng =location.getLongitude();
latLongString = "纬度:" + lat + "/n经度:" + lng;
} else {
latLongString = "无法获取地理信息";
}
myLocationText.setText("您当前的位置是:/n" +
latLongString+"/n"+getAddressbyGeoPoint(location));
}
// 获取地址信息
private List<Address> getAddressbyGeoPoint(Location location) {
List<Address> result = null;
// 先将Location转换为GeoPoint
// GeoPoint gp=getGeoByLocation(location);
try {
if (location != null) {
// 获取Geocoder,通过Geocoder就可以拿到地址信息
Geocoder gc = new Geocoder(this, Locale.getDefault());
result= gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}}
androidlocationnull位置
这是acvivity类:
package com.example.locationtest;import java.util.List;
import java.util.Locale;import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.text.format.Time;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity { /** Called when the activity is first created. */
private LocationManager locationManager;
private String provider;
private Location location;
private Address address;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取LocationManager服务
locationManager =(LocationManager) this
.getSystemService(Context.LOCATION_SERVICE);
// 获取Location Provider
getProvider();
// 如果未设置位置源,打开GPS设置界面
openGPS();
// 获取位置
location = locationManager.getLastKnownLocation(provider);
// 显示位置信息到文字标签
updateWithNewLocation(location);
MyLocationListener locationListener=new MyLocationListener();
// 注册监听器locationListener,第2、3个参数可以控制接收gps消息的频度以节省电力。第2个参数为毫秒,
// 表示调用listener的周期,第3个参数为米,表示位置移动指定距离后就调用listener
locationManager.requestLocationUpdates(provider, 1000, (float)0.001,
locationListener);
int i=0;
location = locationManager.getLastKnownLocation(provider);
while(location==null){
Log.e("log",String.valueOf(i)+ location+"");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
location =locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(i++>100)break;
}; }
// 判断是否开启GPS,若未开启,打开GPS设置界面
private void openGPS() {
if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)
||locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)
) {
Toast.makeText(this, "位置源已设置!", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(this, "位置源未设置!", Toast.LENGTH_SHORT).show();
// 转至GPS设置界面
Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS);
startActivityForResult(intent,0);
}
// 获取Location Provider
private void getProvider(){
// 构建位置查询条件
Criteria criteria = new Criteria();
// 查询精度:高
criteria.setAccuracy(Criteria.ACCURACY_FINE);
// 是否查询海拨:否
criteria.setAltitudeRequired(false);
// 是否查询方位角:否
criteria.setBearingRequired(false);
// 是否允许付费:是
criteria.setCostAllowed(true);
// 电量要求:低
criteria.setPowerRequirement(Criteria.POWER_LOW);
// 返回最合适的符合条件的provider,第2个参数为true说明,如果只有一个provider是有效的,则返回当前provider
provider = locationManager.getBestProvider(criteria,true);
Log.e("log", provider);
}
// Gps消息监听器
private final class MyLocationListener implements LocationListener{
// 位置发生改变后调用
public void onLocationChanged(Location location) {
Log.e("log", "location 变了");
updateWithNewLocation(location);
}
// provider被用户关闭后调用
public void onProviderDisabled(String provider){
Log.e("log", "provider 被用户关闭了");
updateWithNewLocation(null);
}
// provider被用户开启后调用
public void onProviderEnabled(String provider){
Log.e("log", "provider 被用户开启了");
}
// provider状态变化时调用
public void onStatusChanged(String provider, int status,
Bundle extras){ }
};
// Gps监听器调用,处理位置信息
private void updateWithNewLocation(Location location) {
String latLongString;
TextView myLocationText= (TextView)findViewById(R.id.text);
if (location != null) {
double lat =location.getLatitude();
double lng =location.getLongitude();
latLongString = "纬度:" + lat + "/n经度:" + lng;
} else {
latLongString = "无法获取地理信息";
}
myLocationText.setText("您当前的位置是:/n" +
latLongString+"/n"+getAddressbyGeoPoint(location));
}
// 获取地址信息
private List<Address> getAddressbyGeoPoint(Location location) {
List<Address> result = null;
// 先将Location转换为GeoPoint
// GeoPoint gp=getGeoByLocation(location);
try {
if (location != null) {
// 获取Geocoder,通过Geocoder就可以拿到地址信息
Geocoder gc = new Geocoder(this, Locale.getDefault());
result= gc.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}}
androidlocationnull位置
解决方案 »
- 还是关于gallery中的listview问题,寻求更好的方案
- 用代码布局,怎么用代码代替selector??
- 看见一个实时采集视频的程序!!!
- 做好的apk怎么不能装到手机上,求高手指点
- 求解释--vnd.android.cursor.dir与vnd.android.cursor.item究竟该怎么区分??
- Android怎么用代码把系统的窗口小部件中的模拟时钟放到桌面??
- 新手求教:Android的编译问题
- android 开发之 二维码扫描 ?
- 有没有快捷键能调出该函数出来onStart
- android应用安装不上
- 求大神帮看,socket为什么无法实现数据传递。
- 这样形式的json怎么解析?
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.locationtest"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="7" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.locationtest.MainActivity"
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-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
</manifest>