setMobileDataEnabled方法はもはやアンドロイドLの以降として呼び出し可能ではない

? ChuongPham @ | Original: StackOverFlow

私がログインしているhttps://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78084 Googleはリフレクション経由もはや呼び出し可能になっていなけれsetMobileDataEnabled()メソッドに関する付き。アンドロイド2.1 (API 7 )は反射を経由して4.4 (API 19) Androidのためにあるのでそれは呼び出し可能でしたが、でも根にAndroidのLのように、後に、 「 ____ 」メソッドは呼び出すことはできません。

公式の応答は、問題が「閉」とステータスが「 WorkingAsIntended 」に設定されていることである。 Googleのシンプルな説明は次のとおりです。

彼らは安定ではなく、予告なしに消える可能性があるため、プライベートAPIはプライベートです。

はい、 ____ Googleは、私たちは、 Androidがscene-に来た前であってもmethod-隠さ呼び出すためにリフレクションを使用しての危険性を認識していますが、 「同じ結果を達成するため、もしあれば、代替品への、よりソリッドな答えを提供する必要がある" 。私のようにGoogleの決定に不快にされている場合( 、その後にログインhttps://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78084それは、できるだけ多くのGoogleが彼らの方法の誤りを知っているように主演。 )

だから、あなたに私の質問は:されています私たちは行き止まりでそれをプログラムで有効またはAndroidデバイス上でモバイルネットワーク機能を無効に来るとき?グーグルからのこの強引なアプローチは何とか私とよく座っていません。あなたは、Android 5.0 (ロリポップ)のためと越えて回避策を持っている場合、私はこのスレッドであなたの答え/議論を聞くのが大好きだ。

私は「 ____ 」メソッドが利用可能であるかどうかを確認するために以下のコードを使用している:

setMobileDataEnabled()

しかし、そうではありません。

UPDATE :現在、それは、デバイスが根ざしている場合は、モバイルネットワークを切り替えることが可能です。モバイルネットワークを切り替え普遍的な方法がないので、しかし、非根ざしデバイス用に、それはまだ調査プロセスだ。



Top 5 Respuesta

1Muzikant @

ちょうどより洞察力と、(根ざしたデバイスとシステムアプリケーションのための)可能な解決策いくつかを共有することができます。

Solution #1

それはのように思える「 ____ 」メソッドは、もはや「 ____ 」に存在し、この機能は「 ____ 」二つの方法で「 ____ 」と「 __ 」に移された。 私はあなたが以下のコードで見ることができるように反射でこれらのメソッドを呼び出すみました:

setMobileDataEnabled()

コードを実行するときには、その「 ____ 」 「 ____ 」と述べを得る

だから、そう、これは内部APIを意図し、変更されず、以前のバージョンでそのハックを使用アプリに使用できなくなりました。

(暴言を開始:恐ろしいandroid.permission.MODIFY_PHONE_STATE許可...エンド暴言こと) 。

良いニュースは、場合にあなたがMODIFY_PHONE_STATE許可を(唯一のシステムアプリはそれを使用することができます)を取得することができるアプリを構築しているということです、あなたはモバイルデータ状態を切り替えるには、上記のコードを使用することができます。

Solution #2

モバイルデータの現在の状態をチェックするには、 "____ 」 (公式ドキュメントに記載されていない)の「 ____ 」フィールドを使用することができます。

setMobileDataEnabled()

そして、あなたが根ざしデバイス上でシェルコマンドを使用することができ、モバイルデータを無効/有効にするために(ちょうど基本的なテストは、コメント内の任意のフィードバックは歓迎ですので、実行される) 。 あなたは、 rootとして次のコマンド(複数可) ( 1 = 0 =無効、有効にする)を実行することができます。

final Class<?> conmanClass = Class.forName(context.getSystemService(Context.CONNECTIVITY_SERVICE).getClass().getName());
final Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
iConnectivityManagerField.setAccessible(true);
final Object iConnectivityManager = iConnectivityManagerField.get(context.getSystemService(Context.CONNECTIVITY_SERVICE));
final Class<?> iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
final Method[] methods = iConnectivityManagerClass.getDeclaredMethods();
for (final Method method : methods) {
    if (method.toGenericString().contains("set")) {
        Log.i("TESTING", "Method: " + method.getName());
    }
}


2ChuongPham @

Muzikantの溶液# 2を拡張するには、誰かが(私は現在、 1を持たないように)のAndroid 5.0根ざしデバイス上で、以下のソリューションを試してみて、それが動作するか動作しない場合は私に知らせてくださいすることができます。

有効またはモバイルデータを無効にするには、試してみてください。

setMobileDataEnabled

注: 「 ____"変数"は____ 」でAndroidのAPI 21ソースコードで見つけることができますとして宣言されています。

ConnectivityManager

「 ____"テント"が____ 」でAndroidのAPI 21ソースコードで見つけることができるとのように宣言されている間:

TelephonyManager

UPDATE 1 :あなたがあなたのAndroidアプリケーションで上記のJavaコードを実装しない場合は、あなたが実行できる「 ____ 」のフォローとしてシェル( Linux)またはコマンド·プロンプト( Windowsの場合)経由でコマンド:

getDataEnabled

注: 「 ____ 」 「 ____ 」ディレクトリにあります。 「 ____ 」コマンドは、後にアンドロイド4.2以降でサポートされています。古いAndroidのバージョンは「 ____ 」エラーを報告します。

アップデート2 :根ざしたアンドロイド5+デバイスでモバイルネットワークを切り替えるする別の方法は、文書化されていない「 ____ 」シェルコマンドを使用することであろう。以下のコマンドは、モバイルネットワークを切り替えるためにADBを介して実行することができます:

setDataEnabled

Or just:

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

注: 「 ____ 」 「 ____ 」ディレクトリにあります。あなたがADBを使用したくない場合は、アプリで「 ____ 」経由でメソッドを実行する。

3rgruet @

あなたは、しない「 ____ 」 1に「 ____ 」フォルダに.apkのを移動することで、アプリの「システム」を作ればMuzikantから溶液# 1が動作しているようです( @jaumard :あなたのテストが機能しなかった理由を多分それはだ) 。

.apkのが「 ____ 」フォルダ内にあるとき、それはマニフェストに「 ____ 」権限恐ろしいをリクエストに成功することができ、 「 ____ 」 「 ____ 」と呼ぶと。

ネクサス5 /アンドロイド5.0で動作する、少なくとも。 .apkのパーマは「 ____ 」です。あなたは変更が考慮されるために、多分これを避けることができたデバイスを再起動する必要がある - http://stackoverflow.com/questions/26487750/android-5-0-lollipop-force-rescan-of-system-を参照してください。 PRIV -アプリを。

4Sahil Lombar @

Muzikant溶液# 2を修正するには

SecurityException

モバイルデータのための唯一のトグルを有効にしても、接続に何もしませんか。唯一のトグルが有効になっています。ためには、データが使用して動作させるために

Neither user 10089 nor current process has android.permission.MODIFY_PHONE_STATE.

のための余分としてエラーが発生します

mobile_data

--ezパラメータはブールのために使用される文字列オブジェクトが必要です。 REF : PhoneGlobals.java &#038 ; PhoneConstants.java 。使用した後、接続や余分使用して、コマンドとして接続

Settings.Global

まだデータを有効にするには何でもするdoesntの。