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;
    }  

}
)
时间: 2024-12-08 15:56:44

Android开发获取GPS位置,包含apn\wifi\gps 几种方法的相关文章

UWP Windows10开发获取设备位置(经纬度)

原文:UWP Windows10开发获取设备位置(经纬度) 1.首先要在UWP项目的Package.appxmanifest文件中配置位置权限,如下图所示: 2.Package.appxmanifest后选择第三个选项卡,勾选位置权限(Location) 打开 3.然后创建一个LocationManage类,包括以下代码: public async static Task<Geoposition> GetPosition() { //请求对位置的访问权 var accessStatus = a

Android开发获取短信的内容并截取短信_Android

1.首先我们要写一个广播接收器,当我们的手机收到短信时,系统会自动发送一个广播,我们只需要接收到这条广播就可以了 2.在广播里面,我们重写的onReceive()方法,通过里面的Intent写到的Bundle就可以拿到短信的内容, 3.清单文件里面我们必须要添加权限,否则无法接收到. 4.为了防止我们的广播接收不到,我们自己写的广播接收器的权限必须要大,以防万一,我设置了1000. 下面上代码,里面的注释也比较详细.. <?xml version="." encoding=&qu

小米-Android 开发有遇到过在后台 WIFI 返回 getDetailedState BLOCKED

问题描述 Android 开发有遇到过在后台 WIFI 返回 getDetailedState BLOCKED NetworkInfo wifi = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); wifi.getDetailedState(); 在某些小米手机上,程序在**后台**的时候返回的状态为 BLOCKED,其它手机均没有出现这个状态 谢谢

Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】

本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import an

Android开发获取重力加速度和磁场强度的方法

本文实例讲述了Android开发获取重力加速度和磁场强度的方法.分享给大家供大家参考,具体如下: Android获取重力加速度和磁场强度主要依靠: Sensor.getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) 输入数据: gravity为重力传感器测得的重力加速度float[3]: geomagnetic为罗盘传感器测得的地磁数据float[3]: 输出数据: R为通过这个方法计算得到的

Android开发之电话拨号器和短信发送器实现方法_Android

本文实例讲述了Android开发之电话拨号器和短信发送器实现方法.分享给大家供大家参考,具体如下: 电话拨号器 实现原理:用户输入电话号码,当点击拨打的时候,由监听对象捕获,监听对象通过文本控件获取到用户输入的电话号码,由于系统已经实现了电话拨号功能,所以我们只需要调用这个功能就可以了. 步骤: 1.界面布局 2.编写Activity 3.使用意图过滤器激活电话拨号功能 4.添加电话服务权限(用手机的电话服务,要在清单文件AndroidManifest.xml中添加电话服务权限) 如图所示这三个

Android手机获取root权限并实现关机重启功能的方法

本文实例讲述了Android手机获取root权限并实现关机重启功能的方法,是Android程序设计中非常常见的重要功能.现分享给大家,供大家在Android程序开发中参考之用. 具体功能代码如下: /* * 执行命令 * @param command * 1.获取root权限 "chmod 777 "+getPackageCodePath() * 2.关机 reboot -p * 3.重启 reboot */ public static boolean execCmd(String c

Android开发之瀑布流控件的实现与使用方法示例

本文实例讲述了Android开发之瀑布流控件的实现与使用方法.分享给大家供大家参考,具体如下: public class FlowLayout extends ViewGroup { /**行里子view之间的行距离*/ public int mHorizontolSpace = Util.getDimen(R.dimen.top_padding); /**行里子view之间的垂直距离*/ public int mVerticalSpace = Util.getDimen(R.dimen.top

android编程获取和设置系统铃声和音量大小的方法

本文实例讲述了android编程获取和设置系统铃声和音量大小的方法.分享给大家供大家参考,具体如下: 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法: public voidsetStreamVolume(intstreamType,intindex,intflags) 其中streamType有内置的常量,去文档里面就可以看到. JAVA代码: AudioManager mAudioManager