1

私のアプリには、wifi 用とモバイル データ用の 2 つのトグル ボタンがあります。アプリケーションの起動時に WiFi がオンの場合、トグル ボタンがオンになります。ただし、モバイルデータがオンの場合、トグルボタンはそれを表示せず、灰色のままです (WiFi で何が起こっていても)。押すと緑色になり、モバイルデータはまだオンになっています...理由はありますか?

gprs.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                try {
                    turnData(isChecked);  //Klasa za ukljucivanje gprsa
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        });

そして、モバイルデータのクラス

void turnData(boolean ON) throws Exception {
Log.i("version:", "Found Gingerbread+");
       final ConnectivityManager conman = (ConnectivityManager) getApplicationContext().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, ON);
}
4

2 に答える 2

1

なぜこれにリフレクションを使用しているのですか?もし私が Google だったら (私はそうではありません)、低レベル システムで F へのリフレクションを使用できないように、API に保護を配置します。この種のことを反映できるようにすると、システムが非常に脆弱になり、誰も使用できなくなります。

ソース ツリーを見ると、IConnectivityManager が Java クラスでさえなく、aidl リソースであることがわかります。つまり、おそらくネイティブ コード (C/C++) によってサポートされているため、そこでリフレクションが機能するかどうかはわかりません。

setMobileDataEnabledアクセスしようとしているメソッドを見ると、 ConnectivityManagerソースで公開されています。

/**
 * Sets the persisted value for enabling/disabling Mobile data.
 *
 * @param enabled Whether the user wants the mobile data connection used
 *            or not.
 * @hide
 */
public void setMobileDataEnabled(boolean enabled) {
    try {
        mService.setMobileDataEnabled(enabled);
    } catch (RemoteException e) {
    }
}

私はそれを使用していませんが、それを使用するだけでなく、基礎となるサービスまでハッキングしようとするのはなぜですか?

于 2013-08-07T13:41:37.540 に答える
0

あなたはこれを試すことができます、それはキットカットで私のために働きます.

public boolean invokeMethod(String methodName, Object[] args) throws Exception {
    ConnectivityManager mcm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
    Class ownerClass = mcm.getClass();
    Class[] argsClass = null;
    if (args != null) {
        argsClass = new Class[1];
        argsClass[0] = args.getClass();
    }
    Method method = ownerClass.getMethod(methodName, argsClass);
    return (Boolean)method.invoke(mcm, args);
}

public Object invokeBooleanArgMethod(String methodName, boolean value) throws Exception {
    ConnectivityManager mcm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    Class ownerClass = mcm.getClass();
    Class[]  argsClass = new Class[1];
    argsClass[0] = boolean.class;
    Method method = ownerClass.getMethod(methodName,argsClass);
    return method.invoke(mcm, value);
}

/* use these two method like these */
Object[] arg = null;
try {
    boolean isMobileDataEnable = invokeMethod("getMobileDataEnabled", arg);
    if(!isMobileDataEnable){
        invokeBooleanArgMethod("setMobileDataEnabled", true);
    }
} catch (Exception e) {
    e.printStackTrace();
}

また、 にAndroidManifest.xml追加する必要があります

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
于 2014-09-16T06:09:37.527 に答える