日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 三种定位方式

發(fā)布時間:2024/3/12 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 三种定位方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在看android關(guān)于定位的方式,查了很多資料,也做了相關(guān)實驗,在手機上做了測試,下面總結(jié):

一共有三種定位方式,一種是GPS,一種是通過網(wǎng)絡(luò)的方式,一種則是在基于基站的方式,但是,不管哪種方式,都需要開啟網(wǎng)絡(luò)或者GPS

?

首先添加權(quán)限

?

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

在COARSE_LOCATION是用于基站定位的時候用的,沒有這個權(quán)限,在獲取getCellLocation的時候報錯。

?

第一種方式通過JASON來實現(xiàn),是通過基站方式的,引用文章地址:http://www.cnblogs.com/dartagnan/archive/2011/3/9.html,下載只是實現(xiàn)定位的代碼

?

/** * Google定位的實現(xiàn).<br/> * Geolocation的詳細信息請參見:<br/> * <a * href="http://code.google.com/apis/gears/geolocation_network_protocol.html" mce_href="http://code.google.com/apis/gears/geolocation_network_protocol.html"> * http://code.google.com/apis/gears/geolocation_network_protocol.html</a> */ public class LocationAct extends Activity { private TextView txtInfo; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btn = (Button) findViewById(R.id.btnStart); txtInfo = (TextView) findViewById(R.id.txtInfo); btn.setOnClickListener(new Button.OnClickListener() { public void onClick(View view) { getLocation(); } }); } private void getLocation() { TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); GsmCellLocation gsmCell = (GsmCellLocation) tm.getCellLocation(); int cid = gsmCell.getCid(); int lac = gsmCell.getLac(); String netOperator = tm.getNetworkOperator(); int mcc = Integer.valueOf(netOperator.substring(0, 3)); int mnc = Integer.valueOf(netOperator.substring(3, 5)); JSONObject holder = new JSONObject(); JSONArray array = new JSONArray(); JSONObject data = new JSONObject(); try { holder.put("version", "1.1.0"); holder.put("host", "maps.google.com"); holder.put("address_language", "zh_CN"); holder.put("request_address", true); holder.put("radio_type", "gsm"); holder.put("carrier", "HTC"); data.put("cell_id", cid); data.put("location_area_code", lac); data.put("mobile_countyr_code", mcc); data.put("mobile_network_code", mnc); array.put(data); holder.put("cell_towers", array); } catch (JSONException e) { e.printStackTrace(); } DefaultHttpClient client = new DefaultHttpClient(); HttpPost httpPost = new HttpPost("http://www.google.com/loc/json"); StringEntity stringEntity = null; try { stringEntity = new StringEntity(holder.toString()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } httpPost.setEntity(stringEntity); HttpResponse httpResponse = null; try { httpResponse = client.execute(httpPost); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } HttpEntity httpEntity = httpResponse.getEntity(); InputStream is = null; try { is = httpEntity.getContent(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } InputStreamReader isr = new InputStreamReader(is); BufferedReader reader = new BufferedReader(isr); StringBuffer stringBuffer = new StringBuffer(); try { String result = ""; while ((result = reader.readLine()) != null) { stringBuffer.append(result); } } catch (IOException e) { e.printStackTrace(); } txtInfo.setText(stringBuffer.toString()); } }

第二種通過嚴(yán)格的GPS來定位,引用文章地址:http://www.cnblogs.com/wisekingokok/archive/2011/09/06/2168479.html,這里只引用代碼

?

public class MainActivity extends Activity {private LocationManager locationManager;private GpsStatus gpsstatus;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//獲取到LocationManager對象 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);//根據(jù)設(shè)置的Criteria對象,獲取最符合此標(biāo)準(zhǔn)的provider對象 String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName();//根據(jù)當(dāng)前provider對象獲取最后一次位置信息 Location currentLocation = locationManager.getLastKnownLocation(currentProvider);//如果位置信息為null,則請求更新位置信息 if(currentLocation == null){locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);}//增加GPS狀態(tài)監(jiān)聽器 locationManager.addGpsStatusListener(gpsListener);//直到獲得最后一次位置信息為止,如果未獲得最后一次位置信息,則顯示默認經(jīng)緯度//每隔10秒獲取一次位置信息 while(true){currentLocation = locationManager.getLastKnownLocation(currentProvider);if(currentLocation != null){Log.d("Location", "Latitude: " + currentLocation.getLatitude());Log.d("Location", "location: " + currentLocation.getLongitude());break;}else{Log.d("Location", "Latitude: " + 0);Log.d("Location", "location: " + 0);}try {Thread.sleep(10000);} catch (InterruptedException e) {Log.e("Location", e.getMessage());}}}private GpsStatus.Listener gpsListener = new GpsStatus.Listener(){//GPS狀態(tài)發(fā)生變化時觸發(fā) @Overridepublic void onGpsStatusChanged(int event) {//獲取當(dāng)前狀態(tài) gpsstatus=locationManager.getGpsStatus(null);switch(event){//第一次定位時的事件 case GpsStatus.GPS_EVENT_FIRST_FIX:break;//開始定位的事件 case GpsStatus.GPS_EVENT_STARTED:break;//發(fā)送GPS衛(wèi)星狀態(tài)事件 case GpsStatus.GPS_EVENT_SATELLITE_STATUS:Toast.makeText(MainActivity.this, "GPS_EVENT_SATELLITE_STATUS", Toast.LENGTH_SHORT).show();Iterable<GpsSatellite> allSatellites = gpsstatus.getSatellites(); Iterator<GpsSatellite> it=allSatellites.iterator(); int count = 0;while(it.hasNext()) { count++;}Toast.makeText(MainActivity.this, "Satellite Count:" + count, Toast.LENGTH_SHORT).show();break;//停止定位事件 case GpsStatus.GPS_EVENT_STOPPED:Log.d("Location", "GPS_EVENT_STOPPED");break;}}};//創(chuàng)建位置監(jiān)聽器 private LocationListener locationListener = new LocationListener(){//位置發(fā)生改變時調(diào)用 @Overridepublic void onLocationChanged(Location location) {Log.d("Location", "onLocationChanged");}//provider失效時調(diào)用 @Overridepublic void onProviderDisabled(String provider) {Log.d("Location", "onProviderDisabled");}//provider啟用時調(diào)用 @Overridepublic void onProviderEnabled(String provider) {Log.d("Location", "onProviderEnabled");}//狀態(tài)改變時調(diào)用 @Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Log.d("Location", "onStatusChanged");}};}

第三種主要是通過網(wǎng)絡(luò)的方式來定位,引用文章地址:http://www.cnblogs.com/wisekingokok/archive/2011/09/05/2167755.html,這里只寫代碼

?

package com.test;import java.io.IOException;import java.util.List;import android.app.Activity;import android.location.Address;import android.location.Criteria;import android.location.Geocoder;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.util.Log;import android.widget.Toast;public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//獲取到LocationManager對象 LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);//創(chuàng)建一個Criteria對象 Criteria criteria = new Criteria();//設(shè)置粗略精確度 criteria.setAccuracy(Criteria.ACCURACY_COARSE);//設(shè)置是否需要返回海拔信息 criteria.setAltitudeRequired(false);//設(shè)置是否需要返回方位信息 criteria.setBearingRequired(false);//設(shè)置是否允許付費服務(wù) criteria.setCostAllowed(true);//設(shè)置電量消耗等級 criteria.setPowerRequirement(Criteria.POWER_HIGH);//設(shè)置是否需要返回速度信息 criteria.setSpeedRequired(false);//根據(jù)設(shè)置的Criteria對象,獲取最符合此標(biāo)準(zhǔn)的provider對象 String currentProvider = locationManager.getBestProvider(criteria, true);Log.d("Location", "currentProvider: " + currentProvider);//根據(jù)當(dāng)前provider對象獲取最后一次位置信息 Location currentLocation = locationManager.getLastKnownLocation(currentProvider);//如果位置信息為null,則請求更新位置信息 if(currentLocation == null){locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener);}//直到獲得最后一次位置信息為止,如果未獲得最后一次位置信息,則顯示默認經(jīng)緯度//每隔10秒獲取一次位置信息 while(true){currentLocation = locationManager.getLastKnownLocation(currentProvider);if(currentLocation != null){Log.d("Location", "Latitude: " + currentLocation.getLatitude());Log.d("Location", "location: " + currentLocation.getLongitude());break;}else{Log.d("Location", "Latitude: " + 0);Log.d("Location", "location: " + 0);}try {Thread.sleep(10000);} catch (InterruptedException e) {Log.e("Location", e.getMessage());}}//解析地址并顯示 Geocoder geoCoder = new Geocoder(this);try {int latitude = (int) currentLocation.getLatitude();int longitude = (int) currentLocation.getLongitude();List<Address> list = geoCoder.getFromLocation(latitude, longitude, 2);for(int i=0; i<list.size(); i++){Address address = list.get(i); Toast.makeText(MainActivity.this, address.getCountryName() + address.getAdminArea() + address.getFeatureName(), Toast.LENGTH_LONG).show();}} catch (IOException e) {Toast.makeText(MainActivity.this,e.getMessage(), Toast.LENGTH_LONG).show();}}//創(chuàng)建位置監(jiān)聽器 private LocationListener locationListener = new LocationListener(){//位置發(fā)生改變時調(diào)用 @Overridepublic void onLocationChanged(Location location) {Log.d("Location", "onLocationChanged");Log.d("Location", "onLocationChanged Latitude" + location.getLatitude());Log.d("Location", "onLocationChanged location" + location.getLongitude());}//provider失效時調(diào)用 @Overridepublic void onProviderDisabled(String provider) {Log.d("Location", "onProviderDisabled");}//provider啟用時調(diào)用 @Overridepublic void onProviderEnabled(String provider) {Log.d("Location", "onProviderEnabled");}//狀態(tài)改變時調(diào)用 @Overridepublic void onStatusChanged(String provider, int status, Bundle extras) {Log.d("Location", "onStatusChanged");}};}


Nothing is impossible!^oudi&orange^

原文章地址:http://www.cnblogs.com/oudi/archive/2012/03/22/2411509.html

總結(jié)

以上是生活随笔為你收集整理的android 三种定位方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。