Giới thiệu
Ví dụ này thử nghiệm bật/tắt Mobile Data theo chương trình. Lưu ý quan trọng: Từ Android 5.0 (API 21), Google đã chặn việc gọi phương thức ẩn setDataEnabled() của TelephonyManager qua reflection, kể cả trên thiết bị root. Chỉ ứng dụng hệ thống (system app) hoặc có chữ ký nền tảng mới có quyền MODIFY_PHONE_STATE.
Code tham khảo (Chỉ hoạt động trên Android 4.4 trở xuống hoặc System App)
Bước 1: Tạo dự án mới
Android Studio → File → New Project → Empty Activity.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
tools:context=".MainActivity">
<Switch
android:id="@+id/switchData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Dữ liệu di động" />
</LinearLayout>
Bước 3: Code MainActivity (src/MainActivity.java)
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.CompoundButton;
import android.widget.Switch;
import java.lang.reflect.Method;
import java.util.Objects;
public class MainActivity extends AppCompatActivity {
Switch mySwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySwitch = findViewById(R.id.switchData);
mySwitch.setChecked(getMobileDataState());
mySwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
setMobileDataState(isChecked);
});
}
public void setMobileDataState(boolean enabled) {
try {
TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method method = Objects.requireNonNull(telephony).getClass()
.getDeclaredMethod("setDataEnabled", boolean.class);
method.invoke(telephony, enabled);
} catch (Exception ex) {
Log.e("MainActivity", "Lỗi set mobile data", ex);
}
}
public boolean getMobileDataState() {
try {
TelephonyManager telephony = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method method = Objects.requireNonNull(telephony).getClass()
.getDeclaredMethod("getDataEnabled");
return (boolean) method.invoke(telephony);
} catch (Exception ex) {
Log.e("MainActivity", "Lỗi get mobile data", ex);
}
return false;
}
}
Bước 4: Manifest (androidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Trên Android 5.0+, Switch sẽ không tác động đến Mobile Data thực tế (chỉ đổi UI local).

Giải pháp thay thế cho ứng dụng thông thường (Non-system App)
1. Mở màn hình cài đặt Mobile Data (Best Practice)
// Mở trang cài đặt Data Usage / Mobile Network
Intent intent = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
// Hoặc
Intent intent = new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
startActivity(intent);
Người dùng tự bật/tắt → Tuân thủ chính sách bảo mật Android.
2. Sử dụng ConnectivityManager (API 21+) - Chỉ đọc trạng thái
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkCapabilities caps = cm.getNetworkCapabilities(cm.getActiveNetwork());
boolean hasMobileData = caps != null && caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
3. WorkManager + BroadcastReceiver - Theo dõi thay đổi
Đăng ký nhận broadcast ConnectivityManager.CONNECTIVITY_ACTION (deprecated API 29+) hoặc dùng NetworkCallback.
4. Device Policy Controller (DPC) - Chỉ cho app quản trị thiết bị (MDM)
Nếu app là Device Owner / Profile Owner, có thể dùng DevicePolicyManager.setGlobalSetting() hoặc API quản trị chuyên biệt.
Kết luận
Ứng dụng thường không thể bật/tắt Mobile Data trực tiếp trên Android hiện đại. Hãy thiết kế UX dẫn người dùng đến màn hình cài đặt hệ thống. Chỉ system app / MDM mới có quyền này.