首页> 搜索结果页
"android 获取网络速度" 检索
共 1058 条结果
Android图片三级缓存总结
Android图片中的三级缓存 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量 什么是三级缓存 网络加载,不优先加载,速度慢,浪费流量 本地缓存,次优先加载,速度快 内存缓存,优先加载,速度最快 三级缓存原理 首次加载 Android App 时,肯定要通过网络交互来获取图片,之后我们可以将图片保存至本地SD卡和内存中 之后运行 App 时,优先访问内存中的图片缓存,若内存中没有,则加载本地SD卡中的图片 总之,只在初次访问新内容时,才通过网络获取图片资源
文章
缓存  ·  Android开发
2018-08-18
安卓手机获取当前连接的WIFI相关信息
package com.lenovo.xiaoshan.test; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Bundle; import android.widget.TextView; /** * 获取手机WIFI的MAC地址 * @author 单红宇 * */ public class GetmacipinfoActivity extends Activity { /** Called when the activity is first created. */ private static final int REQUEST_ENABLE_BT = 3; private WifiManager mWifi; private BluetoothAdapter bAdapt; private String btMac; private String WifiMac; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); if (!mWifi.isWifiEnabled()) { mWifi.setWifiEnabled(true); } WifiInfo wifiInfo = mWifi.getConnectionInfo(); bAdapt = BluetoothAdapter.getDefaultAdapter(); if (bAdapt != null) { if (!bAdapt.isEnabled()) { Intent enBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enBT, REQUEST_ENABLE_BT); } btMac = bAdapt.getAddress(); } else { btMac = "No Bluetooth Device!"; } if ((WifiMac = wifiInfo.getMacAddress()) == null) { WifiMac = "No Wifi Device"; } TextView mac = (TextView) findViewById(R.id.macView); mac.setTextSize(16); // 查看已经连接上的WIFI信息,在Android的SDK中为我们提供了一个叫做WifiInfo的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。 // getBSSID() 获取BSSID属性 // getDetailedStateOf() 获取客户端的连通性 // getHiddenSSID() 获取SSID 是否被隐藏 // getIpAddress() 获取IP 地址 // getLinkSpeed() 获取连接的速度 // getMacAddress() 获取Mac 地址 // getRssi() 获取802.11n 网络的信号 // getSSID() 获取SSID // getSupplicanState() 获取具体客户端状态的信息 StringBuffer sb = new StringBuffer(); sb.append("\n获取BSSID属性(所连接的WIFI设备的MAC地址):" + wifiInfo.getBSSID()); // sb.append("getDetailedStateOf() 获取客户端的连通性:"); sb.append("\n\n获取SSID 是否被隐藏:"+ wifiInfo.getHiddenSSID()); sb.append("\n\n获取IP 地址:" + wifiInfo.getIpAddress()); sb.append("\n\n获取连接的速度:" + wifiInfo.getLinkSpeed()); sb.append("\n\n获取Mac 地址(手机本身网卡的MAC地址):" + WifiMac); sb.append("\n\n获取802.11n 网络的信号:" + wifiInfo.getRssi()); sb.append("\n\n获取SSID(所连接的WIFI的网络名称):" + wifiInfo.getSSID()); sb.append("\n\n获取具体客户端状态的信息:" + wifiInfo.getSupplicantState()); mac.setText("WIFI网络信息: " + sb.toString() + "\n\n蓝牙MAC: " + btMac); } }
文章
机器学习/深度学习  ·  Android开发  ·  开发工具
2012-04-10
位置服务与地图应用
位置服务与地图应用: 位置服务(Location Based Services,LBS)又称为服务或基于位置的服务。Andorid平台支持提供位置服务的API,在开发过程中主要用到LocationManager 和LocationProviders对象。   为开发能够提供位置服务,首先需要得到LocationManager对象,获取方法如下: String serviceString = Context.LOCATION_SERVICE; LocationManager  locationManager = (LocationManager)getSystemService(serviceString); 以上代码第二行函数,可以获取Android提供的系统级服务。第一行指明的是获取的服务是位置服务。   ANDROID支持的系统级服务如下: LOCATION_SERVICE:控件位置等服务 WINDOW_SERVICE:最顶层的窗口管理器 LAYOUT_INFLATER_SERVICE:将XML资源实例化为VIEW POWER_SERVICE:电源管理 ALARM_SERVICE:在指定时间接受INTENT NOTIFICATION_SERVICE:后台事件通知 KEYGUARD_SERVICE:锁定或解锁键盘 SEARCH_SERVICE:访问系统的搜索服务 VIBRATOR_SERVICE:访问支持振动的硬件 CONNECTIVITY_SERVICE:网络连接管理 WIFI_SERVICE:Wi-Fi连接管理 INPUT_METHOD_SERVICE:输入法管理   在获取到LocationManager后, 还需要指定LocationManager的定位方法,然后才能够调用 LocationManager.getLastKnowLocation()方法获取当前位置。目前LocationManager支持的定位方法有如下两种: 1.GPS定位:可提供更加精确的位置信息,但定位速度和质量受到卫星数量和环境情况的影响; 2.网络定位:提供的位置信息精度较差,但速度较GPS定位快,LocationManager支持定位方法如下表:   LocationManager                      说明 GPS_PROVIDER 使用GPS定位,利用卫星提供精确的位置信息,需要权限:android.permissions.ACCESS_FINE_LOCATION用户权限。   NETWORK_PROVIDER 使用网络定位,利用基站 或WIFI提供挖的位置信息,需要具有如下权限:android.permissions.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION     模拟HTTP请求 HTTP请求有两种方式:POST与GET方式 JAVA跟ANDROID中都用HttpURLConnection来解析使用HTTP请求,ANDROID中也是如此的。呵呵。。 POST方式提交:         访问网络数据时应该在全局文件中加个:可以访问INTERNET的权限哦,不然会报到 错的。     在ANDROID中也可以通过HTTPClient来模拟HTTP请求哦,使用更方便的。 HttpClient http = new DefaultHttpClient();………………………HttpClient是一个接口哦.                本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/733375,如需转载请自行联系原作者
文章
定位技术  ·  Android开发  ·  Java  ·  数据格式  ·  XML  ·  API  ·  搜索推荐
2017-11-14
《深入理解Android 5 源代码》——第2章,第2.1节获取并编译Android源代码
本节书摘来自异步社区《深入理解Android 5 源代码》一书中的第2章,第2.1节获取并编译Android源代码,作者 李骏,更多章节内容可以访问云栖社区“异步社区”公众号查看 第2章 获取并编译Android源代码深入理解Android 5 源代码在分析Android源代码之前,需要先获取Android系统的源代码,并在自己的机器上进行编译。在本章的内容中,将详细讲解获取并编译Android 5.0源代码的基本知识。另外,因为Android系统源代码的文件数量巨大,目录结构层次复杂,所以,将在本章对Android 5.0源代码的目录结构进行整体分析,并详细介绍从SDK中生成SDK的方法。 2.1 获取Android源代码要想研究Android系统的源代码,需要先获取源代码。目前市面中的主流操作系统是Windows、Linux和Mac OS。因为Mac OS属于类Linux系统,所以本书将讲解在Windows系统和Linux系统中获取Android源代码的知识。 2.1.1 在Linux系统中获取Android源代码北京时间,Google在https://android.googlesource.com/上正式公布了Android 5.0的源代码,如图2-1所示。 在Linux系统中,通常使用Ubuntu来下载和编译Android源代码。由于Android的源代码内容很多,Google采用了Git的版本控制工具,并对不同的模块设置不同的Git服务器,我们可以用repo自动化脚本来下载Android源代码。在Android官方站点source.android.com/source/ building.html中,提供了获取并编译Android源代码的具体过程,如图2-2所示。 在接下来的内容中,将详细讲解获取Android源代码的过程。 (1)下载repo 在用户目录下,创建bin文件夹,用于存放repo,并把该路径设置到环境变量中去,命令如下: $ mkdir ~/bin $ PATH=~/bin:$PATH 下载repo的脚本,用于执行repo,命令如下: $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo 设置可执行权限,命令如下: $ chmod a+x ~/bin/repo (2)初始化一个repo的客户端 在用户目录下,创建一个空目录,用于存放Android源代码,命令如下: $ mkdir AndroidCode $ cd AndroidCode 进入到AndroidCode目录,并运行repo下载源代码,下载主线分支的代码,主线分支包括最新修改的bug,以及并未正式发布的版本的最新源代码,命令如下: $ repo init -u https://android.googlesource.com/platform/manifest 下载其他分支正式发布的版本,可以通过添加-b参数来下载,命令如下: $ repo init -u https://android.googlesource.com/platform/manifest -b android-5.0_0_r1 例如可以使用如下命令来初始化最新的Android源代码: ./repo init -u https://android.googlesource.com/platform/manifest -b android-5.0_0_r1 在下载过程中会需要填写Name和E-mail,填写完毕之后,选择Y进行确认,最后提示repo初始化完成,这时可以开始同步Android源代码了,同步过程很漫长,需要耐心等待,执行下面命令开始同步代码: $ repo sync 经过上述步骤后,便开始下载并同步Android源代码了,笔者的界面效果如图2-3所示。 因为网络方面的原因,可能执行“./repo init-u https://android.googlesource.com/platform/manifest-bandroid-5.0_0_r1”初始化命令会失败,提示一些类似网络连接失败的信息,此时不用理会,只需继续执行这个命令。如果出现多次失败提示,则可以尝试使用如下方法来解决。 (1)使用如下命令删除Android 5.0文件中的缓存文件,然后重新执行初始化命令: rm -rf * -R (2)晚上、凌晨时下载,一般这个时候的网络环境容易下载Android源代码。 注意 (1)在源代码下载过程中,在源代码下载目录看不到任何文件,打开“显示/隐藏”,会看到一个名为“.repo”的文件夹,这个文件夹是用来保存Android源代码的“临时文件”。(2)当文件最后下载接近完成时,会从“.repo”文件夹中导出Android源代码。 (3)当Android 5.0源代码下载完成后,可以看到Android源代码下载目录中会有bionic、bootable、build、cts、dalvik等文件夹目录,这些就是Android的源代码。 (4)如果不得不关闭电脑停止下载,那么可以在源代码下载的终端中按下Ctrl + C组合键或者Ctrl + Z组合键停止源代码的下载,这样不会造成源代码的丢失或损坏。 2.1.2 在Windows平台获取Android源代码在Windows平台上获取Android源代码的方式和在Linux中获取原理相同,但是需要预先在Windows平台上面搭建一个Linux环境,此处需要用到cygwin工具。cygwin的作用是构建一套在Windows上的Linux模拟环境,下载cygwin工具的地址如下: http://cygwin.com/install.html下载成功后会得到一个名为“setup.exe”可执行文件,通过此文件可以更新和下载最新的工具版本,具体流程如下所示。 (1)启动cygwin,如图2-4所示。 (2)单击“下一步”按钮,选择第一个选项:从网络下载安装,如图2-5所示。 (3)单击“下一步”按钮,选择安装根目录,如图2-6所示。 (4)单击“下一步”按钮,设置网络代理。如果所在网络需要代理,则在这一步进行设置,如果不用代理,则选择直接下载,如图2-7所示。 (5)单击“下一步”按钮,选择下载站点。一般选择离我们比较近的站点,速度会比较快,如图2-8所示。 (6)单击“下一步”按钮,开始更新工具列表,如图2-9所示。 (7)单击“下一步”按钮,选择需要下载的工具包。在此需要依次下载curl、git、python这些工具,如图2-10所示。 为了确保能够安装上述工具,一定要用鼠标双击图2-10中的那些项使其变为Install形式,如图2-11所示。 (8)单击“下一步”按钮,经过漫长的等待过程,如图2-12所示。 如果下载安装成功会出现提示信息,单击“完成”按钮即完成安装。当安装好cygwin后,打开cygwin,会模拟出一个Linux的工作环境,然后按照Linux平台的源代码下载方法就可以下载Android源代码了。 建议读者在下载Android源代码时,严格按照官方提供的步骤进行,地址是:http://source. android.com/source/downloading.html,这一点对初学者来说尤为重要。另外,整个下载过程比较漫长,需要大家耐心等待。图2-13是下载Android源代码时的截图。
文章
Linux  ·  开发工具  ·  Android开发  ·  git  ·  Windows  ·  iOS开发  ·  MacOS  ·  Python  ·  Ubuntu  ·  缓存
2017-05-02
暗网
Tor 一款高度匿名代理工具 官网 www.torproject.org Tor 支持的系统平台:Android Windows linux MacOS网桥即 Tor 中继节点,用于帮助用户绕过审查或封锁。 1.获取下载地址 官网下载 下载 https://www.torproject.org/projects/torbrowser.html 发邮件获取下载地址 发任意内容到gettor+en@torproject.org可得到邮件 实测126邮箱无法收到邮件!gmail可以 Hi! This is the GetTor robot. I am here to help you download the latest version of Tor Browser. Please reply to this message with one of the options below: android windows linux osx mirrors I will then send you the download instructions. If you are unsure, just send a blank reply to this message. 回复邮件,内容: android windows linux osx mirrors 很快就会收到带有附件的邮件,内容中也有Dropbox/github/google driver的地址。 2.获取网桥 访问 https://bridges.torproject.org/bridges?transport=obfs2 获取obfs2网桥 访问 https://bridges.torproject.org/bridges?transport=obfs3 获取obfs3网桥 访问 https://bridges.torproject.org/bridges?transport=obfs4 获取obfs4网桥[推荐] 访问 https://bridges.torproject.org/bridges?transport=scramblesuit 获取scramblesuit网桥 也可以通过邮件 获取网桥: 给bridges@bridges.torproject.org发邮件 如 标题和正文都写 get transport obfs4可获取obfs4网桥 3.筛选高速网桥(可跳过) 获取网桥后根据以下地址测试速度,把速度高的网桥都配置到tor中https://atlas.torproject.org/#search/网桥的fingerprint(40位字母数字组合) 如https://atlas.torproject.org/#search/8ABB0F5D91E83C04BE557E2925EACE2073300519 4.添加网桥 “Tor 网络设置” 对话框出现时,点击“配置” ,根据向导操作,看到: 网络提供商(ISP)或其他人是否对 Tor 网络连接进行审查或封锁? “是”-“下一步”-将网桥地址行通过复制粘贴的方式输入到文本输入框-“连接” 是否使用本地代理? 国内用户一般选“是”。 如果使用的是可用的ss代理,在tor浏览器里配置代理sock5 127.0.0.1 1080 作者:极客圈 链接:https://www.jianshu.com/p/4c2d7e38bfcf 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
文章
Linux  ·  Android开发  ·  Windows
2018-03-08
Android开发之扫描附近wifi热点并列表显示
 最近项目中用到了wifi模块,今天做一个简单的总结。 参考:http://www.2cto.com/kf/201310/253617.html 1.怎样获取wifi对象并进行操作 要操作WIFI设备,需要先获取Context.getSystemService(Context.WIFI_SERVICE)来获取WifiManager对象,并通过这个对象来管理WIFI设备。   addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。 calculateSignalLevel(int rssi , int numLevels) 计算信号的等级 compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度 createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接 disableNetwork(int netId) 让一个网络连接失效 disconnect() 断开当前的WIFI连接 enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用 getConfiguredNetworks() 获取网络连接的状态 getConnectionInfo() 获取当前连接的信息 getDhcpInfo() 获取DHCP 的信息 getScanResulats() 获取扫描测试的结果 getWifiState() 获取当前WIFI设备的状态 isWifiEnabled() 判断WIFI设备是否打开 pingSupplicant() ping操作,和PC的ping操作相同作用 ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的 reconnect() 重新连接一个未连接上的WIFI网络 removeNetwork() 移除某一个网络 saveConfiguration() 保留一个配置信息 setWifiEnabled() 让一个连接有效 startScan() 开始扫描 updateNetwork(WifiConfiguration config) 更新一个网络连接 2.常用的wifi状态 WIFI_STATE_DISABLED WIFI网卡不可用  WIFI_STATE_DISABLING WIFI网卡正在关闭  WIFI_STATE_ENABLED WIFI网卡可用  WIFI_STATE_ENABLING WIFI网卡正在打开  WIFI_STATE_UNKNOWN WIFI网卡状态不可知 3.列表查看有连接信号的wifi热点 ScanResult对象就是用来表示附近wifi热点的属性的,可以通过WifiManager.getScanResults()返回一个ScanResult列表,后面我附上查看附近wifi热点的demo,ScanResult的重要属性有一下几个: BSSID 接入点的地址 SSID 网络的名字,唯一区别WIFI网络的名字 Capabilities 网络接入的性能 Frequency 当前WIFI设备附近热点的频率(MHz) Level 所发现的WIFI网络信号强度 4.连接wifi热点 通过WifiManager.getConfiguredNetworks()方法会返回WifiConfiguration对象的列表,然后再调用WifiManager.enableNetwork();方法就可以连接上指定的热点。 5.查看已经连接上的wifi信息 WifiInfo是专门用来表示连接的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。WifiInfo中包含了当前连接中的相关信息。   getBSSID() 获取BSSID属性 getDetailedStateOf() 获取客户端的连通性 getHiddenSSID() 获取SSID 是否被隐藏 getIpAddress() 获取IP 地址 getLinkSpeed() 获取连接的速度 getMacAddress() 获取Mac 地址 getRssi() 获取802.11n 网络的信号 getSSID() 获取SSID getSupplicanState() 获取具体客户端状态的信息 在wifi操作中常用的类和方法就这些,下面给出一个列表显示wifi热点的demo。   1.activity的布局很简单就是一个ListView,activity_wifi_list.xml内容如下: [html]   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:tools="http://schemas.android.com/tools"       android:layout_width="match_parent"       android:layout_height="match_parent"       android:paddingBottom="@dimen/activity_vertical_margin"       android:paddingLeft="@dimen/activity_horizontal_margin"       android:paddingRight="@dimen/activity_horizontal_margin"       android:paddingTop="@dimen/activity_vertical_margin"       tools:context=".WifiListActivity" >          <ListView           android:id="@+id/listView"           android:layout_width="match_parent"           android:layout_height="wrap_content" >       </ListView>      </RelativeLayout>   2.ListView的item布局文件item_wifi_list.xml内容如下: [html]  <?xml version="1.0" encoding="utf-8"?>   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"       android:layout_width="match_parent"       android:layout_height="match_parent" >          <ImageView           android:id="@+id/imageView"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_alignParentLeft="true"           android:layout_alignParentTop="true"           android:src="@drawable/ic_launcher" />          <TextView           android:id="@+id/textView"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_alignBottom="@+id/imageView"           android:layout_marginBottom="14dp"           android:layout_toRightOf="@+id/imageView"           android:text="TextView" />          <TextView           android:id="@+id/signal_strenth"           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:layout_alignBaseline="@+id/textView"           android:layout_alignBottom="@+id/textView"           android:layout_alignParentRight="true"           android:text="TextView" />      </RelativeLayout>   3.下面就activity的代码了,这里需要自己自定义列表。 [java]   public class WifiListActivity extends Activity {          private WifiManager wifiManager;       List<ScanResult> list;       @Override       protected void onCreate(Bundle savedInstanceState) {           super.onCreate(savedInstanceState);           setContentView(R.layout.activity_wifi_list);           init();       }          private void init() {           wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);           openWifi();           list = wifiManager.getScanResults();           ListView listView = (ListView) findViewById(R.id.listView);           if (list == null) {               Toast.makeText(this, "wifi未打开!", Toast.LENGTH_LONG).show();           }else {               listView.setAdapter(new MyAdapter(this,list));           }                  }              /**       *  打开WIFI       */       private void openWifi() {          if (!wifiManager.isWifiEnabled()) {           wifiManager.setWifiEnabled(true);          }                }          public class MyAdapter extends BaseAdapter {              LayoutInflater inflater;           List<ScanResult> list;           public MyAdapter(Context context, List<ScanResult> list) {               // TODO Auto-generated constructor stub               this.inflater = LayoutInflater.from(context);               this.list = list;           }              @Override           public int getCount() {               // TODO Auto-generated method stub               return list.size();           }              @Override           public Object getItem(int position) {               // TODO Auto-generated method stub               return position;           }              @Override           public long getItemId(int position) {               // TODO Auto-generated method stub               return position;           }              @Override           public View getView(int position, View convertView, ViewGroup parent) {               // TODO Auto-generated method stub               View view = null;               view = inflater.inflate(R.layout.item_wifi_list, null);               ScanResult scanResult = list.get(position);               TextView textView = (TextView) view.findViewById(R.id.textView);               textView.setText(scanResult.SSID);               TextView signalStrenth = (TextView) view.findViewById(R.id.signal_strenth);               signalStrenth.setText(String.valueOf(Math.abs(scanResult.level)));               ImageView imageView = (ImageView) view.findViewById(R.id.imageView);               //判断信号强度,显示对应的指示图标               if (Math.abs(scanResult.level) > 100) {                   imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_0));               } else if (Math.abs(scanResult.level) > 80) {                   imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_1));               } else if (Math.abs(scanResult.level) > 70) {                   imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_1));               } else if (Math.abs(scanResult.level) > 60) {                   imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_2));               } else if (Math.abs(scanResult.level) > 50) {                   imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_3));               } else {                   imageView.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_wifi_signal_4));               }               return view;           }          }      }   程序运行效果图如下: 参考:http://www.open-open.com/lib/view/open1377702950526.html
文章
Android开发
2014-10-11
我的Android进阶之旅------>Android检测wifi连接状态
                       今天要实现监听系统Wifi连接状态,下面代码简化后提取出来的,以备后用。 step1. 编写BroadcastReceiver import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.NetworkInfo.State; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.text.format.Formatter; import android.util.Log; import com.canplay.systemui.QuickSettings; /** * @author ouyangpeng * @link http://blog.csdn.net/ouyang_peng */ public class NetworkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final String TAG="@@@@@@@@@@@@NetworkReceiver"; ConnectivityManager connectivityManager = (ConnectivityManager) context                     .getSystemService(Context.CONNECTIVITY_SERVICE);             NetworkInfo net = connectivityManager.getActiveNetworkInfo();             if (net == null) {                 Log.i(TAG, "无网络连接");             } else {                 Log.i(TAG, "网络连接类型为" + net.getTypeName());             }             // wifi连接状态             State wifi = connectivityManager.getNetworkInfo(                     ConnectivityManager.TYPE_WIFI).getState();             if (wifi == State.CONNECTED || wifi == State.CONNECTING) {                 Log.i(TAG, "连接wifi");                 // wifi管理                 WifiManager wifiManager = (WifiManager) context                         .getSystemService(Context.WIFI_SERVICE);                 WifiInfo wifiInfo = wifiManager.getConnectionInfo();                 StringBuffer sb = new StringBuffer();                 sb.append("\n获取BSSID属性(所连接的WIFI设备的MAC地址):" + wifiInfo.getBSSID());                 // sb.append("getDetailedStateOf()  获取客户端的连通性:");                 sb.append("\n\n获取SSID 是否被隐藏:" + wifiInfo.getHiddenSSID());                 // IP地址转化为字符串格式                 sb.append("\n\n获取IP 地址:" +  Formatter.formatIpAddress(wifiInfo.getIpAddress()));                 sb.append("\n\n获取连接的速度:" + wifiInfo.getLinkSpeed());                 sb.append("\n\n获取Mac 地址(手机本身网卡的MAC地址):" + wifiInfo.getMacAddress()==null?"No Wifi Device":wifiInfo.getMacAddress());                 sb.append("\n\n获取802.11n 网络的信号:" + wifiInfo.getRssi());                 sb.append("\n\n获取SSID(所连接的WIFI的网络名称):" + wifiInfo.getSSID());                 sb.append("\n\n获取具体客户端状态的信息:" + wifiInfo.getSupplicantState());                 Log.i(TAG, "连接wifi的信息:\n"+sb.toString());             } else if (wifi == State.DISCONNECTED || wifi == State.DISCONNECTING) {                 Log.i(TAG, "断开wifi");             } } } step2. 配置BroadcastReceiver和相关权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 检测网络 --> <receiver android:name=".NetworkReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> <!-- 开机启动的广播 --> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> 下面是通过logcat打印出来的信息 当wifi连接上时候的信息: I/@@@@@@@@@@@@NetworkReceiver( 1653): 网络连接类型为WIFI I/@@@@@@@@@@@@NetworkReceiver( 1653): 连接wifi I/@@@@@@@@@@@@NetworkReceiver( 1653): 连接wifi的信息: I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取BSSID属性(所连接的WIFI设备的MAC地址):20:dc:e6:71:10:e6 I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取SSID 是否被隐藏:false I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取IP 地址:192.168.1.115 I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取连接的速度:48cc:b2:55:58:f2:02 I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取802.11n 网络的信号:-49 I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取SSID(所连接的WIFI的网络名称):FORMIKE I/@@@@@@@@@@@@NetworkReceiver( 1653): I/@@@@@@@@@@@@NetworkReceiver( 1653): 获取具体客户端状态的信息:COMPLETED 当wifi断开时候的信息: I/@@@@@@@@@@@@NetworkReceiver( 1653): 无网络连接 I/@@@@@@@@@@@@NetworkReceiver( 1653): 断开wifi ====================================================================================   作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!   转载请保留原文地址:http://blog.csdn.net/ouyang_peng ===================================================================================
文章
机器学习/深度学习  ·  Android开发
2013-12-13
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位、基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用的,肯定是无法获取获取位置信息(当然也肯定是有办法解决这种问题的) 3.android 的GPS定位需要一定时间的,大概一分钟左右。 4.android的Network方式定位需要一定时间,大概两秒左右。 这篇文章献给小白,大神请勿见笑,我也是参考了几篇文章才得出以上几个结论,希望给刚学习android 定位的小白少走点弯路。下面就来讲讲这几个具体的结论和如何使用android GPS定位。 其实如何使用android定位,还是比较简单,刚开始学习定位,但是很多概念点不知道,使用android 的“GPS”定位时,百度了一下,知道了android定位主要有四种方式GPS,Network(wifi定位、基站定位),AGPS定位 。原本我以为使用network定位这几行代码就可以实现了,结果发现获取的location始终为null,那么问题就来了。 国产android手机 使用network进行定位时获取location始终为null //获取地理位置管理器 locationManager = (LocationManager)GetSystemService(Context.LocationService); //获取地理位置信息设置查询条件 if (locationManager.IsProviderEnabled(LocationManager.NetworkProvider)) { location = locationManager.GetLastKnownLocation(LocationManager.NetworkProvider); } if (location != null) { string info = "时间:" + ConvertLongToDateTime(location.Time).ToString("yyyy-MM-dd HH:mm:ss") + "\n海拔:" + location.Altitude + "\n经度:" + location.Longitude + "\n纬度:" + location.Latitude+"\n提供者:"+location.Provider; tv_location.Text = info; Debug.Write(info); } 刚开始,写这几行代码,以为能获取到location,结果发现network不支持(其实绝大部分android国产机都不支持),导致location一直为null。看了几篇文章,发现很多人使用network也是能获取到,看你手机吧。结果发现很多人也遇到过这种问题,如:http://bbs.csdn.net/topics/350224658 真正原因:国产手机厂商对android系统进行了改动,将谷歌的服务包删除了,无法支持network定位的的根本原因就是没有谷歌的网络定位服务包,也就说network定位调用的是谷歌地图api,而百度,腾讯,高德都是使用自己的地图api包,最终的原因我们还是能理解的google毕竟没有进入中国来,不能提供服务也在情理之中。 解决办法:既然没有服务包,重新加上就可以了。参考这篇文章http://blog.csdn.net/bjrxyz/article/details/8606805 android 使用gps定位获取的location为null 上面刚刚说到大部分国产android不能使用network方式定位,那就使用gps定位,gps定位需要硬件支持,直接和卫星交互来获取当前location信息。 优点:“速度快”,精度高,不需要网络 缺点:首次连接时间长,像室内这种有遮挡物的空间无法获取location,比较耗电。 关于android中使用gps定位获取的location为null,1.首先你得先确定是否在遮挡物的空间下,如果有遮挡物是无法通过gps来定位的,我虽然也是在室内但是在窗户边能够通过gps获取location。 2.Location location=locationManager.GetLastKnownLocation(“gps”); 这行代码第一次运行的时候location肯定是为null的。GetLastKnownLocation方法获取的是上一次定位的位置。而且获取使用gps获取Location是需要一定的时间,所以说要用监听的方式来实现获取Location。下面就用代码来实现在xamarin android中使用GPS定位获取经纬度 代码实现xamarin android使用gps定位获取经纬度 以下代码都是在真机下运行的。 先来看看Activity总的代码,实现监听Location的接口ILocationListener ,当然GPS状态的接口是GpsStatus.IListener也可以实现监听。 效果图如下: public class TestActivity : Activity, ILocationListener, GpsStatus.IListener { private TextView tv_location; private LocationManager locationManager; private DateTime now; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); tv_location = FindViewById<TextView>(Resource.Id.tv_location); locationManager = (LocationManager)GetSystemService(Context.LocationService); if (!locationManager.IsProviderEnabled(LocationManager.GpsProvider)) { Intent intent = new Intent(Android.Provider.Settings.ActionLocationSourceSettings); StartActivityForResult(intent,0); } now = DateTime.Now; //获取最好的定位提供,如果你的android国产机不支持network,开了gps,这个时候返回的gps string bestProvider = locationManager.GetBestProvider(getCriteria(),true); Location location = locationManager.GetLastKnownLocation(bestProvider); UpdateLocation(location); locationManager.AddGpsStatusListener(this);//这个是监听状态GPS //注册监听,第一个参数定位提供者,这里使用的是gps,我小米手机不支持network,大多数不支持,不建议使用network //参数2:位置信息更新周期,单位为毫秒 //参数3:位置变化最小距离,当位置距离变化超过这个值,将更新位置信息 locationManager.RequestLocationUpdates("gps",1000,1,this); } } //Location的监听的接口相关方法的实现 //位置发生变化触发 public void OnLocationChanged(Location location) { UpdateLocation(location); } //gps禁用触发 public void OnProviderDisabled(string provider) { UpdateLocation(null); } /// GPS开启时触发 public void OnProviderEnabled(string provider) { //throw new NotImplementedException(); Location location = locationManager.GetLastKnownLocation(provider); UpdateLocation(location); } /// GPS状态发生变化 public void OnStatusChanged(string provider, [GeneratedEnum] Availability status, Bundle extras) { switch (status) { case Availability.Available: System.Diagnostics.Debug.WriteLine("当前GPS状态为可见"); break; case Availability.OutOfService: System.Diagnostics.Debug.WriteLine("当前GPS状态为服务区外状态"); break; case Availability.TemporarilyUnavailable: System.Diagnostics.Debug.WriteLine("当前GPS状态为暂停服务状态"); break; } } ///GpsStatus.IListener接口gps状态的实现 /// GPS状态改变触发 public void OnGpsStatusChanged([GeneratedEnum] GpsEvent e) { switch (e) { //第一次定位 case GpsEvent.FirstFix: System.Diagnostics.Debug.WriteLine("第一次定位"); break; case GpsEvent.SatelliteStatus: System.Diagnostics.Debug.WriteLine("卫星状态改变"); //获取当前状态 GpsStatus gpsStatus = locationManager.GetGpsStatus(null); int maxSatellites = gpsStatus.MaxSatellites; //Iterator<GpsSatellite> iters= gpsStatus.Satellites.Iterator(); break; //定位启动 case GpsEvent.Started: System.Diagnostics.Debug.WriteLine("定位启动"); break; //定位结束 case GpsEvent.Stopped: System.Diagnostics.Debug.WriteLine("定位结束"); break; } } //更新Location private void UpdateLocation(Location location) { if (location != null) { var useTime = ConvertLongToDateTime(location.Time); TimeSpan timeSpan = useTime.Subtract(now); string info = "时间:" + ConvertLongToDateTime(location.Time).ToString("yyyy-MM-dd HH:mm:ss") + "\n海拔:" + location.Altitude + "\n经度:" + location.Longitude + "\n纬度:" + location.Latitude + "\n提供者:" + location.Provider+"\n定位用了"+timeSpan.Seconds+"秒"; tv_location.Text = info; Debug.WriteLine(info); } } 最后加上权限: <uses-permission android:name =“android.permission.ACCESS_FINE_LOCATION”/> <uses-permission android:name =“android.permission.ACCESS_COARSE_LOCATION”/> 这里介绍了android的gps定位,关于其他方式我就不介绍了,文章开头的几个结论都是在实践中得出的。实际开发总各种问题都会出来,以上的内容就当是入门介绍罢了。去年写了篇使用百度地图定位这篇:http://blog.csdn.net/kebi007/article/details/52887570 代码下载地址:http://download.csdn.net/detail/kebi007/9895733 作者:张林 标题:xamarin android使用gps定位获取经纬度 原文地址:http://blog.csdn.net/kebi007/article/details/74936979 转载随意注明出处
文章
定位技术  ·  Android开发
2017-07-11
《深入解析Android 虚拟机》——第1章 获取并编译Android源码 1.1获取Android源码
本节书摘来自异步社区《深入解析Android 虚拟机》一书中的第1章,第1.1节,作者:钟世礼著,更多章节内容可以访问云栖社区“异步社区”公众号查看 第1章 获取并编译Android源码 在本章中,将详细讲解获取并编译Android源码的基本知识,介绍各个目录中主要文件的功能,为读者步入本书后面知识的学习打下基础。 1.1 获取Android源码 要想研究Android系统的源码,需要先获取其源码。目前市面上主流的操作系统有Windows、Linux、Mac OS的操作系统,由于Mac OS源自于Linux系统,因此本书将讲解分别在Windows系统和Linux系统中获取Android源码的知识。 1.1.1 在Linux系统获取Android源码在Linux系统中,通常使用Ubuntu来下载和编译Android源码。由于Android的源码内容很多,Google采用了Git的版本控制工具,并对不同的模块设置不同的Git服务器,可以用repo自动化脚本来下载Android源码,下面介绍获取Android源码的过程。 (1)下载repo。 在用户目录下创建存放repo的bin文件夹,并把该路径设置到环境变量中去,具体命令如下所示: $ mkdir ~/bin $ PATH=~/bin:$PATH 下载用于执行repo的repo的脚本,具体命令如下所示: $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo 设置可执行权限,命令如下所示: $ chmod a+x ~/bin/repo(2)初始化一个repo的客户端。 在用户目录下创建一个空目录,用于存放Android源码,命令如下所示: $ mkdir AndroidCode $ cd AndroidCode 进入到AndroidCode目录,并运行repo下载源码,下载主线分支的代码,主线分支包括最新修改的bug,以及并未正式发布版本的最新源码,命令如下所示: $ repo init -u https://android.googlesource.com/platform/manifest下载其他分支,建议下载正式发布的版本,可以通过添加-b参数来下载,例如下载Android 4.3正式版的命令如下所示: $ repo init -u https://android.googlesource.com/platform/manifest -b android-4.3_r1 在下载过程中会需要填写Name和E-mail,填写完毕之后,选择Y进行确认。最后提示repo初始化完成,这时可以开始同步Android源码了。同步过程非常漫长,需要大家耐心等待。执行下面命令开始同步代码: $ repo sync经过上述步骤后,便开始下载并同步Android源码了,界面效果如图1-1所示。 1.1.2 在Windows平台获取Android源码在Windows平台获取源码与在Linux上原理相同,但是需要预先在Windows平台上搭建一个Linux环境,此处需要用到Cygwin工具。Cygwin的作用是构建一套在Windows上的Linux模拟环境,下载Cygwin工具的地址如下所示: http://cygwin.com/install.html下载成功后会得到一个名为“setup.exe”的可执行文件,通过此文件可以更新和下载最新的工具版本,具体流程如下所示。 (1)启动Cygwin,如图1-2所示。 (2)单击“下一步”按钮,选择第一个选项:从网络下载安装,如图1-3所示。 (3)单击“下一步”按钮,选择安装根目录,如图1-4所示。 (4)单击“下一步”按钮,选择临时文件目录,如图1-5所示。 (5)单击“下一步”按钮,设置网络代理。如果所在网络需要代理,则在这一步进行设置,如果不用代理,则选择直接下载,如图1-6所示。 (6)单击“下一步”按钮,选择下载站点。一般选择离得比较近的站点,速度会比较快,如图1-7所示。 (7)单击“下一步”按钮,开始更新工具列表,如图1-8所示。 (8)单击“下一步”按钮,选择需要下载的工具包。在此需要依次下载curl、git、python这些工具,如图1-9所示。 为了确保能够安装上述工具,一定要用鼠标双击这些图标使之变为Install形式,如图1-10所示。 (9)单击“下一步”按钮,需要经过漫长的等待过程,如图1-11所示。               如果下载安装成功会出现提示信息,单击“完成”按钮即完成安装。打开安装好的Cygwin后,会模拟出一个Linux的工作环境,然后按照Linux平台的源码下载方法就可以下载Android源码了。 建议读者在下载Android源码时,严格按照官方提供的步骤进行,这一点对初学者来说尤为重要。另外,整个下载过程比较漫长,需要大家耐心等待。图1-12是笔者机器的命令截图。 1.1.3 Windows获取Android L源码在作者撰写本书时,Android系统的最新版本是Android L,此版本在Google官方网站的代号为“l-preview”。在Windows系统中获取Android L源码的具体流程如下。 (1)下载Git工具,其官方下载地址是http://www.git-scm.com/downloads ,如图1-13所示。 下载后双击可执行文件进行安装,在安装过程按照默认选项安装即可。 (2)下载并安装TortoiseGit工具,下载地址是https://code.google.com/p/tortoisegit/ ,如图1-14所示。 下载后双击下载后的可执行文件进行安装,安装过程按照默认选项安装即可。如果读者对英文不敢兴趣,可以下载TortoiseGit的中文版本,笔者安装的就是TortoiseGit中文版。 (3)新建一个保存源码的文件夹,例如“cc”,在文件夹上单击右键,然后选择“Git克隆”命令。 (4)在弹出的“Git克隆”对话框界面中,在“URL”后面的文本框中输入Android L项目下载路径,如图1-15所示。 (5)单击图1-15中的“确定”按钮开始下载分支信息文件,下载后的文件被保存在“cc”文件夹中,具体目录结构如图1-16所示。 (6)打开文件default.xml,在里面列出了Android L源码的各个文件夹中子文件夹目录的分支信息,具体格式如下所示: <project path="abi/cpp" name="platform/abi/cpp" groups="pdk"/><project path="art" name="platform/ art"/> <project path="bionic" name="platform/bionic" groups="pdk"/> <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy"/> <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller"/> <project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk"/> <project path="cts" name="platform/cts" groups="cts"/> <project path="dalvik" name="platform/dalvik"/> <project path="developers/build" name="platform/developers/build"/> <project path="developers/demos" name="platform/developers/demos"/> <project path="developers/docs" name="platform/developers/docs"/> <project path="developers/samples/android" name="platform/developers/samples/android"/> 例如“”表示在Android L的源码中,存在了一个名为“bootable”的根目录文件夹,而在“bootable”文件夹中又包含了一个名为bootloader”的子文件夹,而在“bootloader”文件夹下又包含了一个名为“legacy”的文件夹。 (7)开始下载Android L源码,在文件夹“cc”上单击右键,然后选择“Git克隆”命令。在弹出界面中输入Android L某个分支的下载路径,例如path=“art”表示“art”,此文件夹的下载地址是:https://android.googlesource.com/ a/art.git。然后勾选“分支”复选框,并在后面填写“l-prevew”分支,如图1-17所示。 单击“确定”按钮后将开始下载Android L源码中的“art”文件夹的内容。同理,可以根据default.xml文件提供的路径信息继续下载其他文件夹的内容。
文章
Linux  ·  开发工具  ·  Android开发  ·  Windows  ·  git  ·  C++  ·  iOS开发  ·  MacOS  ·  Python  ·  Ubuntu
2017-05-02
Android 和iOS客户端网络数据收集
1.1 Android-网络万用表 安卓推荐使用网络万用表实现常用网络检测工具包括: 域名解析,ping ,出口ip获取,本地dns ip获取,traceroute , tracert ,telnet ,curl地址,MTR,下载文件或给出文件大小及md5,http性能分析,IP定位,IP计算器,时间转化,编码转化,二维码生成。A.域名解析及Ping对输入的域名进行DNS 解析并完成ping 操作B.位置,IP地址获取设备的GPS位置(需要GPS授权)获取设备当前网络的IP(内网IP,公网IP)C.DNS信息得到用户当前网络的dns 信息(运营商),如果有多个都会遍历到D.Traceroute得到用户当前网络的到某个域名或IP 的路由信息,用于诊断网络故障使用E.端口tcptelnet 指定的IP及端口的联通性情况,有时ip禁ping ,可以进行用它进行检测网络情况.F.Curl结果抓取一个URL,并等到它的内容信息(源码展示).G.Wget 测试wget 一个文件,测试文件的下载速度,文件大小,文件md5H.HttpTime 数据说明time_total 总时间,按秒计。精确到小数点后三位。time_namelookup DNS解析时间,从请求开始到DNS解析完毕所用时间。time_connect 连接时间,从开始到建立TCP连接完成所用时间,包括前边DNS解析时间,如果需要单纯的得到连接时间,用这个time_connect时间减去前边time_namelookup时间。time_appconnect 连接建立完成时间,如SSL/SSH等建立连接或者完成三次握手时间。time_pretransfer 从开始到准备传输的时间。time_redirect 重定向时间,包括到最后一次传输前的几次重定向的DNS解析,连接,预传输,传输时间。time_starttransfer 开始传输时间。在发出请求之后,Web 服务器返回数据的第一个字节所用的时间 1.2 iOS-iNetTools IOS系统推荐使用iNetTools它提供了常用的工具如Ping, DNS查找,跟踪路由,端口扫描器,Whoise,服务器监测,网络扫描。支持的功能包括:• 通用应用程序,同时支持iPhone和iPad 。您只需支付一次,在所有设备上运行。• 支持IPv4和IPv6。• 工具包括:Ping,跟踪路由, DNS查找,端口扫描器,Whoise,服务器监测和网络扫描。• 支持服务器列表,枚举经常使用的服务器。• 支持最近执行任务的最近的任务。
文章
域名解析  ·  网络协议  ·  定位技术  ·  网络安全  ·  Android开发  ·  iOS开发
2020-01-02
...
跳转至:
开发与运维
5189 人关注 | 125227 讨论 | 183133 内容
+ 订阅
  • Git常用命令
  • iOS逆向-day3:Cycript
  • Vue学习之从入门到神经(两万字收藏篇)(三)
查看更多 >
IoT
121579 人关注 | 2575 讨论 | 17679 内容
+ 订阅
  • 我的ECS使用体验报告
  • 服务器使用
  • “1s? 我要0s” -- 阿里云安全产品1秒战役总结
查看更多 >
人工智能
2594 人关注 | 9266 讨论 | 61553 内容
+ 订阅
  • 飞天加速计划·高校学生在家实践——ECS服务器初体验
  • Contextual Transformer端到端语音识别文本定制技术,可显著提升热词召回及整体识别率
  • RISC-V大赛开发套件详解(二):D1哪吒开发板Yocto介绍
查看更多 >
安全
1032 人关注 | 23273 讨论 | 51685 内容
+ 订阅
  • iOS逆向-day3:Cycript
  • 今天是 Java 诞生日,Java 27 岁了!
  • 联盟链 Hyperledger Fabric 应用场景
查看更多 >
云计算
21600 人关注 | 57837 讨论 | 36197 内容
+ 订阅
  • K8S面试题
  • 云起学习小记
  • Swift5.0 - day9-字面量协议、模式匹配
查看更多 >