• Android Service获取当前位置(GPS+基站)


    需求详情: 1)、Service中每隔1秒执行一次定位操作(GPS+基站) 2)、定位的结果实时显示在界面上(要求得到经度、纬度) 技术支持: 1)、获取经纬度 通过GPS+基站获取经纬度,先通过GPS来获取,如果为空改用基站进行获取–>GPS+基站(基站获取支持联通、电信、移动)。 2)、实时获取经纬度 为了达到实时获取经纬度,需在后台启动获取经纬度的Service,然后把经纬度数据通过广播发送出去,在需要的地方进行广播注册(比如在Activity中注册广播,显示在界面中)–>涉及到Service+BroadcastReceiver+Activity+Thread等知识点。

    备注:本文注重实践,如有看不懂的,先去巩固下知识点,可以去看看我前面写的几篇文章。

    1、CellInfo实体类–>基站信息

    复制代码
    package com.ljq.activity;
     
    /**
     * 基站信息
     * 
     * @author jiqinlin
     * 
     */
    public class CellInfo {
     /** 基站id,用来找到基站的位置 */private int cellId;
     /** 移动国家码,共3位,中国为460,即imsi前3位 */private String mobileCountryCode="460";
     /** 移动网络码,共2位,在中国,移动的代码为00和02,联通的代码为01,电信的代码为03,即imsi第4~5位 */private String mobileNetworkCode="0";
     /** 地区区域码 */private int locationAreaCode;
     /** 信号类型[选 gsm|cdma|wcdma] */private String radioType="";
     
     public CellInfo() {
     }
     
     public int getCellId() {
      return cellId;
     }
     
     public void setCellId(int cellId) {
      this.cellId = cellId;
     }
     
     public String getMobileCountryCode() {
      return mobileCountryCode;
     }
     
     public void setMobileCountryCode(String mobileCountryCode) {
      this.mobileCountryCode = mobileCountryCode;
     }
     
     public String getMobileNetworkCode() {
      return mobileNetworkCode;
     }
     
     public void setMobileNetworkCode(String mobileNetworkCode) {
      this.mobileNetworkCode = mobileNetworkCode;
     }
     
     public int getLocationAreaCode() {
      return locationAreaCode;
     }
     
     public void setLocationAreaCode(int locationAreaCode) {
      this.locationAreaCode = locationAreaCode;
     }
     
     public String getRadioType() {
      return radioType;
     }
     
     public void setRadioType(String radioType) {
      this.radioType = radioType;
     }
     
    }
    复制代码

    2、Gps类–>Gps封装类,用来获取经纬度

    复制代码
    package com.ljq.activity;
     
    import android.content.Context;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
     
    public class Gps{
     private Location location = null;
     private LocationManager locationManager = null;
     private Context context = null;
     
     /**
      * 初始化 
      * 
      * @param ctx
      */public Gps(Context ctx) {
      context=ctx;
      locationManager=(LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
      location = locationManager.getLastKnownLocation(getProvider());
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
     }
     
     
     // 获取Location Provider
     private String 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
      return locationManager.getBestProvider(criteria, true);
     }
     
     private LocationListener locationListener = new LocationListener() {
      // 位置发生改变后调用
      public void onLocationChanged(Location l) {
       if(l!=null){
        location=l;
       }
      }
     
      // provider 被用户关闭后调用
      public void onProviderDisabled(String provider) {
       location=null;
      }
     
      // provider 被用户开启后调用
      public void onProviderEnabled(String provider) {
       Location l = locationManager.getLastKnownLocation(provider);
       if(l!=null){
        location=l;
       }
         
      }
     
      // provider 状态变化时调用
      public void onStatusChanged(String provider, int status, Bundle extras) {
      }
     
     };
      
     public Location getLocation(){
      return location;
     }
      
     public void closeLocation(){
      if(locationManager!=null){
       if(locationListener!=null){
        locationManager.removeUpdates(locationListener);
        locationListener=null;
       }
       locationManager=null;
      }
     }
     
     
    }
    复制代码

    3、GpsService服务类

    复制代码
    package com.ljq.activity;
     
    import java.util.ArrayList;
     
    import android.app.Service;
    import android.content.Intent;
    import android.location.Location;
    import android.os.IBinder;
    import android.util.Log;
     
    public class GpsService extends Service {
     ArrayList<CellInfo> cellIds = null;
     private Gps gps=null;
     private boolean threadDisable=false; 
     private final static String TAG=GpsService.class.getSimpleName();
     
     @Override
     public void onCreate() {
      super.onCreate();
       
      gps=new Gps(GpsService.this);
      cellIds=UtilTool.init(GpsService.this);
       
      new Thread(new Runnable(){
       @Override
       public void run() {
        while (!threadDisable) { 
         try {
          Thread.sleep(1000);
         } catch (InterruptedException e) {
          e.printStackTrace();
         }
          
         if(gps!=null){ //当结束服务时gps为空
          //获取经纬度
          Location location=gps.getLocation();
          //如果gps无法获取经纬度,改用基站定位获取
          if(location==null){
           Log.v(TAG, "gps location null"); 
           //2.根据基站信息获取经纬度
           try {
            location = UtilTool.callGear(GpsService.this, cellIds);
           } catch (Exception e) {
            location=null;
            e.printStackTrace();
           }
           if(location==null){
            Log.v(TAG, "cell location null"); 
           }
          }
           
          //发送广播
          Intent intent=new Intent();
          intent.putExtra("lat", location==null?"":location.getLatitude()+""); 
          intent.putExtra("lon", location==null?"":location.getLongitude()+""); 
          intent.setAction("com.ljq.activity.GpsService"); 
          sendBroadcast(intent);
         }
     
        }
       }
      }).start();
       
     }
     
     @Override
     public void onDestroy() {
      threadDisable=true;
      if(cellIds!=null&&cellIds.size()>0){
       cellIds=null;
      }
      if(gps!=null){
       gps.closeLocation();
       gps=null;
      }
      super.onDestroy();
     }
     
     @Override
     public IBinder onBind(Intent arg0) {
      return null;
     }
     
     
    }
    复制代码

    4、GpsActivity–>在界面上实时显示经纬度数据

    复制代码
    package com.ljq.activity;
     
    import android.app.Activity;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.location.Location;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.EditText;
    import android.widget.Toast;
     
    public class GpsActivity extends Activity {
     private Double homeLat=26.0673834d; //宿舍纬度
     private Double homeLon=119.3119936d; //宿舍经度
     private EditText editText = null;
     private MyReceiver receiver=null; 
     private final static String TAG=GpsActivity.class.getSimpleName();
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
       
      editText=(EditText)findViewById(R.id.editText);
       
      //判断GPS是否可用
      Log.i(TAG, UtilTool.isGpsEnabled((LocationManager)getSystemService(Context.LOCATION_SERVICE))+"");
      if(!UtilTool.isGpsEnabled((LocationManager)getSystemService(Context.LOCATION_SERVICE))){
       Toast.makeText(this, "GSP当前已禁用,请在您的系统设置屏幕启动。", Toast.LENGTH_LONG).show();
       Intent callGPSSettingIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);  
       startActivity(callGPSSettingIntent);
                return;
      }   
       
      //启动服务
      startService(new Intent(this, GpsService.class));
       
      //注册广播
      receiver=new MyReceiver();
      IntentFilter filter=new IntentFilter();
      filter.addAction("com.ljq.activity.GpsService");
      registerReceiver(receiver, filter);
     }
      
     //获取广播数据
     private class MyReceiver extends BroadcastReceiver{
      @Override
      public void onReceive(Context context, Intent intent) {
       Bundle bundle=intent.getExtras();      
       String lon=bundle.getString("lon");    
       String lat=bundle.getString("lat"); 
       if(lon!=null&&!"".equals(lon)&&lat!=null&&!"".equals(lat)){
        double distance=getDistance(Double.parseDouble(lat), 
          Double.parseDouble(lon), homeLat, homeLon);
        editText.setText("目前经纬度
    经度:"+lon+"
    纬度:"+lat+"
    离宿舍距离:"+java.lang.Math.abs(distance));
       }else{
        editText.setText("目前经纬度
    经度:"+lon+"
    纬度:"+lat);
       }
      }
     }
      
     @Override
     protected void onDestroy() {
      //注销服务
      unregisterReceiver(receiver);
      //结束服务,如果想让服务一直运行就注销此句
      stopService(new Intent(this, GpsService.class));
      super.onDestroy();
     }
      
     /**
      * 把经纬度换算成距离
      * 
      * @param lat1 开始纬度
      * @param lon1 开始经度
      * @param lat2 结束纬度
      * @param lon2 结束经度
      * @return*/private double getDistance(double lat1, double lon1, double lat2, double lon2) {
      float[] results = new float[1];
      Location.distanceBetween(lat1, lon1, lat2, lon2, results);
      return results[0];
     }  
    }
    复制代码

    5、UtilTool–>工具类

    复制代码
    package com.ljq.activity;
     
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.ProtocolException;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.List;
    import java.util.Locale;
     
    import org.apache.http.client.ClientProtocolException;
    import org.json.JSONException;
    import org.json.JSONObject;
     
    import android.content.Context;
    import android.location.Location;
    import android.location.LocationManager;
    import android.telephony.NeighboringCellInfo;
    import android.telephony.TelephonyManager;
    import android.telephony.cdma.CdmaCellLocation;
    import android.telephony.gsm.GsmCellLocation;
    import android.util.Log;
    import android.widget.Toast;
     
    public class UtilTool {
     public static boolean isGpsEnabled(LocationManager locationManager) {
      boolean isOpenGPS = locationManager.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER);
      boolean isOpenNetwork = locationManager.isProviderEnabled(android.location.LocationManager.NETWORK_PROVIDER);
      if (isOpenGPS || isOpenNetwork) {
       return true;
      }
      return false;
     } 
      
        /**
         * 根据基站信息获取经纬度 
         * 
         * 原理向http://www.google.com/loc/json发送http的post请求,根据google返回的结果获取经纬度
         * 
         * @param cellIds
         * @return
         * @throws Exception 
         */public static Location callGear(Context ctx, ArrayList<CellInfo> cellIds) throws Exception {
         String result="";
         JSONObject data=null;
         if (cellIds == null||cellIds.size()==0) {
          UtilTool.alert(ctx, "cell request param null");
          return null;
         };
          
      try {
       result = UtilTool.getResponseResult(ctx, "http://www.google.com/loc/json", cellIds);
        
       if(result.length() <= 1)
        return null;
       data = new JSONObject(result);
       data = (JSONObject) data.get("location");
     
       Location loc = new Location(LocationManager.NETWORK_PROVIDER);
       loc.setLatitude((Double) data.get("latitude"));
       loc.setLongitude((Double) data.get("longitude"));
       loc.setAccuracy(Float.parseFloat(data.get("accuracy").toString()));
       loc.setTime(UtilTool.getUTCTime());
       return loc;
      } catch (JSONException e) {
       return null;
      } catch (UnsupportedEncodingException e) {
       e.printStackTrace();
      } catch (ClientProtocolException e) {
       e.printStackTrace();
      } catch (IOException e) {
       e.printStackTrace();
      }
      return null;
     }
     
        /**
         * 接收Google返回的数据格式
         * 
      * 出参:{"location":{"latitude":26.0673834,"longitude":119.3119936,
      *       "address":{"country":"中国","country_code":"CN","region":"福建省","city":"福州市",
      *       "street":"五一中路","street_number":"128号"},"accuracy":935.0},
      *       "access_token":"2:xiU8YrSifFHUAvRJ:aj9k70VJMRWo_9_G"}
      * 请求路径:http://maps.google.cn/maps/geo?key=abcdefg&q=26.0673834,119.3119936
         * 
         * @param cellIds
         * @return
         * @throws UnsupportedEncodingException
         * @throws MalformedURLException
         * @throws IOException
         * @throws ProtocolException
         * @throws Exception
         */public static String getResponseResult(Context ctx,String path, ArrayList<CellInfo> cellInfos)
       throws UnsupportedEncodingException, MalformedURLException,
       IOException, ProtocolException, Exception {
      String result="";
      Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
        "in param: "+getRequestParams(cellInfos));
      InputStream inStream=UtilTool.sendPostRequest(path, 
        getRequestParams(cellInfos), "UTF-8");
      if(inStream!=null){
       byte[] datas=UtilTool.readInputStream(inStream);
       if(datas!=null&&datas.length>0){
        result=new String(datas, "UTF-8");
        //Log.i(ctx.getClass().getSimpleName(), "receive result:"+result);//服务器返回的结果信息
        Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
            "google cell receive data result:"+result);
       }else{
        Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
          "google cell receive data null");
       }
      }else{
       Log.i(ctx.getApplicationContext().getClass().getSimpleName(), 
           "google cell receive inStream null");
      }
      return result;
     }
         
      
     /**
      * 拼装json请求参数,拼装基站信息
      * 
      * 入参:{'version': '1.1.0','host': 'maps.google.com','home_mobile_country_code': 460,
      *       'home_mobile_network_code': 14136,'radio_type': 'cdma','request_address': true,
      *       'address_language': 'zh_CN','cell_towers':[{'cell_id': '12835','location_area_code': 6,
      *       'mobile_country_code': 460,'mobile_network_code': 14136,'age': 0}]}
      * @param cellInfos
      * @return*/public static String getRequestParams(List<CellInfo> cellInfos){
      StringBuffer sb=new StringBuffer("");
      sb.append("{");
      if(cellInfos!=null&&cellInfos.size()>0){
       sb.append("'version': '1.1.0',"); //google api 版本[必]
       sb.append("'host': 'maps.google.com',"); //服务器域名[必]
       sb.append("'home_mobile_country_code': "+cellInfos.get(0).getMobileCountryCode()+","); //移动用户所属国家代号[选 中国460]
       sb.append("'home_mobile_network_code': "+cellInfos.get(0).getMobileNetworkCode()+","); //移动系统号码[默认0]
       sb.append("'radio_type': '"+cellInfos.get(0).getRadioType()+"',"); //信号类型[选 gsm|cdma|wcdma]
       sb.append("'request_address': true,"); //是否返回数据[必]
       sb.append("'address_language': 'zh_CN',"); //反馈数据语言[选 中国 zh_CN]
       sb.append("'cell_towers':["); //移动基站参数对象[必]
       for(CellInfo cellInfo:cellInfos){
        sb.append("{");
        sb.append("'cell_id': '"+cellInfo.getCellId()+"',"); //基站ID[必]
        sb.append("'location_area_code': "+cellInfo.getLocationAreaCode()+","); //地区区域码[必]
        sb.append("'mobile_country_code': "+cellInfo.getMobileCountryCode()+","); 
        sb.append("'mobile_network_code': "+cellInfo.getMobileNetworkCode()+",");
        sb.append("'age': 0"); //使用好久的数据库[选 默认0表示使用最新的数据库]
        sb.append("},");
       }
       sb.deleteCharAt(sb.length()-1);
       sb.append("]");
      }
      sb.append("}");
      return sb.toString();
     }
         
     /**
      * 获取UTC时间
      * 
      * UTC + 时区差 = 本地时间(北京为东八区)
      * 
      * @return*/public static long getUTCTime() { 
         //取得本地时间
            Calendar cal = Calendar.getInstance(Locale.CHINA);
            //取得时间偏移量
            int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET); 
            //取得夏令时差
            int dstOffset = cal.get(java.util.Calendar.DST_OFFSET); 
            //从本地时间里扣除这些差量,即可以取得UTC时间
            cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset)); 
            return cal.getTimeInMillis();
        }
     /**
      * 初始化,记得放在onCreate()方法里初始化,获取基站信息
      * 
      * @return*/public static ArrayList<CellInfo> init(Context ctx) {
      ArrayList<CellInfo> cellInfos = new ArrayList<CellInfo>();
       
      TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
      //网络制式
      int type = tm.getNetworkType();
          /**
         * 获取SIM卡的IMSI码
         * SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,
         * 储存在SIM卡中,可用于区别移动用户的有效信息。IMSI由MCC、MNC、MSIN组成,其中MCC为移动国家号码,由3位数字组成,
         * 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成,
         * 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;MSIN为移动客户识别码,采用等长11位数字构成。
         * 唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可
       */
      String imsi = tm.getSubscriberId(); 
      alert(ctx, "imsi: "+imsi);
      //为了区分移动、联通还是电信,推荐使用imsi来判断(万不得己的情况下用getNetworkType()判断,比如imsi为空时)
      if(imsi!=null&&!"".equals(imsi)){ 
       alert(ctx, "imsi");
       if (imsi.startsWith("46000") || imsi.startsWith("46002")) {// 因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号
        // 中国移动
        mobile(cellInfos, tm);
       } else if (imsi.startsWith("46001")) {
        // 中国联通
        union(cellInfos, tm);
       } else if (imsi.startsWith("46003")) {
        // 中国电信
        cdma(cellInfos, tm);
       }   
      }else{
       alert(ctx, "type");
       // 在中国,联通的3G为UMTS或HSDPA,电信的3G为EVDO
       // 在中国,移动的2G是EGDE,联通的2G为GPRS,电信的2G为CDMA
       // String OperatorName = tm.getNetworkOperatorName(); 
        
       //中国电信 
       if (type == TelephonyManager.NETWORK_TYPE_EVDO_A 
         || type == TelephonyManager.NETWORK_TYPE_EVDO_0
         || type == TelephonyManager.NETWORK_TYPE_CDMA 
         || type ==TelephonyManager.NETWORK_TYPE_1xRTT){
        cdma(cellInfos, tm);
       }
       //移动(EDGE(2.75G)是GPRS(2.5G)的升级版,速度比GPRS要快。目前移动基本在国内升级普及EDGE,联通则在大城市部署EDGE。)
       else if(type == TelephonyManager.NETWORK_TYPE_EDGE
         || type == TelephonyManager.NETWORK_TYPE_GPRS ){
        mobile(cellInfos, tm);
       }
       //联通(EDGE(2.75G)是GPRS(2.5G)的升级版,速度比GPRS要快。目前移动基本在国内升级普及EDGE,联通则在大城市部署EDGE。)
       else if(type == TelephonyManager.NETWORK_TYPE_GPRS
         ||type == TelephonyManager.NETWORK_TYPE_EDGE
         ||type == TelephonyManager.NETWORK_TYPE_UMTS
         ||type == TelephonyManager.NETWORK_TYPE_HSDPA){
        union(cellInfos, tm);
       }
      }
       
      return cellInfos;
     }
     
     
     /**
      * 电信
      * 
      * @param cellInfos
      * @param tm
      */private static void cdma(ArrayList<CellInfo> cellInfos, TelephonyManager tm) {
      CdmaCellLocation location = (CdmaCellLocation) tm.getCellLocation();
      CellInfo info = new CellInfo();
      info.setCellId(location.getBaseStationId());
      info.setLocationAreaCode(location.getNetworkId());
      info.setMobileNetworkCode(String.valueOf(location.getSystemId()));
      info.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
      info.setRadioType("cdma");
      cellInfos.add(info);
       
      //前面获取到的都是单个基站的信息,接下来再获取周围邻近基站信息以辅助通过基站定位的精准性
      // 获得邻近基站信息
      List<NeighboringCellInfo> list = tm.getNeighboringCellInfo();
      int size = list.size();
      for (int i = 0; i < size; i++) {
       CellInfo cell = new CellInfo();
       cell.setCellId(list.get(i).getCid());
       cell.setLocationAreaCode(location.getNetworkId());
       cell.setMobileNetworkCode(String.valueOf(location.getSystemId()));
       cell.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
       cell.setRadioType("cdma");
       cellInfos.add(cell);
      }
     }
     
     
     /**
      * 移动
      * 
      * @param cellInfos
      * @param tm
      */private static void mobile(ArrayList<CellInfo> cellInfos,
       TelephonyManager tm) {
      GsmCellLocation location = (GsmCellLocation)tm.getCellLocation();  
      CellInfo info = new CellInfo();
      info.setCellId(location.getCid());
      info.setLocationAreaCode(location.getLac());
      info.setMobileNetworkCode(tm.getNetworkOperator().substring(3, 5));
      info.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
      info.setRadioType("gsm");
      cellInfos.add(info);
       
      //前面获取到的都是单个基站的信息,接下来再获取周围邻近基站信息以辅助通过基站定位的精准性
      // 获得邻近基站信息
      List<NeighboringCellInfo> list = tm.getNeighboringCellInfo();
      int size = list.size();
      for (int i = 0; i < size; i++) {
       CellInfo cell = new CellInfo();
       cell.setCellId(list.get(i).getCid());
       cell.setLocationAreaCode(location.getLac());
       cell.setMobileNetworkCode(tm.getNetworkOperator().substring(3, 5));
       cell.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
       cell.setRadioType("gsm");
       cellInfos.add(cell);
      }
     }
     
     
     /**
      *  联通
      *  
      * @param cellInfos
      * @param tm
      */private static void union(ArrayList<CellInfo> cellInfos, TelephonyManager tm) {
      GsmCellLocation location = (GsmCellLocation)tm.getCellLocation();  
      CellInfo info = new CellInfo();
      //经过测试,获取联通数据以下两行必须去掉,否则会出现错误,错误类型为JSON Parsing Error
      //info.setMobileNetworkCode(tm.getNetworkOperator().substring(3, 5));  
      //info.setMobileCountryCode(tm.getNetworkOperator().substring(0, 3));
      info.setCellId(location.getCid());
      info.setLocationAreaCode(location.getLac());
      info.setMobileNetworkCode("");
      info.setMobileCountryCode("");
      info.setRadioType("gsm");
      cellInfos.add(info);
       
      //前面获取到的都是单个基站的信息,接下来再获取周围邻近基站信息以辅助通过基站定位的精准性
      // 获得邻近基站信息
      List<NeighboringCellInfo> list = tm.getNeighboringCellInfo();
      int size = list.size();
      for (int i = 0; i < size; i++) {
       CellInfo cell = new CellInfo();
       cell.setCellId(list.get(i).getCid());
       cell.setLocationAreaCode(location.getLac());
       cell.setMobileNetworkCode("");
       cell.setMobileCountryCode("");
       cell.setRadioType("gsm");
       cellInfos.add(cell);
      }
     }
     /**
      * 提示
      * 
      * @param ctx
      * @param msg
      */public static void alert(Context ctx,String msg){
      Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
     }
      
     /**
      * 发送post请求,返回输入流
      * 
      * @param path 访问路径
      * @param params json数据格式
      * @param encoding 编码
      * @return
      * @throws UnsupportedEncodingException
      * @throws MalformedURLException
      * @throws IOException
      * @throws ProtocolException
      */public static InputStream sendPostRequest(String path, String params, String encoding)
     throws UnsupportedEncodingException, MalformedURLException,
     IOException, ProtocolException {
      byte[] data = params.getBytes(encoding);
      URL url = new URL(path);
      HttpURLConnection conn = (HttpURLConnection)url.openConnection();
      conn.setRequestMethod("POST");
      conn.setDoOutput(true);
      //application/x-javascript text/xml->xml数据 application/x-javascript->json对象 application/x-www-form-urlencoded->表单数据
      conn.setRequestProperty("Content-Type", "application/x-javascript; charset="+ encoding);
      conn.setRequestProperty("Content-Length", String.valueOf(data.length));
      conn.setConnectTimeout(5 * 1000);
      OutputStream outStream = conn.getOutputStream();
      outStream.write(data);
      outStream.flush();
      outStream.close();
      if(conn.getResponseCode()==200)
       return conn.getInputStream();
      return null;
     }
      
     /**
      * 发送get请求
      * 
      * @param path 请求路径
      * @return
      * @throws Exception
      */public static String sendGetRequest(String path) throws Exception {
      URL url = new URL(path);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setConnectTimeout(5 * 1000);
      conn.setRequestMethod("GET");
      InputStream inStream = conn.getInputStream();
      byte[] data = readInputStream(inStream);
      String result = new String(data, "UTF-8");
      return result;
     }
      
     /**
      * 从输入流中读取数据
      * @param inStream
      * @return
      * @throws Exception
      */public static byte[] readInputStream(InputStream inStream) throws Exception{
      ByteArrayOutputStream outStream = new ByteArrayOutputStream();
      byte[] buffer = new byte[1024];
      int len = 0;
      while( (len = inStream.read(buffer)) !=-1 ){
       outStream.write(buffer, 0, len);
      }
      byte[] data = outStream.toByteArray();//网页的二进制数据
      outStream.close();
      inStream.close();
      return data;
     }
     
      
    }
    复制代码

    6、main.xml–>布局文件

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"><EditText android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:cursorVisible="false"
            android:editable="false"
            android:id="@+id/editText"/></LinearLayout>
    复制代码

    7、清单文件

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.ljq.activity" android:versionCode="1"
     android:versionName="1.0"><application android:icon="@drawable/icon"
      android:label="@string/app_name"><activity android:name=".GpsActivity"
       android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category
         android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><service android:label="GPS服务" android:name=".GpsService" /></application><uses-sdk android:minSdkVersion="7" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    </manifest>
    复制代码

    效果如下:

  • 相关阅读:
    SQL GUID和自增列做主键的优缺点
    php 一维数组去重
    php + crontab 执行定时任务
    PHP内置函数生成随机数的方法汇总
    PHP替换回车换行的三种方法
    Yii2查询之where条件拼装
    yii2 使用阿里大鱼短信
    javascript对数据处理
    Vue 404页面处理
    vue 中view层中方法的使用
  • 原文地址:https://www.cnblogs.com/LiaoHao/p/3298514.html
Copyright © 2020-2023  润新知