android - superado - quitar advertencia de uso de datos samsung
Última actualización sobre habilitar y deshabilitar datos móviles mediante programación (5)
A menos que tenga un teléfono rooteado, no creo que pueda habilitar y deshabilitar los datos mediante programación porque para hacerlo tenemos que incluir el permiso MODIFY_PHONE_STATE que solo se otorga a las aplicaciones de sistema o firma.
setMobileDataEnabled()
método
setMobileDataEnabled()
ya no se puede llamar a través de la reflexión.
Fue invocable desde Android 2.1 (API 7) a Android 4.4 (API 19) mediante reflexión, pero a partir de Android 5.0 y posterior, incluso con los teléfonos rooteados, el método
setMobileDataEnabled()
no es invocable.
Aunque este es un "duplicado", las respuestas actuales están desactualizadas y, en su mayoría, ya no se aplican. Pensé que sería bueno proporcionar un recurso actualizado aquí, si es posible, para ahorrarle tiempo a la gente, como acabo de hacer, investigando este problema.
He estado buscando en Google para ver la información más reciente sobre cómo habilitar y deshabilitar datos móviles desde una aplicación (si el wifi no está disponible).
Esta es una de las últimas cosas que puedo encontrar:
¿Sabía que ya no puede deshabilitar / habilitar datos en lollipop desde un widget?
Hay una respuesta a eso, cito:
Nunca hubo una API para ello. Los desarrolladores estaban utilizando una solución alternativa llamando al método a través de Reflections. Todo lo que Google hizo fue cerrar este "exploit".
También hay esta discusión:
Reemplazo para la API setMobileDataEnabled ()
Que es febrero de 2015.
Aquí están estas preguntas:
Cómo deshabilitar datos móviles en Android
Esto se hizo en 2010 y la última respuesta se actualizó con una frase en diciembre de 2014.
Habilitar / deshabilitar la conexión de datos en Android mediante programación
Y esto, la respuesta aceptada en 2012.
¿Qué es lo último en este tema?
¿Todavía se puede hacer?
Avance rápido hasta el final de 2018 ...
La respuesta breve es que ya no está permitido habilitar / deshabilitar datos móviles mediante programación. Aquí está la solución que uso todo el tiempo.
Este código abre la pantalla de configuración de uso de datos del sistema, donde el usuario puede deshabilitar los datos móviles manualmente.
public void enableDisableMobileData() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
startActivity(intent);
}
Método fácil
public void setMobileDataState(boolean mobileDataEnabled)
{
try{
ConnectivityManager dataManager;
dataManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
Method dataMtd = ConnectivityManager.class.getDeclaredMethod("setMobileDataEnabled", boolean.class);
dataMtd.setAccessible(true);
dataMtd.invoke(dataManager, mobileDataEnabled);
}catch(Exception ex){
//Error Code Write Here
}
}
No funcionará en teléfonos
no rooteados
ya que agregaron la
MODIFY_PHONE_STATE
permisos
MODIFY_PHONE_STATE
.
Este permiso solo se otorga a las aplicaciones de firma o del sistema que se mencionan
here
.
Verifique el siguiente código de PhoneInterfaceManager :
@Override
public void setDataEnabled(boolean enable) {
enforceModifyPermission();
mPhone.setDataEnabled(enable);
}
private void enforceModifyPermission() {
mApp.enforceCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE, null);
}
Utilizo una solución alternativa que solo funciona para teléfonos rooteados .
El método
setMobileDataEnabled
se eliminó del
ConnectivityManager
pero se agregaron dos métodos
getDataEnabled
y
setDataEnabled
al
TelephonyManager
para esta funcionalidad.
public void setMobileDataState(boolean mobileDataEnabled)
{
try
{
TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method setMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("setDataEnabled", boolean.class);
if (null != setMobileDataEnabledMethod)
{
setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);
}
}
catch (Exception ex)
{
Log.e(TAG, "Error setting mobile data state", ex);
}
}
public boolean getMobileDataState()
{
try
{
TelephonyManager telephonyService = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
Method getMobileDataEnabledMethod = telephonyService.getClass().getDeclaredMethod("getDataEnabled");
if (null != getMobileDataEnabledMethod)
{
boolean mobileDataEnabled = (Boolean) getMobileDataEnabledMethod.invoke(telephonyService);
return mobileDataEnabled;
}
}
catch (Exception ex)
{
Log.e(TAG, "Error getting mobile data state", ex);
}
return false;
}
Pero debe agregar este permiso ( MODIFY_PHONE_STATE ) al archivo de manifiesto, de lo contrario obtendrá una excepción de seguridad.