1.默认gps定位
2.判断gps是否能定位,不能切换到network定位
3.监听gps定位,如果获取到gps信号,停止network定位
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import com.citygis007.appdata.AppData;
import com.citygis007.gpsandjz.MainActivity;
import com.citygis007.gpsandjz.R;
import android.R.integer;
import android.R.string;
import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.text.format.Time;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;
public class WriteLog extends Service {
Timer timer=null;
boolean isRun=false;
private int seconds=30;
private boolean isGps=false;
private boolean isJizhan=false;
private String mfilename="";
private TelephonyManager mTelephonyManager;
private MyPhoneStateListener phoneStateListener;
private LocationManager locationManager;
private String provider;
private String TAG="WriteLog";
private Location location1;
private Location currentlocation=null;
String log1,log2,log3;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
// public class MyBinder extends Binder{
//
// public WriteLog getService(){
// return WriteLog.this;
// }
// }
//
// private MyBinder myBinder = new MyBinder();
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.i("service", "onCreate");
writeLog(AppData.fileTest, "onCreate\r\n");
super.onCreate();
SharedPreferences preferences=getApplicationContext().getSharedPreferences(AppData.stringValue, MODE_PRIVATE);
SharedPreferences.Editor editor=preferences.edit();
mfilename=preferences.getString("filename", MainActivity.filename);
editor.putBoolean("isRun", true);
editor.commit();
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
//provider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();
openGPS();
phoneStateListener=new MyPhoneStateListener();
}
@Override
public void onDestroy() {
Log.i("service", "onDestroy");
writeLog(AppData.fileTest, "onDestroy\r\n");
SharedPreferences preferences=getApplicationContext().getSharedPreferences(AppData.stringValue, MODE_PRIVATE);
SharedPreferences.Editor editor=preferences.edit();
editor.clear();
editor.commit();
isGps=false;
isJizhan=false;
if(timer!=null){
timer.cancel();
timer.purge();
}
stopGPS();
super.onDestroy();
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
// if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null)
// {
// locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,this);
// }
// else if (locationManager.getProvider(LocationManager.GPS_PROVIDER) != null)
// {
// locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,this);
// }
Log.i("service", "onStart");
writeLog(AppData.fileTest, "onStart\r\n");
if(intent==null){
Log.i("service", "intent null");
writeLog(AppData.fileTest, "intent null\r\n");
SharedPreferences preferences=getApplicationContext().getSharedPreferences(AppData.stringValue, MODE_PRIVATE);
isRun=preferences.getBoolean("isRun", false);
isGps=preferences.getBoolean("isGps", false);
isJizhan=preferences.getBoolean("isJizhan", false);
seconds=preferences.getInt("seconds", 30);
//mfilename=preferences.getString("filename", MainActivity.filename);
if(isRun){
if(timer!=null){
timer.cancel();
timer.purge();
}
if(isGps||isJizhan){
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
if(isGps||isJizhan)
{
getLacAndGps();
//通知Activity
Intent intent = new Intent();
intent.setAction(AppData.LOCATION_ACTION);
intent.putExtra(AppData.LOCATION, log1+log2+log3);
sendBroadcast(intent);
}else{
this.cancel();
}
}
}, 0, seconds*1000);
}
}else{
stopSelf();
}
}else{
Log.i("service", "intent not null");
writeLog(AppData.fileTest, "intent not null\r\n");
Bundle bundle=intent.getExtras();
isRun=bundle.getBoolean("isRun",false);
Log.i("service", "isRun:"+isRun);
writeLog(AppData.fileTest,"isRun:"+isRun+"\r\n");
if(isRun){
if(timer!=null){
timer.cancel();
timer.purge();
}
isGps=bundle.getBoolean("isGps", false);
isJizhan=bundle.getBoolean("isJizhan", false);
seconds=bundle.getInt("seconds", seconds);
if(isGps||isJizhan){
timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
if(isGps||isJizhan)
{
getLacAndGps();
//通知Activity
Intent intent = new Intent();
intent.setAction(AppData.LOCATION_ACTION);
intent.putExtra(AppData.LOCATION, log1+log2+log3);
sendBroadcast(intent);
}else{
this.cancel();
}
}
}, 0, seconds*1000);
}
}else{
stopSelf();
}
}
}
class MyPhoneStateListener extends PhoneStateListener{
private int lastStrength = 0;
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
super.onSignalStrengthsChanged(signalStrength);
lastStrength = signalStrength.getGsmSignalStrength();
}
/** 获取上一次变化到现在的信号强度值。 */
public int getLastStrength() {
return lastStrength;
}
};
public boolean openGPS(){
boolean flag=false;
if(locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
//设置监听器,自动更新的最小时间为间隔15秒,最小位移变化超过5米
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
flag=true;
}
if(locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER))
{
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
flag=true;
}
return flag;
}
public void stopGPS(){
locationManager.removeUpdates(locationListener);
}
private LocationListener locationListener=new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub;
//locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,networkListener);
// Provider的转态在可用、暂时不可用和无服务三个状态直接切换时触发此函数
System.out.println(" Provider的转态改变 !");
Log.i("provider", "Provider的转态改变 !");
Log.i("provider", provider);
if (LocationProvider.OUT_OF_SERVICE == status) {
Log.i("provider", "GPS服务丢失,切换至网络定位");
writeLog(AppData.fileTest, provider+"GPS服务丢失,切换至网络定位");
}
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
// Provider被disable时触发此函数,比如GPS被关闭
System.out.println("GPS被关闭 !");
Log.i("provider", "GPS被关闭 !");
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
// Provider被enable时触发此函数,比如GPS被打开
System.out.println("GPS被关闭 !");
Log.i("provider", "GPS被关闭 !");
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
currentlocation=location;
writeLog(AppData.fileTest, location+"");
}
};
private boolean isBetterLocation(Location location,Location currentBestLocation)
{
if (currentBestLocation == null)
{
// A new location is always better than no location
return false;
}
else {
return true;
}
}
private boolean isnewLocation(Location lastLocation,Location currentLocation)
{
String a=lastLocation.getProvider();
String b=currentLocation.getProvider();
if (a==b)
{
return true;
}
else {
return false;
}
}
@SuppressLint("NewApi")
public void getLacAndGps(){
SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss\r\n");
String date=dateFormat.format(new Date());
log1=date;
// int year=0;
// int month=0;
// int day=0;
// int hour=0;
// int minute=0;
// int second=0;
// Calendar calendar = Calendar.getInstance();
// year=(calendar.get(Calendar.YEAR));
// month=(calendar.get(Calendar.MONTH)+1);
// day=calendar.get(Calendar.DAY_OF_MONTH);
// hour=calendar.get(Calendar.HOUR_OF_DAY);
// minute=calendar.get(Calendar.MINUTE);
// second=calendar.get(Calendar.SECOND);
// if ((second%5)!=0) {
// second=second+(5-(second%5));
// }
// String date=year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+"\r\n";
// log1=date;
// Time t=new Time(); // or Time t=new Time("GMT+8"); 加上Time Zone资料。
//
// t.setToNow(); // 取得系统时间。
// year =t.year;
// month = t.month;
// day = t.monthDay;
// hour = t.hour; // 0-23
// minute = t.minute;
// second = t.second;
// String m=year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second+"\r\n";
writeLog(AppData.filepath+mfilename+".txt", date);
writeLog(AppData.fileLog, date);
if(isGps){
if (locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)) {
provider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();
location1=locationManager.getLastKnownLocation(provider);
// boolean mflag=isBetterLocation(location1, currentlocation);
// if (mflag) {
// location1=currentlocation;
// }
String a="";
String b="";
if (currentlocation!=null) {
a=currentlocation.getProvider().toString();
String time=dateFormat.format(new Date(currentlocation.getTime()));
}
if (location1!=null) {
b=location1.getProvider().toString();
String time1=dateFormat.format(new Date(location1.getTime()));
}
if (location1==null||currentlocation==null||a.equals("network"))
{
System.out.println("GPS获取坐标失败!");
Log.i("service", "GPS获取坐标失败!");
writeLog(AppData.fileTest, "GPS获取坐标失败!"+date);
if(locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER))
{
provider = locationManager.getProvider(LocationManager.NETWORK_PROVIDER).getName();
location1 = locationManager.getLastKnownLocation(provider);
if (currentlocation==null) {
}
else {
location1=currentlocation;
}
System.out.println("网络服务开启!");
Log.i("service", "网络服务开启!");
writeLog(AppData.fileTest, "网络服务开启!"+date);
if(location1 != null)
{
System.out.println("网络获取坐标成功!");
Log.i("service", "网络获取坐标成功");
writeLog(AppData.fileTest, "网络获取坐标成功"+date);
writeGPSPoint(location1);
}
else {
System.out.println("网络获取坐标失败!");
Log.i("service", "GPS开启,网络服务开启,但是获取坐标失败!");
writeLog(AppData.fileTest, "GPS开启,网络服务开启,但是获取坐标失败!"+date);
}
}
else {
if (currentlocation==null) {
}
else {
location1=currentlocation;
}
System.out.println("GPS获取坐标失败!");
Log.i("service", "GPS获取坐标失败!");
writeLog(AppData.fileTest, "GPS获取坐标失败!"+date);
}
}else {
if (currentlocation==null) {
}
else {
location1=currentlocation;
}
System.out.println("GPS获取坐标成功!");
Log.i("service", "GPS获取坐标成功");
writeLog(AppData.fileTest, "GPS获取坐标成功"+date);
writeGPSPoint(location1);
}
}
else if(locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER)){
System.out.println("GPS未开启!网络服务开启!");
writeLog(AppData.fileTest, "GPS未开启!网络服务开启!"+date);
provider = locationManager.getProvider(LocationManager.NETWORK_PROVIDER).getName();
location1 = locationManager.getLastKnownLocation(provider);
if (currentlocation==null) {
}
else {
location1=currentlocation;
}
if(location1 != null)
{
try {
writeGPSPoint(location1);
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("GPS未开启!网络服务开启!网络获取坐标失败!");
Log.i("service", "GPS未开启!网络服务开启!网络获取坐标失败!");
writeLog(AppData.fileTest, "GPS未开启!网络服务开启!网络获取坐标失败!"+date);
}
}else {
System.out.println("GPS和网络没有开启!");
Log.i("service", "GPS和网络没有开启!");
writeLog(AppData.fileTest, "GPS和网络没有开启!"+date);
}
}
if(isJizhan){
String operator="";
int mcc=0;
int mnc=0;
int type=0 ;
try {
mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
type =mTelephonyManager.getNetworkType();
mTelephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
operator = mTelephonyManager.getNetworkOperator();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
mcc = Integer.parseInt(operator.substring(0, 3));
mnc = Integer.parseInt(operator.substring(3));
StringBuffer sb1 = new StringBuffer();
int lac=0;
int cellId=0;
int psc=-1;
if(mnc==0||mnc==1){
GsmCellLocation location = (GsmCellLocation) mTelephonyManager.getCellLocation();
lac = location.getLac();
cellId = location.getCid();
try {
int version = Integer.valueOf(android.os.Build.VERSION.SDK);
if(version >= 9) {
psc = location.getPsc();
}else{
psc=-1;
}
} catch (Exception e) {
e.printStackTrace();
psc=-1;
}
sb1.append("移动国家码(MCC) : " + mcc+ "\r\n"); // 取出当前邻区的LAC
sb1.append("移动网络码(MNC) : " + mnc+ "\r\n"); // 取出当前邻区的CID
sb1.append("位置区编码(LAC) : " + lac+ "\r\n"); // 取出当前邻区的LAC
sb1.append("手机信号覆盖区域的的编号ID(CID) : " + cellId+ "\r\n"); // 取出当前邻区的CID
sb1.append("网络类型:"+mTelephonyManager.getNetworkType()+ "\r\n");
sb1.append("主同步码(PSC):"+psc+ "\r\n");
sb1.append("接收信号的强度(RSSI) : " +phoneStateListener.getLastStrength() + "\r\n");
Log.i(TAG, sb1.toString());
}else if(mnc==2||mnc==3){
// 中国电信获取LAC、CID的方式
CdmaCellLocation location1 = (CdmaCellLocation) mTelephonyManager.getCellLocation();
lac = location1.getNetworkId();
cellId = location1.getBaseStationId();
psc=location1.getSystemId();
// psc=location1.get
sb1.append("移动国家码(MCC) : " + mcc+ "\r\n"); // 取出当前邻区的LAC
sb1.append("移动网络码(MNC) : " + mnc+ "\r\n"); // 取出当前邻区的CID
sb1.append("CDMA网络标识号(NID) : " + lac+ "\r\n"); // 取出当前邻区的LAC
sb1.append("CDMA基站识别码(BSID) : " + cellId+ "\r\n"); // 取出当前邻区的CID
sb1.append("网络类型:"+mTelephonyManager.getNetworkType()+ "\r\n");
sb1.append("系统识别码(SID):"+psc+ "\r\n");
sb1.append("接收信号的强度(RSSI) : " +phoneStateListener.getLastStrength() + "\r\n");
Log.i(TAG, sb1.toString());
}
// 获取邻区基站信息
List infos = mTelephonyManager.getNeighboringCellInfo();
StringBuffer sb = new StringBuffer("临近基站总数 : " +infos.size() + "\r\n");
// StringBuffer sb = new StringBuffer();
for (NeighboringCellInfo info1 : infos) { // 根据邻区总数进行循环
sb.append("位置区编码(LAC) : " + info1.getLac()+ "\r\n"); // 取出当前邻区的LAC
sb.append("手机信号覆盖区域的的编号ID(CID) : " + info1.getCid()+ "\r\n"); // 取出当前邻区的CID
sb.append("网络类型:"+info1.getNetworkType()+ "\r\n");
sb.append("主同步码(PSC):"+info1.getPsc()+ "\r\n");
sb.append("接收信号的强度(RSSI) : " +info1.getRssi() + "\r\n"); // 获取邻区基站信号强度
}
// List infos = mTelephonyManager.getAllCellInfo();
// StringBuffer sb = new StringBuffer("临近基站总数 : " +infos.size() + "\r\n");
// // StringBuffer sb = new StringBuffer();
// for (CellInfo info1 : infos) { // 根据邻区总数进行循环
// sb.append("位置区编码(LAC) : " + info1.getLac()+ "\r\n"); // 取出当前邻区的LAC
// sb.append("手机信号覆盖区域的的编号ID(CID) : " + info1.getCid()+ "\r\n"); // 取出当前邻区的CID
// sb.append("网络类型:"+info1.getNetworkType()+ "\r\n");
// sb.append("主同步码(PSC):"+info1.getPsc()+ "\r\n");
// sb.append("接收信号的强度(RSSI) : " +info1.getRssi() + "\r\n"); // 获取邻区基站信号强度
// }
Log.i(TAG, " 获取邻区基站信息:" + sb.toString());
writeLog(AppData.fileLog, sb1.toString()+sb.toString());
writeLog(AppData.filepath+mfilename+".txt", sb1.toString()+sb.toString());
log3=sb1.toString()+sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
}
writeLog(AppData.fileLog, "\r\n");
//log3="";
}
private void writeGPSPoint(Location location){
if(location!=null){
log2="lon:"+location.getLatitude()+" lat:"+location.getLongitude()+"\r\n";
writeLog(AppData.fileGps,"lon:"+location.getLatitude()+" lat:"+location.getLongitude()+"\r\n");
writeLog(AppData.filepath+mfilename+".txt", "lon:"+location.getLatitude()+" lat:"+location.getLongitude()+"\r\n");
Log.i(TAG, "lon:"+location.getLatitude()+" lat:"+location.getLongitude()+"\r\n");
}else{
writeLog(AppData.fileGps,"lon:"+0.0+" lat:"+0.0+"\r\n");
log2="lon:"+0.0+" lat:"+0.0+"\r\n";
Log.i(TAG, "lon:"+0.0+" lat:"+0.0+"\r\n");
}
}
/**
* 写日志文件
* @param fileName日志文件名
* @param log日志信息
*/
private void writeLog(String path,String log){
if (path==null)
{
path=mfilename;
}
File file=new File(path);
File fileParent=file.getParentFile();
fileParent.mkdirs();
if (file.exists()) {
try {
FileWriter fileWriter=new FileWriter(file, true);
fileWriter.write(log);
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
else {
try {
file.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
return;
}
try {
FileWriter fileWriter=new FileWriter(file, true);
fileWriter.write(log);
fileWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
}
}