diff --git a/app/src/main/java/edu/hzuapps/androidworks/homeworks/net1314080903234/Net1314080903234GPSLocation.java b/app/src/main/java/edu/hzuapps/androidworks/homeworks/net1314080903234/Net1314080903234GPSLocation.java new file mode 100644 index 00000000..db784fff --- /dev/null +++ b/app/src/main/java/edu/hzuapps/androidworks/homeworks/net1314080903234/Net1314080903234GPSLocation.java @@ -0,0 +1,279 @@ +package edu.hzuapps.androidworks.homeworks.Net134080903234; + +import android.app.Activity; +import android.app.ListActivity; +import android.content.ContentValues; +import android.content.Context; +import android.content.Intent; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.location.Criteria; +import android.location.GpsSatellite; +import android.location.GpsStatus; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.location.LocationProvider; +import android.os.Bundle; +import android.provider.Settings; +import android.util.Log; +import android.view.View; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.SimpleCursorAdapter; +import android.widget.Toast; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; + +public class Net1314080903234GPSLocation extends ListActivity { + + private EditText editText; + private LocationManager lm; + private SQLiteDatabase dbRead,dbWrite; + private Db db; + private SimpleCursorAdapter adapter; + private Button button; + private static final String TAG="GpsActivity"; + + //获取当前时间 + SimpleDateFormat formatter= new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss"); + Date curDate = new Date(System.currentTimeMillis()); + String str = formatter.format(curDate); + + //设置按钮 + private View.OnClickListener btnListener= new View.OnClickListener() { + @Override + public void onClick(View v) { + if(getListView().getVisibility()==View.VISIBLE) { + Toast.makeText(getApplicationContext(),"显示历史记录",Toast.LENGTH_SHORT).show(); + setListAdapter(adapter); + refresh(); + } + + + } + }; + + + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + button= (Button) findViewById(R.id.button); + button.setOnClickListener(btnListener); + + + //读数据库 + db =new Db(this); + dbRead = db.getReadableDatabase(); + dbWrite=db.getWritableDatabase(); + + adapter = new SimpleCursorAdapter(this,R.layout.where_you,null, + new String[]{"longitude","latitude"}, + new int[]{R.id.tvLong,R.id.tvLat}); +// setListAdapter(adapter); +// refresh(); + + + + + editText=(EditText)findViewById(R.id.editText); + lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE); + + //判断GPS是否正常启动 + if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){ + Toast.makeText(this, "请开启GPS导航...", Toast.LENGTH_SHORT).show(); + //返回开启GPS导航设置界面 + Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); + startActivityForResult(intent,0); + return; + } + + //为获取地理位置信息时设置查询条件 + String bestProvider = lm.getBestProvider(getCriteria(), true); + //获取位置信息 + //如果不设置查询要求,getLastKnownLocation方法传人的参数为LocationManager.GPS_PROVIDER + Location location= lm.getLastKnownLocation(bestProvider); + updateView(location); + //监听状态 + lm.addGpsStatusListener(listener); + //绑定监听,有4个参数 + //参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种 + //参数2,位置信息更新周期,单位毫秒 + //参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息 + //参数4,监听 + //备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新 + + // 1秒更新一次,或最小位移变化超过1米更新一次; + //注意:此处更新准确度非常低,推荐在service里面启动一个Thread,在run中sleep(10000);然后执行handler.sendMessage(),更新位置 + lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, locationListener); + } + + //位置监听 + private LocationListener locationListener=new LocationListener() { + + /** + * 位置信息变化时触发 + */ + public void onLocationChanged(Location location) { + updateView(location); + + ContentValues cv = new ContentValues(); + cv.put("longitude",String.valueOf(location.getLongitude())); + cv.put("latitude", String.valueOf(location.getLatitude())); + dbWrite.insert("whereYou", null, cv); + refresh(); + + + + +// +// Log.i(TAG, "时间:" + location.getTime()); +// Log.i(TAG, "经度:"+location.getLongitude()); +// Log.i(TAG, "纬度:"+location.getLatitude()); +// Log.i(TAG, "海拔:"+location.getAltitude()); + } + + /** + * GPS状态变化时触发 + */ + public void onStatusChanged(String provider, int status, Bundle extras) { + switch (status) { + //GPS状态为可见时 + case LocationProvider.AVAILABLE: + Log.i(TAG, "当前GPS状态为可见状态"); + break; + //GPS状态为服务区外时 + case LocationProvider.OUT_OF_SERVICE: + Log.i(TAG, "当前GPS状态为服务区外状态"); + break; + //GPS状态为暂停服务时 + case LocationProvider.TEMPORARILY_UNAVAILABLE: + Log.i(TAG, "当前GPS状态为暂停服务状态"); + break; + } + } + + /** + * GPS开启时触发 + */ + public void onProviderEnabled(String provider) { + Location location=lm.getLastKnownLocation(provider); + updateView(location); + } + + /** + * GPS禁用时触发 + */ + public void onProviderDisabled(String provider) { + updateView(null); + } + + + }; + + //状态监听 + GpsStatus.Listener listener = new GpsStatus.Listener() { + public void onGpsStatusChanged(int event) { + switch (event) { + //第一次定位 + case GpsStatus.GPS_EVENT_FIRST_FIX: + Log.i(TAG, "第一次定位"); + break; + //卫星状态改变 + case GpsStatus.GPS_EVENT_SATELLITE_STATUS: + Log.i(TAG, "卫星状态改变"); + //获取当前状态 + GpsStatus gpsStatus=lm.getGpsStatus(null); + //获取卫星颗数的默认最大值 + int maxSatellites = gpsStatus.getMaxSatellites(); + //创建一个迭代器保存所有卫星 + Iterator iters = gpsStatus.getSatellites().iterator(); + int count = 0; + while (iters.hasNext() && count <= maxSatellites) { + GpsSatellite s = iters.next(); + count++; + } + System.out.println("搜索到:"+count+"颗卫星"); + break; + //定位启动 + case GpsStatus.GPS_EVENT_STARTED: + Log.i(TAG, "定位启动"); + break; + //定位结束 + case GpsStatus.GPS_EVENT_STOPPED: + Log.i(TAG, "定位结束"); + break; + } + }; + }; + + /** + * 实时更新文本内容 + * + * @param location + */ + private void updateView(Location location){ + if(location!=null){ + editText.setText("位置信息\n\n经度:"); + editText.append(String.valueOf(location.getLongitude())); + editText.append("\n纬度:"); + editText.append(String.valueOf(location.getLatitude())); + editText.append("\n海拔:"); + editText.append(String.valueOf(location.getAltitude())); + + + + editText.append("\n时间:"); + editText.append(str); + + + }else{ + //清空EditText对象 + editText.getEditableText().clear(); + } + } + + /** + * 返回查询条件 + * @return + */ + private Criteria getCriteria(){ + Criteria criteria=new Criteria(); + //设置定位精确度 Criteria.ACCURACY_COARSE比较粗略,Criteria.ACCURACY_FINE则比较精细 + criteria.setAccuracy(Criteria.ACCURACY_FINE); + //设置是否要求速度 + criteria.setSpeedRequired(false); + // 设置是否允许运营商收费 + criteria.setCostAllowed(false); + //设置是否需要方位信息 + criteria.setBearingRequired(false); + //设置是否需要海拔信息 + criteria.setAltitudeRequired(false); + // 设置对电源的需求 + criteria.setPowerRequirement(Criteria.POWER_LOW); + return criteria; + } + + @Override + protected void onDestroy() { + // TODO Auto-generated method stub + super.onDestroy(); + lm.removeUpdates(locationListener); + } + + private void refresh(){ + Cursor c= dbRead.query("whereYou", null, null, null, null, null, null); + adapter.changeCursor(c); + } + + +} +