TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。
TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是有些通讯信息的获取对应用程序的权限有一定的限制,在开发的时候需要为其添加相应的权限。
以上两句来自参考:javascript:void(0)
本例以默认打开和关闭数据连接为例,为TelephonyManager类的使用,一些手机信息状态的获取等提供一个思路与方法。
在实际应用中,我把它写在HomeShell里面的Launcher.java,当系统启动后HomeShell启动,系统发送广播,之后判断是否第一次插卡,并设置数据连接为打开或关闭,从而实现默认打开或关闭数据连接的功能。
涉及到的知识点:
1.AndroidManifest.xml权限
2.BroadcastReceiver广播
3.TelephonyManager类
4.ConnectivityManager类
5.SharedPreferences,用来保存是否第一次插卡。
数据连接需要添加权限:
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
广播注册:
final IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction("android.intent.action.SIM_STATE_CHANGED");
registerReceiver(mReceiver, filter);
广播接收:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
final String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";
//打开Preferences,名称为getsim,如果存在则打开它,否则创建新的Preferences
SharedPreferences sim_Preferences = getSharedPreferences("getsim",0);
//取得getsim_key的值,如果不存在则创建,其默认值为true
boolean isFirst_getsim = sim_Preferences.getBoolean("getsim_key",true);
if (Intent.ACTION_SCREEN_OFF.equals(action)) {
......
}else if (Intent.ACTION_USER_PRESENT.equals(action)) {
......
}else if(action.equals(ACTION_SIM_STATE_CHANGED)){
//获得TelephonyManager对象
TelephonyManager tm = (TelephonyManager)getSystemService(Service.TELEPHONY_SERVICE);
if((tm.getSimState() == TelephonyManager.SIM_STATE_READY)&&isFirst_getsim){//判断SIM状态,判断是否为第一次插卡,是第一次才生效
/**
在TelephonyManager中定义了6中状态:
* /** SIM card state:Unknown.*/
* public static final int SIM_STATE_UNKNOWN = 0;
/** SIM card state: no SIM card is available in the device */
* public static final int SIM_STATE_ABSENT = 1;
/** SIM card state: Locked: requires the user's SIM PIN to unlock */
* public static final int SIM_STATE_PIN_REQUIRED = 2;
/** SIM card state: Locked: requires the user's SIM PUK to unlock */
* public static final int SIM_STATE_PUK_REQUIRED = 3;
/** SIM card state: Locked: requries a network PIN to unlock */
* public static final int SIM_STATE_NETWORK_LOCKED = 4;
/** SIM card state: Ready */
* public static final int SIM_STATE_READY = 5;
*/
//关于Settings.System的使用可以查看上一篇博文
boolean enable = Settings.System.getInt(getContentResolver(),Settings.System.DATA_CONNECTION, 1)==1;
//获得ConnectivityManager对象,
ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//enable=true为默认打开,=false为默认关闭
cm.setMobileDataEnabled(enable);
//getsim_key的值为false,提交,今后将不再生效
sim_Preferences.edit().putBoolean("getsim_key",false).commit();
}
当然还需要在适当时候取消广播:
unregisterReceiver(mReceiver);
总结:
在系统启动后进入Launcher后再来修改网络状态,实际上跟我们自己打开手机后手动关闭或打开是一样的操作,只是用了代码实现而已。正常状态应是该默认值是被存储在framework的DataBaseHelper数据库或其他数据库中,早在系统启动之前就可以决定它的开启。
所以,此方法实是下策,但在某些时候,它,仍然是个方法。