從Android L及更高版本開始,setMobileDataEnabled方法不再可調(diào)用我已經(jīng)向Google報(bào)告了問題78084,因?yàn)樵搒etMobileDataEnabled()方法不再可以通過反射調(diào)用。它可以通過反射從Android 2.1(API 7)到Android 4.4(API 19)進(jìn)行調(diào)用,但是從Android L及更高版本開始,即使使用root,該setMobileDataEnabled()方法也不可調(diào)用。官方回應(yīng)是問題是“已關(guān)閉”,狀態(tài)設(shè)置為“WorkingAsIntended”。谷歌的簡(jiǎn)單解釋是:私有API是私有的,因?yàn)樗鼈儾环€(wěn)定,可能會(huì)在沒有通知的情況下消失。是的,谷歌,我們意識(shí)到使用反射調(diào)用隱藏方法的風(fēng)險(xiǎn) - 甚至在Android出現(xiàn)之前 - 但是你需要提供一個(gè)更加可靠的答案,如果有的話,可以實(shí)現(xiàn)相同的結(jié)果setMobileDataEnabled()。(如果您對(duì)我的決定感到不滿,請(qǐng)登錄問題78084,并盡可能多地將其加注,讓Google知道他們的錯(cuò)誤。)所以,我的問題是:在Android設(shè)備上以編程方式啟用或禁用移動(dòng)網(wǎng)絡(luò)功能時(shí),我們是否處于死胡同?谷歌的這種嚴(yán)厲的方法在某種程度上并不適合我。如果您有Android 5.0(Lollipop)及其他方法的解決方法,我很樂意聽到您在此主題中的回答/討論。我使用下面的代碼來查看該setMobileDataEnabled()方法是否可用: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());
}}但事實(shí)并非如此。更新:目前,如果設(shè)備已植根,則可以切換移動(dòng)網(wǎng)絡(luò)。但是,對(duì)于非根設(shè)備,它仍然是一個(gè)調(diào)查過程,因?yàn)闆]有通用的方法來切換移動(dòng)網(wǎng)絡(luò)。
從Android L及更高版本開始,setMobileDataEnabled方法不再可調(diào)用
慕田峪9158850
2019-08-16 14:36:03