проблема возникает при включении или отключении мобильных данных в Android - PullRequest
0 голосов
/ 01 ноября 2018

У меня возникла исключительная ситуация при запуске этого источника:

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);
    }
}

Исключение:

java.lang.reflect.InvocationTargetException

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы пытаетесь получить и вызвать метод, используя отражение

 Method setMobileDataEnabledMethod =
 telephonyService.getClass().getDeclaredMethod("setDataEnabled",
 boolean.class);
 if (null != setMobileDataEnabledMethod) {
    setMobileDataEnabledMethod.invoke(telephonyService, mobileDataEnabled);

 }

java.lang.reflect.InvocationTargetException - это исключение общего назначения, которое выдается, если у вашего кода возникли проблемы с запуском кода отражения. Здесь это может означать две вещи:

  1. ваша программа не смогла найти метод, который вы ищете, что вполне возможно, так как setDataEnabled был добавлен в API 26 (ref: android docs )

Вам не следует полагаться на этот метод, если вы используете устройства с приложением api <26. </p>

  1. у вас нет разрешения вызывать этот метод. Для этого вам нужно иметь MODIFY_PHONE_STATE.

Вы можете позвонить <invocationTargetExceptionObject>.getCause(), чтобы получить реальное исключение за этим.

0 голосов
/ 01 ноября 2018

Я использую этот кусок кода в своем приложении. Это работает нормально для меня. Надеюсь, это поможет вам.

Для проверки, если данные включены или нет, вы можете позвонить getMobileDataState()

Для установки его на Включение или Отключение вы можете позвонить setMobileDataState(boolean). Передать true для включения мобильных данных и false для отключения мобильных данных

   /*Changing mobile data state -  True to turn it ON*/
public void setMobileDataState(boolean mobileDataEnabled) {

    try {
        final ConnectivityManager conman = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        final Class<?> conmanClass = Class.forName(conman.getClass().getName());
        final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
        iConnectivityManagerField.setAccessible(true);
        final Object iConnectivityManager = iConnectivityManagerField.get(conman);
        final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
        final Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);
        setMobileDataEnabledMethod.invoke(iConnectivityManager, mobileDataEnabled);
    }
    catch (Exception ex) {
        Toasty.error(Main.this, "Exception: "+ex.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

/* getting mobile data current state - returns True if ON*/
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) {
        Toasty.error(Main.this, "Exception: "+ex.getMessage(), Toast.LENGTH_SHORT).show();
    }
    return false;
}

Звоните сюда, куда хотите Включить мобильные данные

setMobileDataState(true);

Звоните сюда, куда хотите ВЫКЛЮЧИТЕ Мобильные данные

setMobileDataState(false);

Обновление:

Вам необходимо добавить разрешение MODIFY_PHONE_STATE в Manifest.xml

if (ActivityCompat.checkSelfPermission(context,
                    android.Manifest.permission.MODIFY_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {

     ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.MODIFY_PHONE_STATE}, 101);

     } else {
                setMobileDataEnabled(true);
     }

Затем в onRequestPermissionsResult

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == 101) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            setMobileDataEnabled(true);
        } else {
            Toasty.error(this, "Permission required to perform this action..", Toast.LENGTH_SHORT).show();

            showAlert();
        }
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

ShowAlertDialog

private void showAlert(){
                    AlertDialog.Builder dialog = new AlertDialog.Builder(this);
                    dialog.setCancelable(false);
                    dialog.setTitle("Permissions");
                    dialog.setMessage("Please allow this permission in Settings.");
                    dialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent();
                            intent.setAction(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                            Uri uri = Uri.fromParts("package", getPackageName(), null);
                            intent.setData(uri);
                            startActivity(intent);
                        }
                    });
                    dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            startActivity(new Intent(Settings.this, Settings.class));
                            finish();
                        }
                    });
                    dialog.show();
}
...