Android开发获取GPS位置,包含apn\wifi\gps 几种方法

简介:
一部分:几种定位简述
1.gps定位:
 
优点:最简单的手机定位方式当然是通过GPS模块(现在大部分的智能机应该都有了)。GPS方式准确度是最高的
缺点1.比较耗电;
       2.绝大部分用户默认不开启GPS模块;
       3.从GPS模块启动到获取第一次定位数据,可能需要比较长的时间;
       4.室内几乎无法使用。
这其中,缺点2,3都是比较致命的。需要指出的是,GPS走的是卫星通信的通道,在没有网络连接的情况下也能用。
 
有网络、室内不可用、定位时间长、位置精确
 
2.基站定位
大致思路就是采集到手机上的基站ID号(cellid)和其它的一些信息(MNC,MCC,LAC等等),然后通过网络访问一些定位服务,获取 并返回对应的经纬度坐标。基站定位的精确度不如GPS,好处是能够在室内用,只要网络通畅就行。
 
有网络 室内可用 定位方式不精确
 
3.WIFI定位
和基站定位类似,这种方式是通过获取当前所用的wifi的一些信息,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使 用网络,所以在Android也统称为Network方式。
 
与基站定位类似
 
4.AGPS定位
最后需要解释一点的是AGPS方式。很多人将它和基站定位混为一谈,但其实AGPS的本质仍然是GPS,只是它会使用基站信息对获取GPS进行辅助,然后 还能对获取到的GPS结果进行修正,所以AGPS要比传统的GPS更快,准确度略高。
 
有网络、类似gps定位、但比传统Gps定位更快,准确度略高
 
第二部分:
locationManager.getLastKnownLocation()总是会出现取不到数据的情况,所以这里没有使用这个方法,避免 了取不到数据的问题
 
第三部分:使用异步加载,提高性能
 
================================代码===========================
 

\  \

 

 

1.Activity

package com.example.gpsdemo;  
 
import com.example.gpsdemo.util.GetLocation;  
import com.example.gpsdemo.util.LMLocation;  
 
import android.app.Activity;  
import android.app.AlertDialog;  
import android.app.ProgressDialog;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.TextView;  
 
public class MainActivity extends Activity {  
    LMLocation lmLocation;  
    TextView textView;  
    public MainActivity instance;  
    private AlertDialog dialog;  
    @Override
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        textView = (TextView) findViewById(R.id.textView2);  
        instance = this;  
        dialog = new ProgressDialog(MainActivity.this);  
        dialog.setTitle("请稍等...");  
        dialog.setMessage("正在定位...");  
        Button button = (Button) findViewById(R.id.button1);  
        button.setOnClickListener(new OnClickListener() {  
 
            @Override
            public void onClick(View v) {  
                // TODO Auto-generated method stub
                new GetLocation(dialog, textView, instance).DisplayLocation();  
            }  
        });  
 
    }  
 
}  

2.与MainActivity对应的布局

<xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
     
       <android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:padding="@dimen/padding_medium"
        android:text="@string/hello_world"
        tools:context=".MainActivity" />
 
     
        <android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/textView2"
        android:layout_marginRight="52dp"
        android:text="定位" />

3.AndroidManifest.xml

  1. package="com.example.gpsdemo"
  2.     android:versionCode="1"
  3.     android:versionName="1.0" >
  4.  
  5.     <uses-sdk< li="">
  6.         android:minSdkVersion="8"
  7.         android:targetSdkVersion="15" />
  8.  
  9.     <application< li="">
  10.         android:icon="@drawable/ic_launcher"
  11.         android:label="@string/app_name"
  12.         android:theme="@style/AppTheme" >
  13.         <activity< li="">
  14.             android:name=".MainActivity"
  15.             android:label="@string/title_activity_main" >
4.工具类两个:(1)

package com.example.gpsdemo.util;  
 
import android.app.AlertDialog;  
import android.content.Context;  
import android.os.AsyncTask;  
import android.util.Log;  
import android.widget.TextView;  
 
public class GetLocation {  
    AlertDialog dialog;  
    TextView textView;  
    Context context;  
 
    public GetLocation(AlertDialog dialog, TextView textView, Context context) {  
        this.dialog = dialog;  
        this.textView = textView;  
        this.context = context;  
 
    }  
 
    public void DisplayLocation() {  
        new AsyncTask() {  
 
            @Override
            protected String doInBackground=\'#\'"  
                LMLocation location = null;  
                try {  
                    location = new GPSLocation().getGPSInfo(context);  
                } catch (Exception e) {  
                    // TODO Auto-generated catch block
                    e.printStackTrace();  
                }  
                if (location == null)  
                    return null;  
                Log.d("debug", location.toString());  
                return location.toString();  
 
            }  
 
            @Override
            protected void onPreExecute() {  
                dialog.show();  
                super.onPreExecute();  
            }  
 
            @Override
            protected void onPostExecute(String result) {  
                if (result == null) {  
                    textView.setText("定位失败了...");  
                } else {  
                    textView.setText(result);  
                }  
                dialog.dismiss();  
                super.onPostExecute(result);  
            }  
 
        }.execute();  
    }  
 
}  

2.

package com.example.gpsdemo.util;  
 
import java.io.BufferedReader;  
import java.io.InputStreamReader;  
 
import org.apache.http.HttpEntity;  
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.JSONArray;  
import org.json.JSONObject;  
 
import android.content.Context;  
import android.database.Cursor;  
import android.net.ConnectivityManager;  
import android.net.NetworkInfo.State;  
import android.net.Uri;  
import android.net.wifi.WifiManager;  
import android.telephony.TelephonyManager;  
import android.telephony.gsm.GsmCellLocation;  
import android.util.Log;  
 
/**
 * ******************************************
 * 描述::GPS信息获取
 * @version 2.0
 ******************************************** 
 */
public class GPSLocation {  
    private static int postType = -1;  
    public static final int DO_3G = 0;  
    public static final int DO_WIFI = 1;  
    public static final int NO_CONNECTION = 2;  
 
    /**
     * 网络方式检查
     */
    private static int netCheck(Context context) {  
        ConnectivityManager conMan = (ConnectivityManager) context  
                .getSystemService(Context.CONNECTIVITY_SERVICE);  
        State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)  
                .getState();  
        State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI)  
                .getState();  
        if (wifi.equals(State.CONNECTED)) {  
            return DO_WIFI;  
        } else if (mobile.equals(State.CONNECTED)) {  
            return DO_3G;  
        } else {  
            return NO_CONNECTION;  
        }  
    }  
 
    /**
     * 获取WifiManager获取信息
     */
    private static JSONObject getInfoByWifiManager(Context context)  
            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);  
 
        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;  
    }  
 
    /**
     * 获取TelephoneManager获取信息
     */
    private static JSONObject getInfoByTelephoneManager(Context context)  
            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);  
        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;  
    }  
 
    /**
     * 通过wifi获取GPS信息
     */
    private static HttpResponse connectionForGPS(Context context)  
            throws Exception {  
        HttpResponse httpResponse = null;  
        postType = netCheck(context);  
        if (postType == NO_CONNECTION) {  
            return null;  
        } else {  
            if (postType == DO_WIFI) {  
                if ((httpResponse = doOrdinary(context,  
                        getInfoByWifiManager(context))) != null) {  
                    return httpResponse;  
                } else if ((httpResponse = doAPN(context,  
                        getInfoByWifiManager(context))) != null) {  
                    return httpResponse;  
                } else if ((httpResponse = doOrdinary(context,  
                        getInfoByTelephoneManager(context))) != null) {  
                    return httpResponse;  
                } else if ((httpResponse = doAPN(context,  
                        getInfoByTelephoneManager(context))) != null) {  
                    return httpResponse;  
                }  
            }  
            if (postType == DO_3G) {  
                if ((httpResponse = doOrdinary(context,  
                        getInfoByTelephoneManager(context))) != null) {  
                    return httpResponse;  
                } else if ((httpResponse = doAPN(context,  
                        getInfoByTelephoneManager(context))) != null) {  
                    return httpResponse;  
                }  
            }  
            return null;  
        }  
    }  
 
    /**
     * 通过普通方式定位
     */
    private static HttpResponse doOrdinary(Context context, JSONObject holder) {  
        HttpResponse response = null;  
        try {  
            HttpClient httpClient = new DefaultHttpClient();  
            HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),  
                    20 * 1000);  
            HttpConnectionParams  
                    .setSoTimeout(httpClient.getParams(), 20 * 1000);  
            HttpPost post = new HttpPost("http://74.125.71.147/loc/json");  
            StringEntity se = new StringEntity(holder.toString());  
            post.setEntity(se);  
            response = httpClient.execute(post);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
        return response;  
    }  
 
    /**
     * 通过基站定位
     */
    private static HttpResponse doAPN(Context context, JSONObject holder) {  
        HttpResponse response = null;  
        try {  
            HttpClient httpClient = new DefaultHttpClient();  
            HttpConnectionParams.setConnectionTimeout(httpClient.getParams(),  
                    20 * 1000);  
            HttpConnectionParams  
                    .setSoTimeout(httpClient.getParams(), 20 * 1000);  
            HttpPost post = new HttpPost("http://74.125.71.147/loc/json");  
            // 设置代理
            Uri uri = Uri.parse("content://telephony/carriers/preferapn"); // 获取当前正在使用的APN接入点  
            Cursor mCursor = context.getContentResolver().query(uri, null,  
                    null, null, null);  
            if (mCursor != null) {  
                if (mCursor.moveToFirst()) {  
                    String proxyStr = mCursor.getString(mCursor  
                            .getColumnIndex("proxy"));  
                    if (proxyStr != null && proxyStr.trim().length() > 0) {  
                        HttpHost proxy = new HttpHost(proxyStr, 80);  
                        httpClient.getParams().setParameter(  
                                ConnRouteParams.DEFAULT_PROXY, proxy);  
                    }  
                }  
            }  
            StringEntity se = new StringEntity(holder.toString());  
            post.setEntity(se);  
            response = httpClient.execute(post);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
        return response;  
    }  
 
    /**
     * GPS信息解析
     */
    public static LMLocation getGPSInfo(Context context) throws Exception {  
        HttpResponse response = connectionForGPS(context);  
        if (response == null) {  
            Log.d("GPSLocation", "response == null");  
            return null;  
        }  
        LMLocation location = null;  
        if (response.getStatusLine().getStatusCode() == 200) {  
            location = new LMLocation();  
            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.setAccess_token(json.getString("access_token"));  
                if (lca != null) {  
                    if (lca.has("accuracy"))  
                        location.setAccuracy(lca.getString("accuracy"));  
                    if (lca.has("longitude"))  
                        location.setLatitude(lca.getDouble("longitude"));  
                    if (lca.has("latitude"))  
                        location.setLongitude(lca.getDouble("latitude"));  
                    if (lca.has("address")) {  
                        JSONObject address = lca.getJSONObject("address");  
                        if (address != null) {  
                            if (address.has("region"))  
                                location.setRegion(address.getString("region"));  
                            if (address.has("street_number"))  
                                location.setStreet_number(address  
                                        .getString("street_number"));  
                            if (address.has("country_code"))  
                                location.setCountry_code(address  
                                        .getString("country_code"));  
                            if (address.has("street"))  
                                location.setStreet(address.getString("street"));  
                            if (address.has("city"))  
                                location.setCity(address.getString("city"));  
                            if (address.has("country"))  
                                location.setCountry(address  
                                        .getString("country"));  
                        }  
                    }  
                }  
            } catch (Exception e) {  
                e.printStackTrace();  
                location = null;  
            }  
        }  
        return location;  
    }  
 
}  
)







相关文章
|
1天前
|
持续交付 Android开发 开发者
构建高性能微服务架构:后端开发的终极指南构建高效Android应用:Kotlin与Jetpack的完美结合
【5月更文挑战第28天】 在现代软件开发的浪潮中,微服务架构已经成为了设计灵活、可扩展且易于维护系统的重要模式。本文将深入探讨如何构建一个高性能的微服务架构,涵盖从基础概念理解到实践策略部署的全过程。我们将讨论关键的设计原则、技术选型、性能优化技巧以及安全性考虑,旨在为后端开发者提供一个全面的指南,帮助他们构建出能够适应快速变化的市场需求和技术挑战的系统。 【5月更文挑战第28天】 在移动开发的世界中,效率和性能是衡量一个应用成功与否的关键因素。本文将深入探讨如何通过结合Kotlin语言和Android Jetpack组件,来构建一个既高效又易维护的Android应用。我们将透过实际案例分析
|
2天前
|
Java Android开发 Swift
揭秘安卓与iOS开发的核心差异
本文深入探讨了安卓与iOS这两大移动操作系统在应用开发过程中的关键不同点。我们将从编程语言、用户界面设计、应用市场政策、硬件集成以及开发者支持等多个维度展开比较,为开发者提供一个清晰的框架,帮助他们根据项目需求和目标受众选择最合适的平台。
|
3天前
|
Android开发 开发者 UED
安卓应用开发中的性能优化技巧
在当今移动应用市场竞争激烈的环境中,用户对于应用性能的需求日益增加。因此,在安卓应用开发过程中,如何实现高效的性能优化成为开发者需要关注的重要问题。本文将探讨安卓应用开发中的性能优化技巧,包括减少内存占用、优化界面渲染、提升响应速度等方面的方法,帮助开发者更好地提升应用的用户体验。
9 0
|
3天前
|
存储 人工智能 安全
移动应用与系统:探索开发与操作系统的融合安卓应用开发:打造高效用户界面的关键技术
【5月更文挑战第27天】 随着移动互联网的飞速发展,移动应用和操作系统已经成为了我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发的关键要素,以及移动操作系统的核心功能。我们将分析移动应用开发的挑战和机遇,并讨论移动操作系统如何适应不断变化的技术环境。通过深入研究这些主题,我们希望为读者提供对移动应用和系统领域的全面理解。
|
3天前
|
缓存 安全 物联网
构建未来:基于Android的智能家居控制系统开发
【5月更文挑战第27天】 随着物联网技术的蓬勃发展,智能家居系统作为其重要分支,正逐步渗透到人们的日常生活中。本文旨在探讨并实现一个基于Android平台的智能家居控制系统,通过分析系统需求、设计架构以及具体实现过程,展现如何利用现代移动开发技术与物联网设备进行有效集成,以提升居住环境的智能化水平。文中不仅详细阐述了系统的设计理念和功能模块,还对关键技术如设备通信协议、用户界面设计和后台服务管理进行了深入讨论。
|
3天前
|
编解码 缓存 数据处理
安卓应用开发中的内存优化策略
【5月更文挑战第27天】在移动应用开发领域,尤其是安卓平台,内存管理是影响应用性能和用户体验的关键因素。本文将深入探讨针对安卓应用的内存泄漏问题,并提出一系列实用的优化策略,包括合理使用数据结构、优化图片资源、减少冗余对象以及利用系统提供的内存管理工具等。通过这些策略的实施,开发者可以有效降低应用的内存消耗,提升应用的响应速度和稳定性。
|
3天前
|
测试技术 开发工具 Android开发
安卓应用开发:打造高效用户界面的关键步骤
【5月更文挑战第27天】本文将探讨在安卓应用开发中如何通过关键步骤打造高效且用户友好的界面。我们将分析UI设计的基本原则,探究Material Design指南,并讨论如何利用Android Studio中的设计工具来优化布局和提高性能。此外,文章还将涉及如何进行有效的测试以确保应用界面既美观又实用。
|
4天前
|
数据处理 API Android开发
安卓应用开发:构建一个高效的通知管理系统
【5月更文挑战第25天】在移动操作系统中,通知管理是用户体验的核心组成部分。特别是对于安卓设备,由于其开放性和多样性,有效的通知管理系统显得尤为重要。本文将详细介绍如何在安卓平台上构建一个高效、用户友好的通知管理系统。我们将从通知渠道的管理、用户自定义设置以及后台数据处理等方面展开讨论,并提供实用的代码示例和最佳实践建议。
|
6天前
|
缓存 监控 Java
安卓应用开发中的内存优化策略
【5月更文挑战第24天】 在移动设备上,资源的有限性要求开发者对应用程序进行细致入微的性能优化。特别是对于安卓平台,由于设备的多样性和碎片化问题,内存管理成为提升应用性能、用户体验和电池寿命的关键因素。本文将探讨针对安卓开发的内存优化技巧,从避免内存溢出、减少内存占用到提高内存回收效率等方面展开讨论,旨在为开发者提供实用的内存优化策略,以改善应用的运行效率和稳定性。
|
10天前
|
搜索推荐 API Android开发
安卓应用开发:打造高效通知管理系统
【5月更文挑战第20天】在移动设备中,通知管理是用户体验的关键部分。一个高效的通知系统不仅能够及时传达重要信息,还能避免用户感到不必要的干扰。本文将深入探讨如何在安卓平台上开发一个高效的通知管理系统,包括通知的设计、发送策略以及用户的个性化设置。通过分析安卓系统的通知机制和最新的API特性,我们将提供一个实用的开发指南,帮助开发者创建更加智能和用户友好的通知体验。