web-dev-qa-db-ja.com

プログラムによるモバイルデータの有効化と無効化に関する最新の更新

これは「重複」ですが、現在の回答は古く、ほとんどの場合、もはや適用されません。できれば、ここで更新されたリソースを提供して、この問題を調査したばかりのように、人の時間を節約することは良いことだと思いました。

私は、アプリ内からモバイルデータを有効または無効にできることに関する最新情報を確認するためにグーグルで探しました(wifiが利用できない場合)。

これは私が見つけることができる最新のものの1つです。
ウィジェットからLollipopのデータを無効/有効にできないことをご存知ですか?

それに対する答えがあります、私は引用します:

APIはありませんでした。開発者は、リフレクションを介してメソッドを呼び出すことで回避策を使用していました。 Googleがやったことは、この「エクスプロイト」を閉じることだけでした。

この議論もあります:

setMobileDataEnabled()apiの置き換え
2015年2月です。

ここにこれらの質問があります:

Androidでモバイルデータを無効にする方法

これは2010年に尋ねられ、最新の回答は2014年12月に1つのライナーで更新されました。

Androidプログラムで)でデータ接続を有効/無効にする

そして、これは2012年に受け入れられた答えです。

この問題の最新情報は何ですか?

まだできますか?

35
Yvette Colomb

ルート化された場合のみ機能する電話の回避策を使用します。

setMobileDataEnabledメソッドはConnectivityManagerから削除されましたが、この機能のためにgetDataEnabledに2つのメソッドsetDataEnabledTelephonyManagerが追加されました。

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

ただし、この許可(MODIFY_PHONE_STATE)をマニフェストファイルに追加する必要があります。追加しないと、SecurityExceptionが発生します。

11
Aritra Roy

彼らはMODIFY_PHONE_STATEパーミッションチェックを追加したので、非ルート電話では動作しません。この許可は、システムまたは署名アプリrefer - here にのみ付与されます。

PhoneInterfaceManager の以下のコードを確認してください。

   @Override
   public void setDataEnabled(boolean enable) {
       enforceModifyPermission();
       mPhone.setDataEnabled(enable);
   }
   private void enforceModifyPermission() {
       mApp.enforceCallingOrSelfPermission(Android.Manifest.permission.MODIFY_PHONE_STATE, null);
   }
15
rupesh jain

根ざした携帯電話を持っていない限り、プログラムでデータを有効または無効にすることはできないと思います。そのためには、システムまたは署名アプリにのみ与えられるMODIFY_PHONE_STATE権限を含める必要があります。

setMobileDataEnabled()メソッドは、リフレクションを介して呼び出しできなくなりました。 Android 2.1(API 7)からリフレクション経由でAndroid 4.4(API 19)まで呼び出し可能だったが、Android = 5.0以降、ルート化された電話であっても、setMobileDataEnabled()メソッドは呼び出しできません。

11
Chitra Lekha

2018年末まで早送り...

簡単な答えは、モバイルデータをプログラムで有効/無効にすることは許可されなくなったことです。これが私がいつも使っている解決策です。

このコードは、ユーザーが手動でモバイルデータを無効にできるシステムデータ使用設定画面を開きます。

public void enableDisableMobileData() {
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.Android.settings", "com.Android.settings.Settings$DataUsageSummaryActivity"));
    startActivity(intent);
}
7
user1506104

簡単な方法。

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
    }
}
1
Chathura