位置定位LocationManager

簡單的獲取當前位置對象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //提供位置定位服務的位置管理器對象,中樞控制系統(tǒng)
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //位置提供器啄糙,也就是實際上來定位的對象笛臣,這里選擇的是GPS定位
        String locationProvider = LocationManager.NETWORK_PROVIDER;
        //開始定位,獲取包含上次記錄的位置數(shù)據(jù)的位置對象
        Location location = locationManager.getLastKnownLocation(locationProvider);
        //獲取緯度
        Double latitude = location.getLatitude();
        //獲取經(jīng)度
        Double longitude = location.getLongitude();
        Log.e("Latitude", String.valueOf(latitude));
        Log.e("Longitude", String.valueOf(longitude));
    }

執(zhí)行時,會出現(xiàn)getLastKnownLocation獲取不到對象隧饼,拋出NullException沈堡。使用getProvider方法獲取手機上的位置提供器,可以看到高精度定位下燕雁,有三種位置提供器可供使用
其實從這個方法名可以知道他是獲取上次記錄下的位置信息踱蛀,如果是新設備,或者恢復工廠設置的手機贵白,就會報出異常率拒,這里用的模擬器還沒記錄過位置信息,所以一直報空異常

高精度定位

根據(jù) getLastKnownLocation()返回null的解決這個禁荒,發(fā)現(xiàn)可以使用requestLocationUpdates方法注冊位置更新

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //提供位置定位服務的位置管理器對象,中樞控制系統(tǒng)
        LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //位置提供器猬膨,也就是實際上來定位的對象,這里選擇的是GPS定位
        String locationProvider = LocationManager.PASSIVE_PROVIDER;
        //獲取手機中開啟的位置提供器
        List<String> providers = locationManager.getProviders(true);
        //開始定位,獲取當前位置對象
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }
        Location location = locationManager.getLastKnownLocation(locationProvider);
        while (location == null) {
            //每1s監(jiān)聽一次位置信息呛伴,如果位置距離改變超過1m勃痴。就執(zhí)行onLocationChanged方法
            //如果第一次打開沒有顯示位置信息,可以退出程序重新進入热康,就會顯示
            locationManager.requestLocationUpdates("gps", 1000,1,new locationListener());
        }
        //獲取緯度
        Double latitude = location.getLatitude();
        //獲取經(jīng)度
        Double longitude = location.getLongitude();
        Log.e("Latitude", String.valueOf(latitude));
        Log.e("Longitude", String.valueOf(longitude));
    }

locationListener.java位置監(jiān)聽器

可以理解為沛申,先開啟監(jiān)聽器監(jiān)聽位置信息,位置更改后記錄有了位置數(shù)據(jù)姐军,然后就可以使用getLastKnownLocation獲取上一次的位置數(shù)據(jù)铁材,所以


public class locationListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {
        Log.e("位置提供器:", "啟用");
    }

    @Override
    public void onProviderDisabled(String provider) {

    }
}

反向編碼經(jīng)緯度獲得可理解地理位置

1、注冊為高德地圖開放平臺的開發(fā)者
2奕锌、在控制臺添加新key著觉,選擇Web服務,獲取key惊暴,才可以使用高德地圖的api

AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

MainActivity.java
異步處理回調(diào)函數(shù)返回的相應地址數(shù)據(jù)饼丘,進行UI展示

public class MainActivity extends Activity {
    TextView textview;
    private Handler handler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1){
                textview = findViewById(R.id.textview0);
                textview.setText(msg.obj.toString());
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        httputils.requestHttp("116.310003", "39.991957", new callback2showcontent() {
            @Override
            public void showJSON(String response) {
                //這個方法還是在子線程中溜在,想要處理UI操作玷过,異步線程
                Message message = new Message();
                message.what = 1;
                message.obj = response;
                handler.sendMessage(message);
            }
        });
        Toast.makeText(this,"successful", Toast.LENGTH_LONG);
    }
}

httputils.java
封裝的http請求

public class httputils {
    private static URL url;
    public static void requestHttp(final String latitude, final String longitude, final callback2showcontent func){

        new Thread(new Runnable() {
            HttpResponse response;
            String returnResutJSON;
            @Override
            public void run() {
                StringBuilder stringbuilder = new StringBuilder("https://restapi.amap.com/v3/geocode/regeo?output=JSON&key=<你的web服務key>&radius=1000&extensions=all");
                stringbuilder.append("&location=" + latitude + "," + longitude);
                try {
                    url = new URL(stringbuilder.toString());
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                }
                HttpClient httpclient = new DefaultHttpClient();
                HttpGet get = new HttpGet(url.toString());
                try {
                    //http相應數(shù)據(jù)
                    response = httpclient.execute(get);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if(response.getStatusLine().getStatusCode() == 200){

                    try {
                        returnResutJSON = EntityUtils.toString(response.getEntity());
                        func.showJSON(returnResutJSON);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

使用高德地圖顯示位置

需要使用第三方平臺的API接口权纤,來返回具體位置警医,這里我使用的是高德地圖API
1、注冊為高德地圖開放平臺的開發(fā)者
2典徘、在控制臺創(chuàng)建應用,然后獲取API key(keytool -list -v -keystore <.keystore文件的路徑>)可見說明https://lbs.amap.com/faq/top/hot-questions/249
3屹逛、在android studio的編輯器的文件配置

https://lbs.amap.com/api/android-sdk/guide/create-project/android-studio-create-project

1、將jar包放入libs目錄淑掌,然后右鍵add as library
2抛腕、獲取密鑰担敌,默認密碼android
keytool -list -keystore C:\Users\xxxx\.android\debug.keystore -v
AndroidManifest.xml

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data
            android:name="com.amap.api.v2.apikey"
            android:value="<你的密鑰>"/>
......
    </application>
   <!--允許程序打開網(wǎng)絡套接字-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--允許程序設置內(nèi)置sd卡的寫權限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--允許程序獲取網(wǎng)絡狀態(tài)-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!--允許程序訪問WiFi網(wǎng)絡信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!--允許程序讀寫手機狀態(tài)和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--允許程序訪問CellID或WiFi熱點來獲取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

activity_layout.xml
地圖容器控件

    <com.amap.api.maps.MapView
        android:id="@+id/mapview"
        android:layout_height="match_parent"
        android:layout_width="match_parent"/>

MainActivity.java

    private MapView mapview = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //引用地圖控件
        mapview = (MapView)findViewById(R.id.mapview);
        //創(chuàng)建地圖
        mapview.onCreate(savedInstanceState);
    }
展示結果

定位自己所在位置

public class MainActivity extends Activity {

    private MapView mapview = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //引用地圖控件
        mapview = (MapView)findViewById(R.id.mapview);
        //創(chuàng)建地圖
        mapview.onCreate(savedInstanceState);
        //地圖管理器:顯示地圖
        AMap amap = mapview.getMap();
        /*
         顯示當前自己的位置
          */
        //初始化藍點對象
        MyLocationStyle mylocation = new MyLocationStyle();
        //定位時間間隔
        mylocation.interval(1000);
        //將配置好的藍點對象由管理器進行設置
        amap.setMyLocationStyle(mylocation);
        //設置默認定位按鈕
//        amap.getUiSettings().setMyLocationButtonEnabled(true);
        //啟動定位藍點
        amap.setMyLocationEnabled(true);
    }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市土匀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钓丰,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦鉴,死亡現(xiàn)場離奇詭異肥橙,居然都是意外死亡存筏,警方通過查閱死者的電腦和手機椭坚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門频轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來航邢,“玉大人膳殷,你說我怎么就攤上這事秽之】颊ィ” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我戚丸,道長限府,這世上最難降的妖魔是什么胁勺? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任寥裂,我火速辦了婚禮封恰,結果婚禮上俭驮,老公的妹妹穿的比我還像新娘混萝。我一直安慰自己,他們只是感情好崭倘,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布悉患。 她就那樣靜靜地躺著售躁,像睡著了一般陪捷。 火紅的嫁衣襯著肌膚如雪啡直。 梳的紋絲不亂的頭發(fā)上烹玉,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天掂榔,我揣著相機與錄音厉颤,去河邊找鬼。 笑死司抱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的照棋。 我是一名探鬼主播资溃,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烈炭!你這毒婦竟也來了溶锭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梳庆,失蹤者是張志新(化名)和其女友劉穎暖途,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膏执,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡驻售,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了更米。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欺栗。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迟几,到底是詐尸還是另有隱情消请,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布类腮,位于F島的核電站臊泰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚜枢。R本人自食惡果不足惜缸逃,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厂抽。 院中可真熱鬧需频,春花似錦、人聲如沸筷凤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藐守。三九已至挪丢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吗伤,已是汗流浹背吃靠。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留足淆,地道東北人巢块。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像巧号,于是被迫代替她去往敵國和親族奢。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 測試IE6及IE6+推薦:良心總結 IE8中input[button|submit]不能用margin:0 aut...
    Miss____Du閱讀 951評論 0 9
  • 上一篇 介紹了通過vue.js綁定class和style樣式丹鸿,這次我們一起學習vue.js中的條件渲染越走。 v-if...
    webCoder閱讀 2,000評論 0 1