博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android之应用APN、WIFI、GPS定位小例子
阅读量:5950 次
发布时间:2019-06-19

本文共 15263 字,大约阅读时间需要 50 分钟。

转自一个网上项目,由于是例子打包下载,出处不详。例子中自我写入注释。

 

Activity类:

package com.maxtech.common;
import com.maxtech.common.gps.GpsTask;
import com.maxtech.common.gps.GpsTaskCallBack;
import com.maxtech.common.gps.GpsTask.GpsData;
import com.maxtech.common.gps.IAddressTask.MLocation;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public 
class GpsActivity 
extends Activity 
implements OnClickListener {
    
private TextView gps_tip = 
null;
    
//
声明AlertDialog
    
private AlertDialog dialog = 
null;
    @Override
    
public 
void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
//
布局主要就是三个按钮与一个Textview
        gps_tip = (TextView) findViewById(R.id.gps_tip);
        findViewById(R.id.do_gps).setOnClickListener(GpsActivity.
this);
        findViewById(R.id.do_apn).setOnClickListener(GpsActivity.
this);
        findViewById(R.id.do_wifi).setOnClickListener(GpsActivity.
this);
        
        
//
这个ProgressDialog是用于读取数据时显示
        dialog = 
new ProgressDialog(GpsActivity.
this);
        dialog.setTitle("请稍等...");
        dialog.setMessage("正在定位...");
    }
    
//
各个按钮的工作
    @SuppressWarnings("unchecked")
    @Override
    
public 
void onClick(View v) {
        gps_tip.setText("");
        
switch (v.getId()) {
        
case R.id.do_apn:
            
//
进行apn的定位
            do_apn();
            
break;
        
case R.id.do_gps:
            
//
进行gps定位
            GpsTask gpstask = 
new GpsTask(GpsActivity.
this,
                    
new GpsTaskCallBack() {
                        @Override
                        
public 
void gpsConnectedTimeOut() {
                            gps_tip.setText("获取GPS超时了");
                        }
                        @Override
                        
public 
void gpsConnected(GpsData gpsdata) {
                            do_gps(gpsdata);
                        }
                    }, 30 * 1000);
            gpstask.execute();
            
break;
        
//
进行wifi定位
        
case R.id.do_wifi:
            do_wifi();
            
break;
        }
    }
    
private 
void do_apn() {
        
//
异步
        
new AsyncTask<Void, Void, String>() {
            @Override
            
protected String doInBackground(Void... params) {
                MLocation location = 
null;
                
try {
                    
//
具体操作
                    location = 
new AddressTask(GpsActivity.
this,
                            AddressTask.DO_APN).doApnPost();
                } 
catch (Exception e) {
                    e.printStackTrace();
                }
                
if(location == 
null)
                    
return 
null;
                
return location.toString();
            }
            
//
异步操作前执行dialog显示
            @Override
            
protected 
void onPreExecute() {
                dialog.show();
                
super.onPreExecute();
            }
            
//
异步操作后显示相关信息并且关闭dialog
            @Override
            
protected 
void onPostExecute(String result) {
                
if(result == 
null){
                    gps_tip.setText("基站定位失败了...");                    
                }
else {
                    gps_tip.setText(result);
                }
                dialog.dismiss();
                
super.onPostExecute(result);
            }
            
        }.execute();
    }
    
private 
void do_gps(
final GpsData gpsdata) {
        
new AsyncTask<Void, Void, String>() {
            @Override
            
protected String doInBackground(Void... params) {
                MLocation location = 
null;
                
try {
                    Log.i("do_gpspost", "经纬度" + gpsdata.getLatitude() + "----" + gpsdata.getLongitude());
                    
//
gps定位具体操作
                    location = 
new AddressTask(GpsActivity.
this,
                            AddressTask.DO_GPS).doGpsPost(gpsdata.getLatitude(),
                                    gpsdata.getLongitude());
                } 
catch (Exception e) {
                    e.printStackTrace();
                }
                
if(location == 
null)
                    
return "GPS信息获取错误";
                
return location.toString();
            }
            @Override
            
protected 
void onPreExecute() {
                dialog.show();
                
super.onPreExecute();
            }
            @Override
            
protected 
void onPostExecute(String result) {
                gps_tip.setText(result);
                dialog.dismiss();
                
super.onPostExecute(result);
            }
            
        }.execute();
    }
    
private 
void do_wifi() {
        
new AsyncTask<Void, Void, String>() {
            @Override
            
protected String doInBackground(Void... params) {
                MLocation location = 
null;
                
try {
                    location = 
new AddressTask(GpsActivity.
this,
                            AddressTask.DO_WIFI).doWifiPost();
                } 
catch (Exception e) {
                    e.printStackTrace();
                }
                
if(location == 
null)
                    
return 
null;
                
return location.toString();
            }
            @Override
            
protected 
void onPreExecute() {
                dialog.show();
                
super.onPreExecute();
            }
            @Override
            
protected 
void onPostExecute(String result) {
                
if(result != 
null){
                    gps_tip.setText(result);
                }
else {
                    gps_tip.setText("WIFI定位失败了...");
                }
                
                dialog.dismiss();
                
super.onPostExecute(result);
            }
            
        }.execute();
    }
}

GPS接口: 

package com.maxtech.common.gps;
import com.maxtech.common.gps.GpsTask.GpsData;
public 
interface GpsTaskCallBack {
    
public 
void gpsConnected(GpsData gpsdata);
    
    
public 
void gpsConnectedTimeOut();
}     

GpsTask gps的具体实现类:

package com.maxtech.common.gps;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@SuppressWarnings("rawtypes")
public 
class GpsTask 
extends AsyncTask {
    
private GpsTaskCallBack callBk = 
null;
    
private Activity context = 
null;
    
private LocationManager locationManager = 
null;
    
private LocationListener locationListener = 
null;
    
private Location location = 
null;
    
private 
boolean TIME_OUT = 
false;
    
private 
boolean DATA_CONNTECTED = 
false;
    
private 
long TIME_DURATION = 5000;
    
private GpsHandler handler = 
null;
            
private 
class GpsHandler 
extends Handler {
        
                @Override
                
public 
void handleMessage(Message msg) {
                    
super.handleMessage(msg);
                    
if(callBk == 
null)
                        
return;
                    
switch (msg.what) {
                    
case 0:
                        callBk.gpsConnected((GpsData)msg.obj);
                        
break;
                    
case 1:
                        callBk.gpsConnectedTimeOut();
                        
break;
                    }
                }
                
            }
    
public GpsTask(Activity context, GpsTaskCallBack callBk) {
        
this.callBk = callBk;
        
this.context = context;
        gpsInit();
    }
    
public GpsTask(Activity context, GpsTaskCallBack callBk, 
long time_out) {
        
this.callBk = callBk;
        
this.context = context;
        
this.TIME_DURATION = time_out;
        gpsInit();
    }
    
private 
void gpsInit() {
        locationManager = (LocationManager) context
                .getSystemService(Context.LOCATION_SERVICE);
        handler = 
new GpsHandler();
        
if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            
        } 
else {
            
//
GPSû�д�
            
            TIME_OUT = 
true;
        }
        locationListener = 
new LocationListener() {
            @Override
            
public 
void onStatusChanged(String provider, 
int status,
                    Bundle extras) {
            }
            @Override
            
public 
void onProviderEnabled(String provider) {
            }
            @Override
            
public 
void onProviderDisabled(String provider) {
            }
            
//
位置改变才会调用
            @Override
            
public 
void onLocationChanged(Location l) {
                DATA_CONNTECTED = 
true;
                Message msg = handler.obtainMessage();
                msg.what = 0;
                msg.obj = transData(l);
                handler.sendMessage(msg);
            }
        };
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                100, locationListener);
    }
    @Override
    
protected Object doInBackground(Object... params) {
        
while (!TIME_OUT && !DATA_CONNTECTED) {
            location = locationManager
                    .getLastKnownLocation(LocationManager.GPS_PROVIDER);
            
if (location != 
null && callBk != 
null) {
                
//
�����һ�����
                Message msg = handler.obtainMessage();
                msg.what = 0;
                msg.obj = transData(location);
                handler.sendMessage(msg);
                
break;
            }
        }
        
return 
null;
    }
    @Override
    
protected 
void onPreExecute() {
        
super.onPreExecute();
        
//
Timer是自动另外开的一条线程
        Timer timer = 
new Timer();
        timer.schedule(
new TimerTask() {
            @Override
            
public 
void run() {
                TIME_OUT = 
true;
                
            }
        }, TIME_DURATION);
    }
    @SuppressWarnings("unchecked")
    @Override
    
protected 
void onPostExecute(Object result) {
        locationManager.removeUpdates(locationListener);
        
//
 ��ȡ��ʱ
        
if (TIME_OUT && callBk != 
null){
            handler.sendEmptyMessage(1);
        }
        
super.onPostExecute(result);
    }
    
private GpsData transData(Location location) {
        GpsData gpsData = 
new GpsData();
        gpsData.setAccuracy(location.getAccuracy());
        gpsData.setAltitude(location.getAltitude());
        gpsData.setBearing(location.getBearing());
        gpsData.setLatitude(location.getLatitude());
        gpsData.setLongitude(location.getLongitude());
        gpsData.setSpeed(location.getSpeed());
        gpsData.setTime(location.getTime());
        
return gpsData;
    }
    
public 
static 
class GpsData {
        
private 
double latitude = 0;
        
private 
double longitude = 0;
        
private 
float accuracy = 0;
        
private 
double altitude = 0;
        
private 
float bearing = 0;
        
private 
float speed = 0;
        
private 
long time = 0;
        
public 
double getLatitude() {
            
return latitude;
        }
        
public 
void setLatitude(
double latitude) {
            
this.latitude = latitude;
        }
        
public 
double getLongitude() {
            
return longitude;
        }
        
public 
void setLongitude(
double longitude) {
            
this.longitude = longitude;
        }
        
public 
float getAccuracy() {
            
return accuracy;
        }
        
public 
void setAccuracy(
float accuracy) {
            
this.accuracy = accuracy;
        }
        
public 
double getAltitude() {
            
return altitude;
        }
        
public 
void setAltitude(
double altitude) {
            
this.altitude = altitude;
        }
        
public 
float getBearing() {
            
return bearing;
        }
        
public 
void setBearing(
float bearing) {
            
this.bearing = bearing;
        }
        
public 
float getSpeed() {
            
return speed;
        }
        
public 
void setSpeed(
float speed) {
            
this.speed = speed;
        }
        
public 
long getTime() {
            
return time;
        }
        
public 
void setTime(
long time) {
            
this.time = time;
        }
    }
}  

 

AddressTask 使用post访问的参数设置

package com.maxtech.common;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.json.JSONObject;
import android.app.Activity;
import android.net.Proxy;
import com.maxtech.common.gps.IAddressTask;
public 
class AddressTask 
extends IAddressTask {
    
public 
static 
final 
int DO_APN = 0;
    
public 
static 
final 
int DO_WIFI = 1;
    
public 
static 
final 
int DO_GPS = 2;
    
private 
int postType = -1;
    
    
public AddressTask(Activity context, 
int postType) {
        
super(context);
        
this.postType = postType;
    }
    
    @Override
    
public HttpResponse execute(JSONObject params) 
throws Exception {
        HttpClient httpClient = 
new DefaultHttpClient();
        HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),
                20 * 1000);
        HttpConnectionParams.setSoTimeout(httpClient.getParams(), 20 * 1000);
        
        
//
访问json
        HttpPost post = 
new HttpPost("http://74.125.71.147/loc/json");
        
//
 设置代理
        
if (postType == DO_APN) {
            String proxyHost = Proxy.getDefaultHost();
            
if(proxyHost != 
null) {
                HttpHost proxy = 
new HttpHost(proxyHost, 80);
                httpClient.getParams().setParameter(
                        ConnRouteParams.DEFAULT_PROXY, proxy);
            }
        }
        
//
请求一系列的参数
        StringEntity se = 
new StringEntity(params.toString());
        post.setEntity(se);
        HttpResponse response = httpClient.execute(post);
        
return response;
    }
}  

 

IAddressTask  apn、wifi、gps具体实现类:

package com.maxtech.common.gps;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
public 
abstract 
class IAddressTask {
    
protected Activity context;
    
    
public IAddressTask(Activity context) {
        
this.context = context;
    }
    
    
public 
abstract HttpResponse execute(JSONObject params) 
throws Exception;
    
    
public MLocation doWifiPost() 
throws Exception {
        
return transResponse(execute(doWifi()));
    }
    
    
public MLocation doApnPost() 
throws Exception  {
        
return transResponse(execute(doApn()));
    }
    
    
public MLocation doGpsPost(
double lat, 
double lng) 
throws Exception {
        
return transResponse(execute(doGps(lat, lng)));
    }
    
private MLocation transResponse(HttpResponse response) {
        MLocation location = 
null;
        
if (response.getStatusLine().getStatusCode() == 200) {
            location = 
new MLocation();
            HttpEntity entity = response.getEntity();
            BufferedReader br;
            
try {
                br = 
new BufferedReader(
new InputStreamReader(
                        entity.getContent()));
                StringBuffer sb = 
new StringBuffer();
                String result = br.readLine();
                
while (result != 
null) {
                    sb.append(result);
                    result = br.readLine();
                }
                JSONObject json = 
new JSONObject(sb.toString());
                JSONObject lca = json.getJSONObject("location");
                location.Access_token = json.getString("access_token");
                
if (lca != 
null) {
                    
if(lca.has("accuracy"))
                        location.Accuracy = lca.getString("accuracy");
                    
if(lca.has("longitude"))
                        location.Longitude = lca.getDouble("longitude");
                    
if(lca.has("latitude"))
                        location.Latitude = lca.getDouble("latitude");
                    
if(lca.has("address")) {
                        JSONObject address = lca.getJSONObject("address");
                        
if (address != 
null) {
                            
if(address.has("region"))
                                location.Region = address.getString("region");
                            
if(address.has("street_number"))
                                location.Street_number = address
                                        .getString("street_number");
                            
if(address.has("country_code"))
                                location.Country_code = address
                                        .getString("country_code");
                            
if(address.has("street"))
                                location.Street = address.getString("street");
                            
if(address.has("city"))
                                location.City = address.getString("city");
                            
if(address.has("country"))
                                location.Country = address.getString("country");
                        }
                    }
                }
            } 
catch (Exception e) {
                e.printStackTrace();
                location = 
null;
            }
        }
        
return location;
    }
    
private JSONObject doGps(
double lat, 
double lng) 
throws Exception {
        JSONObject holder = 
new JSONObject();
        holder.put("version", "1.1.0");
        holder.put("host", "maps.google.com");
        holder.put("address_language", "zh_CN");
        holder.put("request_address", 
true);
        
        JSONObject data = 
new JSONObject();
        data.put("latitude", lat);
        data.put("longitude", lng);
        holder.put("location", data);
        
return holder;
    }
    
    
private JSONObject doApn() 
throws Exception {
        JSONObject holder = 
new JSONObject();
        holder.put("version", "1.1.0");
        holder.put("host", "maps.google.com");
        holder.put("address_language", "zh_CN");
        holder.put("request_address", 
true);
        
        
//
获得GSM相关信息
        TelephonyManager tm = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        GsmCellLocation gcl = (GsmCellLocation) tm.getCellLocation();
        
int cid = gcl.getCid();
        
int lac = gcl.getLac();
        
int mcc = Integer.valueOf(tm.getNetworkOperator().substring(0,
                3));
        
int mnc = Integer.valueOf(tm.getNetworkOperator().substring(3,
                5));
        
//
请求参数
        JSONArray array = 
new JSONArray();
        JSONObject data = 
new JSONObject();
        data.put("cell_id", cid);
        data.put("location_area_code", lac);
        data.put("mobile_country_code", mcc);
        data.put("mobile_network_code", mnc);
        array.put(data);
        holder.put("cell_towers", array);
        
        
return holder;
    }
    
    
private JSONObject doWifi() 
throws Exception {
        JSONObject holder = 
new JSONObject();
        holder.put("version", "1.1.0");
        holder.put("host", "maps.google.com");
        holder.put("address_language", "zh_CN");
        holder.put("request_address", 
true);
        
        
//
获得wifi相关信息
        WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
        
        
if(wifiManager.getConnectionInfo().getBSSID() == 
null) {
            
throw 
new RuntimeException("bssid is null");
        }
        
        JSONArray array = 
new JSONArray();
        JSONObject data = 
new JSONObject();
        data.put("mac_address", wifiManager.getConnectionInfo().getBSSID());  
        data.put("signal_strength", 8);  
        data.put("age", 0);  
        array.put(data);
        holder.put("wifi_towers", array);
        
        
return holder;
    }
    
public 
static 
class MLocation {
        
public String Access_token;
        
public 
double Latitude;
        
public 
double Longitude;
        
public String Accuracy;
        
public String Region;
        
public String Street_number;
        
public String Country_code;
        
public String Street;
        
public String City;
        
public String Country;
        @Override
        
public String toString() {
            StringBuffer buffer = 
new StringBuffer();
            buffer.append("Access_token:" + Access_token + "\n");
            buffer.append("Region:" + Region + "\n");
            buffer.append("Accuracy:" + Accuracy + "\n");
            buffer.append("Latitude:" + Latitude + "\n");
            buffer.append("Longitude:" + Longitude + "\n");
            buffer.append("Country_code:" + Country_code + "\n");
            buffer.append("Country:" + Country + "\n");
            buffer.append("City:" + City + "\n");
            buffer.append("Street:" + Street + "\n");
            buffer.append("Street_number:" + Street_number + "\n");
            
return buffer.toString();
        }
    }
}  

 

转载地址:http://aiixx.baihongyu.com/

你可能感兴趣的文章
PERL删除数组元素的多种方法
查看>>
IOS 6已经可以使用个人热点了!
查看>>
Js的常见函数
查看>>
电脑能上网,但是打开“网上邻居”却找不到“本地连接”
查看>>
Qt开发的UDP发送端
查看>>
什么是面向对象程序设计
查看>>
p:pickList验证失败后无法填充数据
查看>>
python grpc 应用
查看>>
我的友情链接
查看>>
CentOs 7.4 安装git
查看>>
jsonObject 方法putAll 的使用
查看>>
四、mysql 查询
查看>>
Win7+CentOS 6.9双系统安装教程
查看>>
我的友情链接
查看>>
MYSQL性能查看(命中率,慢查询)
查看>>
saltstack 执行结果返回到mysql
查看>>
乱起八糟用linux之制作光盘镜像
查看>>
Linux的DNS的53端口
查看>>
谈并行项目中的(一)团队协作与知识管理
查看>>
67.sed工具
查看>>