1

Today I have done a task using toggle button. The mobile data needs to be turned on when I press the enable toggle button, and it should be turned off when I press the same button. I had done everything and when I press the enable button, the mobile data remains off. In fact I have added all the manifest permissions. The mobile data should turn on when I press the toggle button. Please help me friends,and also let me know where I committed mistake. I hereby enclosed my XML and Java coding. Please help me friends, Many thanks in advance.

MainActivity.java:

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
import android.os.Bundle;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MainActivity extends Activity{
    // constants
    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
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // load controls
        TVMobileData=(TextView)findViewById(R.id.TVMobileData);
        tBMobileData=(ToggleButton)findViewById(R.id.tBMobileData);

        // set click event for button
        tBMobileData.setOnClickListener(new View.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;
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="arun.com.togglebuttonexample.MainActivity">

    <TextView
        android:id="@+id/TVMobileData"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="90dp"
        android:text="Mobile Data: Disable"
        android:textColor="#1BD6E0"
        android:textSize="40sp" />

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

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="arun.com.togglebuttonexample">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
        <uses-permission android:name="android.permission.WRITE_SETTINGS"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Da1
  • 21
  • 1
  • 6
  • Have a look at [This](https://stackoverflow.com/questions/26539445/the-setmobiledataenabled-method-is-no-longer-callable-as-of-android-l-and-later) – ADM Nov 08 '17 at 13:19

1 Answers1

1

You can access mobile data on / off programmaticaly below android 4.4 but not above 4.4 as It's require MODIFY_PHONE_STATE permission check. This permission is only given to system or signature apps. so It wont work on non-rooted phone.

Munir
  • 2,548
  • 1
  • 11
  • 20