Saturday, 16 November 2013

Enable/Disable Mobile Data in Android

               This post will explain about  enable/disable mobile internet data programmatically in android


1. activity_mobile_data.xml

<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" >

    <ToggleButton
        android:id="@+id/tBMobileData"
        android:layout_width="300dp"
        android:layout_height="150dp"
        android:layout_centerInParent="true"
        android:textSize="30sp"
        android:textOff="Enable"
        android:textOn="Disable" />

    <TextView
        android:id="@+id/TVMobileData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/tBMobileData"
        android:layout_alignParentLeft="true"
        android:text="Mobile Data: Disable"
        android:textColor="#1BD6E0"
        android:textSize="40sp" />

</RelativeLayout>

2. AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mobiledata"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mobiledata.MobileData"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>


3. MobileData.Java
package com.example.mobiledata;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.ToggleButton;

import android.app.Activity;
import android.view.Menu;

public class MobileData extends Activity {
    static final String STATUS_ON = "Mobile Data: Enable";
     static final String STATUS_OFF = "Mobile Data: Disable";

     static final String TURN_ON = "Enable";
     static final String TURN_OFF = "Disable";

     // controls
     TextView TVMobileData;
     ToggleButton tBMobileData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mobile_data);
       
     // load controls
        TVMobileData=(TextView)findViewById(R.id.TVMobileData);
        tBMobileData=(ToggleButton)findViewById(R.id.tBMobileData);

        // set click event for button
        tBMobileData.setOnClickListener(new OnClickListener() {                    
         @Override
         public void onClick(View v) {
          // check current state first
          boolean state = isMobileDataEnable();
          // toggle the state
          if(state)toggleMobileDataConnection(false);
          else toggleMobileDataConnection(true);
          // update UI to new state
          updateUI(!state); 
         }
        });
       }
       public void updateUI(boolean state) {
        //set text according to state
        if(state) {
         TVMobileData.setText(STATUS_ON);
         tBMobileData.setText(TURN_OFF);            
        } else {
         TVMobileData.setText(STATUS_OFF);
         tBMobileData.setText(TURN_ON);
        }
       }
       public boolean isMobileDataEnable() {
        boolean mobileDataEnabled = false; // Assume disabled
        ConnectivityManager cm = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
        try {
         Class<?> cmClass = Class.forName(cm.getClass().getName());
         Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
         method.setAccessible(true); // Make the method callable
         // get the setting for "mobile data"
         mobileDataEnabled = (Boolean)method.invoke(cm);
        } catch (Exception e) {
         // Some problem accessible private API and do whatever error handling you want here
        }
        return mobileDataEnabled;
       }
       public boolean toggleMobileDataConnection(boolean ON)
       {
        try {
         //create instance of connectivity manager and get system connectivity service
         final ConnectivityManager conman = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
         //create instance of class and get name of connectivity manager system service class
         final Class<?> conmanClass  = Class.forName(conman.getClass().getName());
         //create instance of field and get mService Declared field
         final Field iConnectivityManagerField= conmanClass.getDeclaredField("mService");
         //Attempt to set the value of the accessible flag to true
         iConnectivityManagerField.setAccessible(true);
         //create instance of object and get the value of field conman
         final Object iConnectivityManager = iConnectivityManagerField.get(conman);
         //create instance of class and get the name of iConnectivityManager field
         final Class<?> iConnectivityManagerClass=  Class.forName(iConnectivityManager.getClass().getName());
         //create instance of method and get declared method and type
         final Method setMobileDataEnabledMethod= iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled",Boolean.TYPE);
         //Attempt to set the value of the accessible flag to true
         setMobileDataEnabledMethod.setAccessible(true);
         //dynamically invoke the iConnectivityManager object according to your need (true/false)
         setMobileDataEnabledMethod.invoke(iConnectivityManager, ON);
        } catch (Exception e){
        }
        return true;
       }
      }

No comments:

Post a Comment