forked from hzuapps/android-labs
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
hzuapps#94 hzuapps#20 lab8 与硬件相关的功能:位置
- Loading branch information
1 parent
553c347
commit 156a4f6
Showing
1 changed file
with
279 additions
and
0 deletions.
There are no files selected for viewing
279 changes: 279 additions & 0 deletions
279
...java/edu/hzuapps/androidworks/homeworks/net1314080903234/Net1314080903234GPSLocation.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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<GpsSatellite> 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); | ||
} | ||
|
||
|
||
} | ||
|