如何使用切换按钮打开和关闭移动数据?

时间:2017-11-08 13:02:04

标签: java android button android-togglebutton

今天我使用切换按钮完成了一项任务。当我按下启用切换按钮时,需要打开移动数据,当我按下相同按钮时应该关闭它。我已经做了所有事情,当我按下启用按钮时,移动数据仍然保持关闭状态。实际上我已经添加了所有的清单权限。当我按下切换按钮时,移动数据应该打开。请帮助我的朋友,也让我知道我犯了错误的地方。我特此附上我的XML和Java编码。请各位朋友帮助,非常感谢。

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>

1 个答案:

答案 0 :(得分:1)

您可以在android 4.4下面的programmaticaly上访问/关闭移动数据,但不能超过4.4,因为它需要MODIFY_PHONE_STATE权限检查。此权限仅授予系统或签名应用程序。所以它不适用于非根电话。