- 浏览: 74878 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
u010024805:
很感谢你的分享!
viewPager实现动态加载图片,附带大图片处理方式 -
java小编:
http://www.pm-road.com/index.ph ...
Android实现指定区域截屏的实现 -
java小编:
http://www.pm-road.com/index.ph ...
Android实现指定区域截屏的实现 -
wylleo半个光头:
Android中获取当前位置的三种方式 -
ayu0624:
这个好用。。。。。。。。。
Android实现指定区域截屏的实现
1.GPS定位
在实现GPS定位前,先了解一下GPS的部分特性:
1. GPS定位需要依靠3颗或3颗以上的卫星。
2. GPS定位受环境影响较大,在晴朗的空地上,较容易搜索到卫星,而在室内通常是无法搜索到卫星的。
3. GPS定位需要使用GPS功能模块,而GPS功能模块的耗电量是巨大的。
在Android系统中,实现GPS定位的思路应该是:
1. 获取GPS的Location Provider。
2. 讲此Provider传入到requestLocationUpdates()方法,让Android系统获知搜索位置方式。
3. 创建实现了GpsStatus.Listener接口的对象,重写onGpsStatusChanged()方法,向LocationManager添加次监听器,检测卫星状态。(可选步骤)
根据以上思路,仿照Android定位功能(一)中的例子,可以很容易的得到以下实现代码:
public class MainActivity extends Activity { private LocationManager locationManager; private GpsStatus gpsstatus; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //获取到LocationManager对象 locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); //根据设置的Criteria对象,获取最符合此标准的provider对象 String currentProvider = locationManager.getProvider(LocationManager.GPS_PROVIDER).getName(); //根据当前provider对象获取最后一次位置信息 Location currentLocation = locationManager.getLastKnownLocation(currentProvider); //如果位置信息为null,则请求更新位置信息 if(currentLocation == null){ locationManager.requestLocationUpdates(currentProvider, 0, 0, locationListener); } //增加GPS状态监听器 locationManager.addGpsStatusListener(gpsListener); //直到获得最后一次位置信息为止,如果未获得最后一次位置信息,则显示默认经纬度 //每隔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状态发生变化时触发 @Override public void onGpsStatusChanged(int event) { //获取当前状态 gpsstatus=locationManager.getGpsStatus(null); switch(event){ //第一次定位时的事件 case GpsStatus.GPS_EVENT_FIRST_FIX: break; //开始定位的事件 case GpsStatus.GPS_EVENT_STARTED: break; //发送GPS卫星状态事件 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; } } }; //创建位置监听器 private LocationListener locationListener = new LocationListener(){ //位置发生改变时调用 @Override public void onLocationChanged(Location location) { Log.d("Location", "onLocationChanged"); } //provider失效时调用 @Override public void onProviderDisabled(String provider) { Log.d("Location", "onProviderDisabled"); } //provider启用时调用 @Override public void onProviderEnabled(String provider) { Log.d("Location", "onProviderEnabled"); } //状态改变时调用 @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d("Location", "onStatusChanged"); } }; }
2.基站定位
此类位置的获取有赖于手机无线通讯信号,当手机处在信号覆盖范围内,手机可以获得该区域(即通讯术语中的“小区”)的识别号。因为这些识别号是惟一的,因此可以将识别号和地理坐标对应起来,因此根据识别号就可以知道地理位置。但是误差比较大。
MCC(Mobile Country Code)、MNC(Mobile Network Code)、LAC(Location Aera Code)、CID(Cell Tower ID)是通讯业内的名词。MCC标识国家,MNC标识网络,两者组合起来则唯一标识一家通讯运营商。从维基百科上了解到,一个国家的MCC不唯一,例如中国有460和461,一家运营商也不只一个MNC,例如中国移动有00、02、07。LAC标识区域,类似于行政区域,运营商将大区域划分成若干小区域,每个区域分配一个LAC。CID标识基站,若手机处在工作状态,则必须要和一个通讯基站进行通讯,通过CID就可以确定手机所在的地理范围。
在Android当中,大部分和通讯网络相关的信息都需要经过一项系统服务,即TelephoneManager来获得。
/** * Google定位的实现.<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()); } }
3.网络定位(wife定位)
其原理是首先收集每个WIFI无线接入点的位置,对每个无线路由器进行唯一的标识,在数据库中注明这些接入点的具体位置。 使用时,一旦发现有WI-FI接入点,则进入到数据中查看匹配的记录,进而得到位置信息。
WIFI定位主要取决于节点(node)的物理地址(mac address)。与提供TelephoneManager一样,Android也提供了获取WIFI信息的接口:WifiManager。
public class WiFiInfoManager implements Serializable { private static final long serialVersionUID = -4582739827003032383L; private Context context; public WiFiInfoManager(Context context) { super(); this.context = context; } public WifiInfo getWifiInfo() { WifiManager manager = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); WifiInfo info = new WifiInfo(); info.mac = manager.getConnectionInfo().getBSSID(); Log.i("TAG", "WIFI MAC is:" + info.mac); return info; } public class WifiInfo { public String mac; public WifiInfo() { super(); } } } //上面是取到WIFI的mac地址的方法,下面是把地址发送给google服务器,代码如下: public static Location getWIFILocation(WifiInfo wifi) { if (wifi == null) { Log.i("TAG", "wifi is null."); return null; } DefaultHttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost("http://www.google.com/loc/json"); JSONObject holder = new JSONObject(); try { holder.put("version", "1.1.0"); holder.put("host", "maps.google.com"); JSONObject data; JSONArray array = new JSONArray(); if (wifi.mac != null && wifi.mac.trim().length() > 0) { data = new JSONObject(); data.put("mac_address", wifi.mac); data.put("signal_strength", 8); data.put("age", 0); array.put(data); } holder.put("wifi_towers", array); Log.i("TAG", "request json:" + holder.toString()); StringEntity se = new StringEntity(holder.toString()); post.setEntity(se); HttpResponse resp = client.execute(post); int state = resp.getStatusLine().getStatusCode(); if (state == HttpStatus.SC_OK) { HttpEntity entity = resp.getEntity(); if (entity != null) { BufferedReader br = new BufferedReader( new InputStreamReader(entity.getContent())); StringBuffer sb = new StringBuffer(); String resute = ""; while ((resute = br.readLine()) != null) { sb.append(resute); } br.close(); Log.i("TAG", "response json:" + sb.toString()); data = new JSONObject(sb.toString()); data = (JSONObject) data.get("location"); Location loc = new Location( android.location.LocationManager.NETWORK_PROVIDER); loc.setLatitude((Double) data.get("latitude")); loc.setLongitude((Double) data.get("longitude")); loc.setAccuracy(Float.parseFloat(data.get("accuracy") .toString())); loc.setTime(System.currentTimeMillis()); return loc; } else { return null; } } else { Log.v("TAG", state + ""); return null; } } catch (Exception e) { Log.e("TAG", e.getMessage()); return null; } }
发表评论
-
当Activity被一个透明的Activity覆盖不执行onstop()方法
2015-02-04 18:27 4391当 Activity 被另外一个 Activity 覆盖、失 ... -
当Activity被一个透明的Activity覆盖不执行onstop()方法
2015-02-04 18:21 0一般的当Activity 被另一个Activity覆盖失去焦点 ... -
自定义seekbar,数值随Thumb移动显示
2013-06-03 16:13 2253主要思路是自定义一个SeekBar,然后上面的跟随窗口是用p ... -
类似360的桌面小图标
2013-05-30 13:58 1007其实这个实现很简单!就是在WindowManager中添加一 ... -
viewPager实现动态加载图片,附带大图片处理方式
2013-04-25 13:19 11239viewPager实现动态加载图片,并且附带大图片的处理。 ... -
九种Android报错及快速解决方法
2013-04-16 14:45 13061. 如果你的项目的R文件不见的话,可以试下改版本号在保存 ... -
Android4.0系统接收不到广播的问题解析
2012-09-14 10:54 6712在3.1之后,系统的package manager增加了对处于 ... -
Android数据库更新并保留原来数据的实现
2012-06-29 13:32 11919Android应用程序更新的时候如果数据库修改了字段需要更新数 ... -
自定义解锁滑动按钮
2012-06-10 17:17 1712实现滑动解锁按 ... -
Android中父View和子view的点击事件
2012-06-06 21:30 9598android中的事件类型 ... -
Android中自定义对话框的实现
2012-05-23 17:56 1303public class MainActivity ex ... -
Android实现文件的上传下载
2012-05-23 17:54 1112Android实现多线程下载,并且解压文件展示到界面。 实现 ... -
Android自定义menu的实现
2012-05-23 17:43 1499public class MainAcvtivity e ... -
Android中json解析
2012-05-23 17:41 1288/** * 访问网络 * @p ... -
Android实现指定区域截屏的实现
2012-03-08 15:43 13763其实实现方式很简单,首先我们需要做的就是截取整个屏幕生成一个b ...
相关推荐
在Android开发中,获取设备的当前位置以及地区名称是...以上就是Android获取当前位置及地区名称的完整实现过程中的关键知识点。在实际开发中,要根据应用的特性和用户需求,合理选择定位策略,同时关注性能和用户体验。
在Android开发中,获取当前地理位置是一项常见的任务,通常我们依赖于GPS来实现精确的位置服务。在本文中,我们将深入探讨如何正确使用Android的GPS功能来获取地理位置,以及避免一些常见问题。 首先,避免使用`...
实现通过GPS或NetWork获取当前位置的经纬度,并且在Google Map Android v2上显示
以上就是Android获取当前桌面壁纸的基本步骤。如果你想要实现更复杂的功能,比如监听壁纸更改,可以注册BroadcastReceiver来监听ACTION_WALLPAPER_CHANGED广播。同时,你还可以利用Intent.ACTION_SET_WALLPAPER为...
android加载高德地图,定位当前位置,根据点击不同点获取不同地理位置名称 android加载高德地图,定位当前位置,根据点击不同点获取不同地理位置名称 android加载高德地图,定位当前位置,根据点击不同点获取不同...
在Android平台上,获取设备的当前位置是一项常见的任务,这对于开发各种基于位置的应用程序至关重要。这篇描述提到了一个Android Demo,它展示了如何通过GPS和网络定位服务来获取设备的位置信息。下面我们将详细探讨...
这就是在Android中获取当前经纬度和地理位置的基本步骤。通过结合Location API和Geocoder,我们不仅可以获得设备的精确位置,还能获取到与该位置相关的详细地址信息。这个过程对于实现导航、定位、位置跟踪等功能至...
在项目“高德地图获取当前位置”的源代码中,`MyMapDemo`可能是主程序文件,包含了上述三种方式的实现。开发者可以通过查看和学习这个示例,更好地理解如何在自己的Android应用中集成高德地图SDK,实现获取当前位置...
在Android开发中,获取设备当前的经纬度...以上就是Android获取当前经纬度的基本步骤和相关知识点。在实际应用中,你可能还需要考虑到用户权限管理、位置更新频率的优化以及异常处理等细节问题,以提供更好的用户体验。
在Android开发中,获取当前网速质量和调整网络请求是至关重要的任务,这直接影响到应用程序的用户体验和性能。本文将深入探讨这两个主题,并提供相应的实践方法。 首先,我们要了解如何在Android系统中检测网络速度...
在Android开发中,获取当前位置是常见的功能需求,尤其在构建导航、地图应用或者地理位置相关服务时。本节将深入探讨如何在Android系统中利用网络定位技术获取设备的经纬度坐标,并将其显示在地图上,同时结合重力...
在Android中,我们使用`LocationManager`类来管理位置服务,并通过`Criteria`对象来定义我们的定位需求。以下是一个简单的示例代码,展示如何根据条件自动选择最优的定位方式: ```java import android.app....
这个"Android高级应用源码-android获取当前经纬度.zip"的压缩包很可能包含了一个示例项目,用于演示如何在Android应用程序中实现这一功能。让我们详细探讨一下这个过程涉及的关键知识点。 1. **权限声明**: 在...
android 获取当前位置的经度纬度 室内 室外 均可获得数据 用 GPS_PROVIDER 和NETWORK_PROVIDER 依次访问地址
总的来说,Android中获取当前时间日期的方式多样,可以根据项目需求和API支持选择合适的方法。无论是传统的`java.util.Date`,还是现代化的`java.time`API,都可以轻松地获取并格式化时、分、秒等时间信息。
下面就给大家介绍下Android中ViewPager获取当前显示的Fragment的方法,一起看看吧。 一、使用 getSupportFragmentManager().findFragmentByTag()方法 Viewpager + FragmentPagerAdapter 情况下 才好使; ...
要获取当前Activity的类名,我们可以通过以下几种方式: 1. **通过Activity实例**: 在Activity的代码内部,我们可以直接通过`this`关键字获取当前Activity的引用,然后调用`getClass().getName()`方法来获取类名...
以上就是Android应用获取当前地理位置经纬度坐标的完整过程。这个功能在地图应用、导航系统、天气预报等场景中非常有用。需要注意的是,定位服务可能需要网络和GPS硬件支持,且可能会消耗电池,因此在实际使用中需要...
在Android开发中,获取...这个简单的实例展示了如何在Android Studio中获取当前经纬度的基本步骤。通过学习和实践,你可以进一步扩展这个功能,实现更多与地理位置相关的应用特性,比如导航、地图标记、地理围栏等。
5. **获取当前位置**:在LocationListener的`onLocationChanged()`方法中,你可以获取到Location对象,它包含了经纬度信息: ```java double latitude = location.getLatitude(); // 经度 double longitude = ...