android默认打开数据连接

TelephonyManager类主要提供了一系列用于访问与手机通讯相关的状态和信息的get方法。其中包括手机SIM的状态和信息、电信网络的状态及手机用户的信息。在应用程序中可以使用这些get方法获取相关数据。

TelephonyManager类的对象可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法来获得,需要注意的是有些通讯信息的获取对应用程序的权限有一定的限制,在开发的时候需要为其添加相应的权限。
以上两句来自参考:http://www.cnblogs.com/linjiqin/archive/2011/02/26/1965682.html

本例以默认打开和关闭数据连接为例,为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数据库或其他数据库中,早在系统启动之前就可以决定它的开启。

所以,此方法实是下策,但在某些时候,它,仍然是个方法。

你可能感兴趣的:(android)