手机在生产时,每部手机均有一个唯一的标识(ID),国际上采用国际移动设备身份码(IMEI, International Mobile Equipment Identity)。IMEI是由15位数字组成的"电子串号",它与每台手机一一对应,而且该码是全世界唯一的。每一只手机在组装完成后都将被赋予一个全球唯一的一组号码,这个号码从生产到交付使用都将被制造生产的厂商所记录。
在手机应用开发中,使用IMEI来做身份认证是一个常用的技术手段,在Android SDK中,类android.telephony.TelephonyManager提供了手机设备信息的相关操作和管理。
1、在AndroidManifest.xml中增加访问设备状态的权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2、通过上下文设备获取到TelephonyManager实例,调用getDeviceId方法获取IMEI:
import android.telephony.*;
……
TelephonyManager telephonyManager=(TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
String imei=telephonyManager.getDeviceId();
值得说明的是,在模拟器中运行时,getDeviceId方法返回总是000000000000000。
另外,TelephonyManager类还提供了获取手机其他信息的方法,如:
-
- getLine1Number():获取到手机号码;
- getDeviceSoftwareVersion:获取到Android操作系统的版本;
- getSimSerialNumber:获取到SIM卡唯一编号ID;
- getSubscriberId:获取到客户ID,即IMSI;
-
在Android 获取手机信息的时候用到这样一段代码:
public class BasicInfo {
public String getPhoneNumber()
{
// 获取手机号 MSISDN,很可能为空
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
StringBuffer inf = new StringBuffer();
switch(tm.getSimState()){ //getSimState()取得sim的状态 有下面6中状态
case TelephonyManager.SIM_STATE_ABSENT :inf.append("无卡");return inf.toString();
case TelephonyManager.SIM_STATE_UNKNOWN :inf.append("未知状态");return inf.toString();
case TelephonyManager.SIM_STATE_NETWORK_LOCKED :inf.append("需要NetworkPIN解锁");return inf.toString();
case TelephonyManager.SIM_STATE_PIN_REQUIRED :inf.append("需要PIN解锁");return inf.toString();
case TelephonyManager.SIM_STATE_PUK_REQUIRED :inf.append("需要PUK解锁");return inf.toString();
case TelephonyManager.SIM_STATE_READY :break;
}
String phoneNumber = tm.getLine1Number();
return phoneNumber;
}
......
}
在另外一个activity类里面调用的时候 总是出现进程关闭 无法获取手机信息。
后来发现
于是:
1.
给BasicInfo 添加一个带参数Context的构造函数:
public BasicInfo (Context context)
{
this.context = context;
}
2.
getPhoneNumber()函数里面改成:
context.getSystemService(Context.TELEPHONY_SERVIC);
3.
在调用类里面 BasicInfo bi = new BasicInfo(this);
bi.getPhoneNumber();
问题解决。。。