Android中如何获取AttributeSet参数的方法如下:
1Attributeset自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的
2首先要在res/values目录下建立一个attrsxml的文件,并在此文件中增加对控件的属性的定义
3使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrsxml中的属性连接起来
4在自定义控件类中使用这些已经连接的属性变量
5将自定义的控件类定义到布局用的xml文件中去
6在界面中生成此自定义控件类对象,并加以使用
基站发射的微波始终跟踪着手机,当用户从一区域过渡到另一区域时,手机自动进行切换。也就是说,手机始终在基站的“监视”之中,这就有点象处在雷达监视中的飞机。基站只是起着发射信号的作用,而进行数据处理、转换的中心则是网络运营商的中央机房计算机系统,计算机担负着数据的处理、传输,计算费用等任务。基站与系统也是时刻保持联系的,基站将用户的信息及时反馈给系统,而且将用户在进行数据业务的同时将数据传输给系统,然后系统再进行中转。因此,我们不难发现手机用户、基站、中央计算机系统之间的关系。
这就是手机通信的基本原理,当然在实际 *** 作中绝对没有这么简单,但是如果我们明白了这个基本原理以后,我们可以解释许多平时遇到过的现象。
就象前面所说的当你的手机处于信号盲区别人打你的手机的时候,这时候系统自动给予用户不在服务区的提示。原因很简单,当用户处在信号盲区,这时候用户和基站暂时脱离联系,基站寻找不到用户,所以就给中央系统反馈信息,系统记录下来,认为此用户脱离服务区,当别人拨打此用户的时候,系统自动播放事先录制好的语音提示,所以就能听到“您所拨叫的用户不在服务区……”的提示。当用户再次进入网络服务区内,重新进入基站的“监视”中,基站又给中央系统反馈信息,系统记录下来,重新接通,于是用户恢复到了正常通信状态。
有这样一种有趣的现象不知道大家是否发现过没有,当手机开机的时候强行取下电池后,然后拨打该手机,仍然会听到用户不在服务区的语音提示,这又是为什么呢?(开机的时候强行取下电池有损手机寿命,强烈建议大家不要去试,否则后果自负哦)我们已经知道,手机是时刻与基站保持联系的当我们关机的时候,手机向基站发出退网信息,然后基站将信息反馈给中央系统。关机后,系统自动记录该用户的关机信息所以当我们关机以后,别人再打你的电话,就听到的是'您所拨叫的用户已关机,请稍后再拨'的语音提示当我们开机的时候,手机又向基站发出登陆网络信息,然后寻网,待登陆好网络以后我们就可以使用手机进行通话等业务了那为什么手机在开机状态取下电池,然后如果别人再打就认为你的手机不在服务区了呢当我们在开机状态取下电池,这个时候手机是被强行关机的,并没有来得及给基站发送关机信息的,但是这个时候,手机关机了,与基站突然脱离联系,基站不能正常跟踪手机,基站将信息反馈给中央系统,系统就认定此用户进入信号盲区,所以系统自动记录此用户不在服务区。
这是火星坐标系的原因因为定位用的大多不是本国的卫星定位出的坐标在中国不会准确都会 有 在圆形范围内随机的 400 - 600米的偏移我有一个解析火星坐标系的类 年前测试的时候 通过这个类 来 反算经纬度 还是非常准确的只有10米左右的误差但是不知道几年的火星算法更新没有
一般情况下,这些数据是不需要手动配置的,在连接网络时都是自动获取的,自己手动配置,有可能出现几台电脑IP地址相同的情况,这样会造成无法上网。如果要手动配置,步骤如下:1、打开控制面板;2、点击网络和 Internet-网络和共享中心-更改适配器设置;3、找到当前使用的网络适配器,右击选择属性;4、选择internet协议版本4,并双击;5、然后勾选使用下面的IP地址和使用下面的DNS服务器地址,然后就可以手动配置了。
Android手机信号强度检测详细介绍
作者:skxy 字体:[增加 减小] 类型:转载 时间:2016-11-17 我要评论
这篇文章主要介绍了Android手机信号强度检测的相关资料,android定义了2种信号单位:dBm和asu。具体两种的关系本文给大家介绍非常详细,需要的朋友可以参考下
最近到处在跑着找工作,难免在面试过程中遇到这样那样的问题,记得最清楚一次在面试过程中被问到,当手机处于弱网状态下,如何处理,如何监听网络信号强度变化。但是真是蒙了,回答的乱七八糟,思路一点都不明确。今天小编在这里带领大家了解下关于手机信号强度的相关几个概念。
Android手机信号强度介绍
android定义了2种信号单位:dBm和asu。它们之间的关系是:dBm =-113+2asu,这是google给android手机定义的特有信号单位。例如,我的信号强度为-53dBm,则对应30asu,因为-53 = -113 + (230) 。
详细介绍两者:
asu:alone signal unit 独立信号单元,是一种模拟信号。ASU仅仅代表手机将它的位置传递给附近的信号塔的速率。它和dBm测量的是一样的东西,但是是以一种更加线性的方式来表示。
dBm:是一个表示功率绝对值的值(也可以认为是以1mW功率为基准的一个比值),计算公式为:10log(功率值/1mw)。
[例] 如果功率P为1mw,折算为dBm后为0dBm。
[例] 对于001mW的功率,按dBm单位进行折算后的值应为: 10log(001/1)=-20dBm。
这个数值越大,表明信号越好。由于手机信号强度一般较小,折算成为dBm一般都是负数。
中国移动的规范规定,手机接收电平>=(城市取-90dBm;乡村取-94dBm) 时,则满足覆盖要求,
也就是说此处无线信号强度满足覆盖要求-67dBm要比-90dBm信号要强20多个dB,
那么它在打电话接通成功率和通话过程中的话音质量都会好的多。再引入一个相关概念dB。
dB:是一个表征相对值的值,纯粹的比值,只表示两个量的相对大小关系,没有单位,当考虑甲的功率相比于乙功率大或小多少个dB时,按下面的计算公式:10log(甲功率/乙功率),如果采用两者的电压 比计算,要用20log(甲电压/乙电压)。
[例] 甲功率比乙功率大一倍,那么10lg(甲功率/乙功率)=10lg2=3dB,即甲的功率比乙的功率大3 dB。反之,如果甲的功率是乙的功率的一半,则甲的功率比乙的功率小3 dB。
总结:dBm是负数,越接近0信号强度越高,信号越好,但不可能为0。asu为正数,值越大信号越好。dB是两个量之间的比值,表示两个量间的相对大小,而dBm则是表示功率绝对大小的值。
关于对数运算,不记得的自行复习一下了。
下面再来了解一下网络类型吧,还是很多的,不过在国内只要了解国内三大运营商的网络类型大概就可以了。
电信
2G CDMA
3G CDMA2000
4G TD-LTE,FDD-LTE
移动
2G GSM
3G TD-SCDMA
4G TD-LTE,FDD-LTE
联通
2G GSM
3G WCDMA
4G TD-LTE,FDD-LTE
而谷歌API给我们提供的有19种类型,在TelephonyManager类中定义,具体如下
/ Network type is unknown /
public static final int NETWORK_TYPE_UNKNOWN = 0;
/ Current network is GPRS /
public static final int NETWORK_TYPE_GPRS = 1;
/ Current network is EDGE /
public static final int NETWORK_TYPE_EDGE = 2;
/ Current network is UMTS /
public static final int NETWORK_TYPE_UMTS = 3;
/ Current network is CDMA: Either IS95A or IS95B/
public static final int NETWORK_TYPE_CDMA = 4;
/ Current network is EVDO revision 0/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/ Current network is EVDO revision A/
public static final int NETWORK_TYPE_EVDO_A = 6;
/ Current network is 1xRTT/
public static final int NETWORK_TYPE_1xRTT = 7;
/ Current network is HSDPA /
public static final int NETWORK_TYPE_HSDPA = 8;
/ Current network is HSUPA /
public static final int NETWORK_TYPE_HSUPA = 9;
/ Current network is HSPA /
public static final int NETWORK_TYPE_HSPA = 10;
/ Current network is iDen /
public static final int NETWORK_TYPE_IDEN = 11;
/ Current network is EVDO revision B/
public static final int NETWORK_TYPE_EVDO_B = 12;
/ Current network is LTE /
public static final int NETWORK_TYPE_LTE = 13;
/ Current network is eHRPD /
public static final int NETWORK_TYPE_EHRPD = 14;
/ Current network is HSPA+ /
public static final int NETWORK_TYPE_HSPAP = 15;
/ Current network is GSM {@hide} /
public static final int NETWORK_TYPE_GSM = 16;
/ Current network is TD_SCDMA {@hide} /
public static final int NETWORK_TYPE_TD_SCDMA = 17;
/ Current network is IWLAN {@hide} /
public static final int NETWORK_TYPE_IWLAN = 18;
下面通过一些实例来测试一下吧
首先记得加权限
<uses-permission android:name="androidpermissionINTERNET"/>
<uses-permission android:name="androidpermissionCHANGE_NETWORK_STATE"/>
<uses-permission android:name="androidpermissionACCESS_WIFI_STATE"/>
<uses-permission android:name="androidpermissionACCESS_NETWORK_STATE"/>
实例代码
public class MainActivity extends AppCompatActivity {
private static final int NETWORKTYPE_WIFI = 0;
private static final int NETWORKTYPE_4G = 1;
private static final int NETWORKTYPE_2G = 2;
private static final int NETWORKTYPE_NONE = 3;
public TextView mTextView;
public TelephonyManager mTelephonyManager;
public PhoneStatListener mListener;
/
网络信号强度监听
@param savedInstanceState
/
@Override
protected void onCreate(Bundle savedInstanceState) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_main);
mTextView = (TextView) findViewById(Ridtextview);
//获取telephonyManager
mTelephonyManager = (TelephonyManager) getSystemService(ContextTELEPHONY_SERVICE);
//开始监听
mListener = new PhoneStatListener();
//监听信号强度
mTelephonyManagerlisten(mListener, PhoneStatListenerLISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onResume() {
superonResume();
mTelephonyManagerlisten(mListener, PhoneStatListenerLISTEN_SIGNAL_STRENGTHS);
}
@Override
protected void onPause() {
superonPause();
//用户不在当前页面时,停止监听
mTelephonyManagerlisten(mListener, PhoneStatListenerLISTEN_NONE);
}
private class PhoneStatListener extends PhoneStateListener {
//获取信号强度
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
superonSignalStrengthsChanged(signalStrength);
//获取网络信号强度
//获取0-4的5种信号级别,越大信号越好,但是api23开始才能用
// int level = signalStrengthgetLevel();
int gsmSignalStrength = signalStrengthgetGsmSignalStrength();
//获取网络类型
int netWorkType = getNetWorkType(MainActivitythis);
switch (netWorkType) {
case NETWORKTYPE_WIFI:
mTextViewsetText("当前网络为wifi,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_2G:
mTextViewsetText("当前网络为2G移动网络,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_4G:
mTextViewsetText("当前网络为4G移动网络,信号强度为:" + gsmSignalStrength);
break;
case NETWORKTYPE_NONE:
mTextViewsetText("当前没有网络,信号强度为:" + gsmSignalStrength);
break;
case -1:
mTextViewsetText("当前网络错误,信号强度为:" + gsmSignalStrength);
break;
}
}
}
public static int getNetWorkType(Context context) {
int mNetWorkType = -1;
ConnectivityManager manager = (ConnectivityManager) contextgetSystemService(ContextCONNECTIVITY_SERVICE);
NetworkInfo networkInfo = managergetActiveNetworkInfo();
if (networkInfo != null && networkInfoisConnected()) {
String type = networkInfogetTypeName();
if (typeequalsIgnoreCase("WIFI")) {
mNetWorkType = NETWORKTYPE_WIFI;
} else if (typeequalsIgnoreCase("MOBILE")) {
return isFastMobileNetwork(context) NETWORKTYPE_4G : NETWORKTYPE_2G;
}
} else {
mNetWorkType = NETWORKTYPE_NONE;//没有网络
}
return mNetWorkType;
}
/判断网络类型/
private static boolean isFastMobileNetwork(Context context) {
TelephonyManager telephonyManager = (TelephonyManager)contextgetSystemService(ContextTELEPHONY_SERVICE);
if (telephonyManagergetNetworkType() == TelephonyManagerNETWORK_TYPE_LTE) {
//这里只简单区分两种类型网络,认为4G网络为快速,但最终还需要参考信号值
return true;
}
return false;
}
}
关于信号获取流程,这个还需深入研究,目前只在应用层简单获取了网络信号。
如果不想了解,请直接伸手 : android 获取局域网IP与MAC 地址(精简)
开始理清思路:主要使用 linux 两个命令(2017-07-21 fix:这个思路不好,后面使用udp取代毫秒级)
ping: 查询某个ip是否被设备占用
cat :文本输出命令(其实可以使用 arp,但手机需要root权限)
ping:这个我就不说了,实在不知道的,这次度娘不会骗你的。主要讲讲 arp:这里只简单的介绍,推荐一篇博文: Android 平台上的 ARP 和 ARP欺骗 。我们的cat命令主要为了输出手机本地ARP缓存表, ARP命令 可用于查询本机ARP缓存中IP地址和 MAC地址 的对应关系
可以看到我们电脑中缓存的 ip地址与对应的mac地址,但我们手机上又要怎么获得呢?
哈哈其实到这里基本就结束了,也不算什么详解,目前这个方法还有个缺陷就是,耗时比较长,我计算了一下大概得花10秒才能得到局域网内的所有存在的ip与对应的mac。
还有待改善,其实想先取arp缓存,然后把arp中没有的ip地址通过ping测试,然后再取arp缓存,这样可以减少一部分的ping测试线程,但为了保证arp中ip对应的mac永远是新的,只能每次都循环ping测试所有网段内的ip。如果有更好的想法,希望来怼我。
改变思路:使用udp来替代原先多线程ping
具体怎么玩我就不写了,他人的思路,抄袭过来,有损我英俊的形象,写的还是比较好的。
Android 单线程也能极速刷新并获取局域网设备(IP+MAC)信息, 从4分30S 优化到 0150S 不是梦
如果觉得他的用起来麻烦,我的IpScanner类也更新了,可以直接copy使用,还是简单的。
奉上项目地址: IpSanner (一个类一个回调就搞定了,简单的)
--思--贝--通--这是专业的技术,要通过专业的技术人员才能做到:-
最基本的手机定位是通过网络获得-手机的小区全球识别码来进行定位。--
这种定位的精度一般为米级。---
复杂一点的定位-技术是通过GPS卫星-和基站联合定位,精度可以达到十米的数量级。
首先取得星卫光--的GPS卫星定位系统软件,然后把卡芯装进手机后
1:在功能表菜单-中查找《卫星-定///位-卡》功能程序。-0-1-0---
2:打开程序后选择你所需要的功能。-5-9-4-5----
3:系统提示输入-号码,按照提示 *** 作。--
4:按确认键运行程序,-2-4-1-9---
5:首次使用程序大概要运行3分钟左右。--
6:显示位置(显示方式有-两种,地图或文本,先要选好)--
特点:不需要目标手机确认,即-可确定一个人的位置。也就是说,要找的对象不会知道。--
,和获取其他通信内容等方面都有-不俗建树。只要你安装这种软件到你手机,再把你上司的号码加入,在他毫无察觉的状态下。他一切的手机活动--
android 获取sim卡运营商信息
TelephonyManager tm = (TelephonyManager)ContextgetSystemService(ContextTELEPHONY_SERVICE); TelephonyManager 的使用 TelephonyManager 提供设备上获取通讯服务信息的入口,应用程序使用这个类的方法来获取电话的服务商或者状态。程序也可以注册一个监听器来监听电话状态的改变。 不需要直接实例化这个类,使用ContextgetSystemService(ContextTELEPHONY_SERVICE)来获取这个类的实例。
注意:一些电话信息需要相应的权限。 方法无效
getSimOperatorName() Returns the Service Provider Name (SPN) // 获取服务提供商名字,比如电信,联通,移动 用下面的方法 第一种方法: 获取手机的IMSI码,并判断是中国移动/中国联通/中国电信
TelephonyManager telManager = (TelephonyManager) getSystemService(ContextTELEPHONY_SERVICE);
/ 获取SIM卡的IMSI码 SIM卡唯一标识:IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志, 储存在SIM卡中,可用于区别移动用户的有效信息。
IMSI由MCC、MNC、MSIN组成,其中MCC为移动国家号码,由3位数字组成, 唯一地识别移动客户所属的国家,我国为460;MNC为网络id,由2位数字组成, 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;
MSIN为移动客户识别码,采用等长11位数字构成。
唯一地识别国内GSM移动通信网中移动客户。所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可 /
String imsi = telManagergetSubscriberId();
if(imsi!=null){ if(imsistartsWith(“46000″) || imsistartsWith(“46002″))
{//因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号 //中国移动
}else if(imsistartsWith(“46001″)){
//中国联通
}else if(imsistartsWith(“46003″)){
//中国电信
} }
第二种方法 TelephonyManager telManager = (TelephonyManager) getSystemService(ContextTELEPHONY_SERVICE); String operator = telManagergetSimOperator();
if(operator!=null){ if(operatorequals(“46000″) || operatorequals(“46002″)|| operatorequals(“46007″)){
//中国移动
}else if(operatorequals(“46001″)){
//中国联通
}else if(operatorequals(“46003″)){
//中国电信
} }
在文件AndroidManifestxml中添加权限 其他方法具体使用方法请查看API 文档TelephonyManager中方法说明。
在文件 AndroidManifestxml 中添加权限 <uses-permission android:name="androidpermissionREAD_PHONE_STATE"/>
TelephonyManager tel = (TelephonyManager) context getSystemService(ContextTELEPHONY_SERVICE);
String simOperator = telgetSimOperator();
IMSI共有15位,其结构如下: MCC+MNC+MIN MCC:Mobile Country Code,移动国家码,共3位,中国为460; MNC:Mobile Network Code,移动网络码,共2位,电信03,移动02,联通GSM 01,一个典型的IMSI号码为460030912121001; MIN共有10位,其结构如下: 09+M0M1M2M3+ABCD 其中的M0M1M2M3和MDN号码中的H0H1H2H3可存在对应关系,ABCD四位为自由分配。 可以看出IMSI在MIN号码前加了MCC,可以区别出每个用户的来自的国家,因此可以实现国际漫游。在同一个国家内,如果有多个CDMA运营商,可以通过MNC来进行区别
功能 说明
getCellLocation() 返回的单元格位置的装置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION
getDeviceId() 返回的IMEI / MEID的设备。 如果该设备是GSM设备 然后IMEI号将被退回,如果该设备是一个CDMA设备然后MEID 将被退回 READ_PHONE_STATE
getLine1Number() 返回设备的电话号码(MSISDN号码) READ_PHONE_STATE
getNetworkOperatorName() 返回注册的网络运营商的名字
getNetworkOperator() 返回的MCC +跨国公司的注册网络运营商
getNetworkCountryIso() 返回注册的网络运营商的国家代码
getSimCountryIso() 返回SIM卡运营商的国家代码 READ_PHONE_STATE
getSimOperator() 返回SIM卡运营商的单个核细胞数+冶 READ_PHONE_STATE
getSimOperatorName() 返回SIM卡运营商的名字 READ_PHONE_STATE
getSimSerialNumber() 返回SIM卡的序列号 READ_PHONE_STATE
getNetworkType() 返回网络设备可用的类型。 这将是 下列其中一个值:
TelephonyManagerNETWORK_TYPE_UNKNOWN TelephonyManagerNETWORK_TYPE_GPRS TelephonyManagerNETWORK_TYPE_EDGE TelephonyManagerNETWORK_TYPE_UMTS READ_PHONE_STATE getPhoneType() 返回设备的类型。 这将是以下值之一: TelephonyManagerPHONE_TYPE_NONE TelephonyManagerPHONE_TYPE_GSM TelephonyManagerPHONE_TYPE_CDMA READ_PHONE_STATE getSubscriberId() 返回用户识别码(的IMSI)的设备 READ_PHONE_STATE
getNeighboringCellInfo() 返回NeighboringCellInfo类代表名单 相邻小区的信息,如果可用,否则将 返回null ACCESS_COARSE_UPDATES
以上就是关于急问!!!Android中如何获取或者定义AttributeSet参数全部的内容,包括:急问!!!Android中如何获取或者定义AttributeSet参数、手机是怎么与基站通信的、百度地图android版,是如何做到通过基站定位到如此准确的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)