android2.3 添加关闭数据开关功能:
1. 在调试完android2.3支持中兴MF210 3G模块后发现在android setting界面上关闭数据开关却不起实质作用,就是关闭数据开关只是关闭了通知栏上面的G显示,但对上网通断并没有影响,再打开数据开关,也只是打开了通知栏上的G显示。
2. 直接在终端用命令svc data disable 或svc data enable也是只能关闭或打开通知栏显示状态而已,但是在用命令关闭的时候,马上打开android内置浏览器会弹出“数据关闭无法连接网络”之类的,但是网络还是可以继续登陆上去。就是说关闭网络流程是对了,只是不知道是在哪可能有一个标识已经通知“网络已经关闭了”,但是执行关闭的操作却出错了或者说返回有错致使网络最后并没有被真正关闭。
3.修改移动数据开关默认状态
\frameworks\base\services\java\com\android\server\ConnectivityService.java
public boolean getMobileDataEnabled() {
enforceAccessPermission();
boolean retVal = Settings.Secure.getInt(mContext.getContentResolver(),
// Settings.Secure.MOBILE_DATA, 1) == 1;//数据开关默认打开
Settings.Secure.MOBILE_DATA, 0) == 1; //add by boardcon 数据开关默认关闭
if (DBG) Slog.d(TAG, "getMobileDataEnabled returning " + retVal);
return retVal;
}
4. 数据开关未能正常关闭分析:调试华为模块时有在Reference-ril.c中requestSetupDataCall函数成功后通过property_set("net.pppd.gprs", "start")函数开启了ppp连接,而假如要停止ppp连接则需要在响应RIL_REQUEST_DEACTIVATE_DATA_CALL请求中执行property_set("net.pppd.gprs", "stop")函数,而响应RIL_REQUEST_DEACTIVATE_DATA_CALL请求可在requestDeactivateDataCall函数中实现,但是通常android中并未实现requestDeactivateDataCall函数,若有需求则需要自行添加。
5.添加处理RIL_REQUEST_DEACTIVATE_DATA_CALL请求:
(1)\frameworks\base\telephony\java\com\android\internal\telephony\RIL.java 中,把
case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseVoid(p); break; 改成
case RIL_REQUEST_DEACTIVATE_DATA_CALL: ret = responseStrings(p); break;
(2)\hardware\ril\libril\Ril_commands.h 中,把
{RIL_REQUEST_DEACTIVATE_DATA_CALL, dispatchStrings, responseVoid},改成
{RIL_REQUEST_DEACTIVATE_DATA_CALL, dispatchStrings, responseStrings},
(3)\hardware\ril\reference-ril\Reference-ril.c 中,在
case RIL_REQUEST_SETUP_DATA_CALL:
requestSetupDataCall(data, datalen, t);
break;后添加
case RIL_REQUEST_DEACTIVATE_DATA_CALL:
requestDeactivateDataCall(t, data, datalen);
break;
(4)\hardware\ril\reference-ril\Reference-ril.c 中,在
static void requestSetupDataCall(void *data, size_t datalen, RIL_Token t)
{
……
……
error:
RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0);
at_response_free(p_response);
}添加:
void requestDeactivateDataCall(RIL_Token t, void *data, int length)
{
RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);
property_set("net.pppd.gprs", "stop");
//LOGE(" em210 net.pppd.gpr stop\n");
}
6. 编译烧写即可。