Launching mobile network settings screen programmatically
I want to launch mobile network settings screen, so that user can enable/disable 3g or data connection. Can anybody tell me which intent I need to use for starting activity. I used
Intent in = new Intent(android.provider.Settings.ACTION_NETWORK_OPERATOR_SETTIN开发者_如何转开发GS )
and
Intent in = new Intent(android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS ).
but both of these didn't work.
They won't work because there was a bug that was fixed I think in 2.3.
See https://review.source.android.com/#/c/22229/
You can bypass this using (for NETWORK_OPERATOR_SETTINGS)
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.android.phone", "com.android.phone.NetworkSetting");
startActivity(intent);
Replace NetworkSetting
with Settings
for DATA_ROAMING_SETTINGS
there's another similar solution described in Error opening mobile network settings menu
UPDATE
I recently tested this and it seems that this workaround is still necessary up to API level 15. Since API level 16 the intents in the question seem to work correctly.
public class SettingsScreen
{
protected static void _showSettingScreen(String intentStr)
{
try
{
Intent intent = new Intent(intentStr);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Reference.getAppContext().startActivity(intent);
}
catch (Exception e) {Reference.showToast(e.toString(), true);}
}
public static void showSettingScreen()
{
_showSettingScreen("android.settings.SETTINGS");
}
public static void showAPNScreen()
{
_showSettingScreen("android.settings.APN_SETTINGS");
}
public static void showLocationScreen()
{
_showSettingScreen("android.settings.LOCATION_SOURCE_SETTINGS");
}
public static void showSecurityScreen()
{
_showSettingScreen("android.settings.SECURITY_SETTINGS");
}
public static void showWifiScreen()
{
_showSettingScreen("android.settings.WIFI_SETTINGS");
}
public static void showBluetoothScreen()
{
_showSettingScreen("android.settings.BLUETOOTH_SETTINGS");
}
public static void showDateScreen()
{
_showSettingScreen("android.settings.DATE_SETTINGS");
}
public static void showSoundScreen()
{
_showSettingScreen("android.settings.SOUND_SETTINGS");
}
public static void showDisplayScreen()
{
_showSettingScreen("android.settings.DISPLAY_SETTINGS");
}
public static void showApplicationScreen()
{
_showSettingScreen("android.settings.APPLICATION_SETTINGS");
}
public static void showNetworkSettingScreen()
{
showDataRoamingScreen();
}
public static void showNetworkOperatorScreen()
{
if(Reference.getSystemOptions().VERSION_SDK_INT > 15)
{
_showSettingScreen("android.settings.NETWORK_OPERATOR_SETTINGS");
}
else
{
Intent intent=new Intent(android.provider.Settings.ACTION_SETTINGS);
intent.setClassName("com.android.phone", "com.android.phone.NetworkSetting");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Reference.getAppContext().startActivity(intent);
}
}
public static void showDataRoamingScreen()
{
if(Reference.getSystemOptions().VERSION_SDK_INT > 15)
{
_showSettingScreen("android.settings.DATA_ROAMING_SETTINGS");
}
else
{
Intent intent=new Intent(Settings.ACTION_DATA_ROAMING_SETTINGS);
ComponentName cName = new ComponentName("com.android.phone","com.android.phone.Settings");
intent.setComponent(cName);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Reference.getAppContext().startActivity(intent);
}
}
public static void showDataMobileScreen()
{
if(Reference.getSystemOptions().VERSION_SDK_INT > 15)
{
Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS);//android.provider.Settings.ACTION_SETTINGS //Intent.ACTION_MAIN
intent.setClassName("com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Reference.getAppContext().startActivity(intent);
}
else
{
showDataRoamingScreen();
}
}
public static void showNotificationScreen()
{
_showSettingScreen("android.settings.NOTIFICATION_SETTINGS");
}
public static void showBatterySaverScreen()
{
_showSettingScreen("android.settings.BATTERY_SAVER_SETTINGS");
}
public static void showNfcScreen()
{
_showSettingScreen("android.settings.NFC_SETTINGS");
}
public static void showInternalStorageScreen()
{
_showSettingScreen("android.settings.INTERNAL_STORAGE_SETTINGS");
}
public static void showDictionarySettingScreen()
{
_showSettingScreen("android.settings.USER_DICTIONARY_SETTINGS");
}
public static void showManageApplicationsScreen()
{
_showSettingScreen("android.settings.MANAGE_APPLICATIONS_SETTINGS");
}
public static void showManageAllApplicationsScreen()
{
_showSettingScreen("android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS");
}
public static void showMemoryCardScreen()
{
_showSettingScreen("android.settings.MEMORY_CARD_SETTINGS");
}
public static void showAirPlaneScreen()
{
if(Reference.getSystemOptions().VERSION_SDK_INT > 16)
{
if(Reference.getSystemOptions().BRAND.equalsIgnoreCase("Lenovo"))
{
showSettingScreen();
}
else
{
_showSettingScreen("android.settings.WIRELESS_SETTINGS");
}
}
else
{
_showSettingScreen("android.settings.AIRPLANE_MODE_SETTINGS");
}
}
public static void showWirelessScreen()
{
_showSettingScreen("android.settings.WIRELESS_SETTINGS");
}
public static void showWifiScreenSafe()
{
try
{
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new ComponentName("com.android.settings", "com.android.settings.wifi.WifiSettings");
intent.setComponent(cn);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Reference.getAppContext().startActivity(intent);
}
catch (Exception e)
{}
}
}
I'll try to answer, dispite of the fact this question was asked a few years ago. If what you're trying to do is to launch the "Data usage" screen. Try this snippet of code. It worked for me.
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.android.settings",
"com.android.settings.Settings$DataUsageSummaryActivity"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
There are two possibilities:
It brings up the overall network settings and from there the user can go to mobile networks
startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
As Zharf
suggested:
It brings up the Mobile network settings and from there the user can enable network
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.android.phone","com.android.phone.NetworkSetting");
startActivity(intent);
You can use this for Android API 29, which shows a small UI for toggling Wifi/mobile-data :
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
startActivity(Intent(android.provider.Settings.Panel.ACTION_INTERNET_CONNECTIVITY))
}
https://developer.android.com/reference/android/provider/Settings.Panel#ACTION_INTERNET_CONNECTIVITY
Focusing on Mobile-data settings:
startActivity(Intent(android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS))
Focusing on Wifi settings:
startActivity( Intent(android.provider.Settings.ACTION_WIFI_SETTINGS))
In my case (android 9) this intent lands directly on mobile data settings:
val intent = Intent(Settings.ACTION_DATA_ROAMING_SETTINGS)
context.startActivity(intent)
精彩评论