प्रोग्रामेटिक रूप से मोबाइल डेटा चालू/बंद करने का प्रयास - लेकिन गैर-रूटेड डिवाइस पर प्रतिबंधों के कारण यह काम नहीं करता।
⚠️ महत्वपूर्ण सीमाएं
- Android 5.0+ (API 21+):
setMobileDataEnabled()रिफ्लेक्शन के माध्यम से भी कॉल नहीं किया जा सकता - Android 2.1-4.4: रिफ्लेक्शन के माध्यम से काम करता था (रूटेड फोन पर)
- MODIFY_PHONE_STATE अनुमति केवल सिस्टम/हस्ताक्षरित ऐप्स को दी जाती है
- निष्कर्ष: सामान्य ऐप्स मोबाइल डेटा प्रोग्रामेटिक रूप से नियंत्रित नहीं कर सकते
कोड उदाहरण (केवल संदर्भ के लिए - काम नहीं करेगा)
चरण 1: लेआउट
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="Mobile Data" />
</LinearLayout>
चरण 2: रिफ्लेक्शन प्रयास
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", "Error setting mobile data state", 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", "Error getting mobile data state", ex);
}
return false;
}
}
वैकल्पिक समाधान
- सेटिंग्स स्क्रीन खोलें: उपयोगकर्ता को मैन्युअली टॉगल करने दें
startActivity(new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)); // या startActivity(new Intent(Settings.ACTION_NETWORK_OPERATOR_SETTINGS));
- Device Policy Controller (DPC): एंटरप्राइज़ ऐप्स के लिए DevicePolicyManager
- रूटेड डिवाइस: Shell कमांड
svc data disable/enable(su आवश्यक)
सेटिंग्स खोलने का व्यावहारिक कोड
public void openMobileDataSettings() {
Intent intent = new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
} else {
// फॉलबैक
startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
}
}