最近在改一个客户需求,要求在小区广中预制50频段,这里要先说明一下,小区广播在我们国内是不支持的,所以测试的话要准备专门的实验室测试环境,这里我只阐述下添加小区广播的方法。
小区广播是归属在MMS中的功能,预制频段的方法有两种,一种是在model中预制,具体如下:
1、custom\service\nvram\nvram_data_items.c 预设channel:
在里面添加如下代码: static nvram_ef_cb_ch_info_struct const NVRAM_EF_CB_CH_INFO_DEFAULT[] =
{
{
{0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF},
{
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
},
{0xFF, 0xFF, 0xFF}, //All channel in the ME is subsribe;
{0xFF, 0xFF, 0xFF},
{
0x3200, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF
}
},
};//0X3200为频道50。0X3200为低字节序,所以值为0x0032。即为50
2. 在数组logical_data_item_table_core中找到以下代码段并修改为:
,{
NVRAM_EF_CB_CH_INFO_LID,
NVRAM_EF_CB_CH_INFO_SIZE,
NVRAM_EF_CB_CH_INFO_TOTAL,
//NVRAM_EF_FF_DEFAULT,
MVRAM_NORMAL ((kal_uint8*)NVRAM_EF_CB_CH_INFO_DEFAULT),
NVRAM_ATTR_AVERAGE,
NVRAM_CATEGORY_USER| NVRAM_CATEGORY_SHADOW,
NVRAM_CATEGORY_USER| NVRAM_CATEGORY_SHADOW |
NVRAM_CATEGORY_FACTORY,
"MT0z",
VER(NVRAM_EF_CB_CH_INFO_LID),
"CB Channel Info\0",
NVRAM_RESERVED_VALUE
}
3. 在文件Nvram_common_config.c中修改CB name的default值:
static nvram_ef_srv_cbs_chnl_name_struct const NVRAM_EF_SRV_CBS_CHNL_NAME_DEFAULT[] =
{
0x0032, /*注意mid要与NVRAM_EF_CB_CH_INFO_DEFAULT中的channel id一致,这里为高字节序*/ {'M','T','K','C','B',0}
};
NVRAM_EF_SRV_CBS_CHNL_NAME_LID,
NVRAM_EF_SRV_CBS_CHNL_NAME_TOTAL,
NVRAM_EF_SRV_CBS_CHNL_NAME_SIZE,
NVRAM_NORMAL(NVRAM_EF_SRV_CBS_CHNL_NAME_DEFAULT),
NVRAM_CATEGORY_USER,
NVRAM_ATTR_MULTIREC_READ|NVRAM_ATTR_MULTI_DEFAULT,
"MPC5",
VER(NVRAM_EF_SRV_CBS_CHNL_NAME_LID)
},
以上是从他人处copy过来的,由于本人不太懂硬件,这里不细讲model添加方法,第二种方法是通过软件添加的方式,MTK推荐的方式是通过Model的方式添加,但是软件添加也是一种选择,软件添加方式如下:
1、mms应用下的AndroidManifest.xml里,增加接收android.intent.action.SIM_STATE_CHANGED:
在<receiver android:name=".transaction.CBMessageReceiver" 这个receiver中添加<!-- for add default cb channel -->
<intent-filter>
<action android:name="android.intent.action.SIM_STATE_CHANGED" />
</intent-filter>
这样做的目的是为了在SIM卡改变时把50频段预制进新的SIM卡,防止因SIM卡换置而导致50频段消失,用于监听SIM状态。
2、CBMessageReceiver.java里修改 CBMessageReceiver.onReceiveWithPrivilege 方法:
MmsLog.d(MmsApp.TXN_TAG,
"CBMessageReceiver: onReceiveWithPrivilege(). Slot Id = "
+ Long.toString(intent.getLongExtra(PhoneConstants.SUBSCRIPTION_KEY,
SubscriptionManager.INVALID_SUB_ID), 10) + ", Action = "
+ intent.getAction() + ", result = " + getResultCode());
intent.setClass(context, CBMessageReceiverService.class);
Log.d(" CBMessageReceiver ", " CBMessageReceiver.onReceiveWithPrivilege 97 ");
if(!TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())){
intent.putExtra("result", getResultCode());
}
beginStartingService(context, intent);
}
import android.provider.Telephony;
import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
import android.content.ContentValues;
import android.database.Cursor;
import android.util.Log;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.TelephonyIntents;
import android.telephony.SmsManager;
import android.provider.Telephony.Sms.Intents;
//import com.mediatek.telephony.SmsManagerEx;
import com.android.internal.telephony.PhoneConstants;
2),增加以下属性定义:
private static final int MESSAGE_SET_CONFIG = 32;
private static final String KEYID = "_id";
private static final String NAME = "name";
private static final String NUMBER = "number";
private static final String ENABLE = "enable";
private static final String SUBID = "sub_id";
private static final Uri CHANNEL_URI = Uri.parse("content://cb/channel");
private static final int EVENT_RETRY_ADD_CHANNEL_TIME_OUT = 101;
3)修改CBMessageReceiverService.ServiceHandler.handleMessage:
public void handleMessage(Message msg) {
int serviceId = msg.arg1;
Intent intent = (Intent) msg.obj;
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.ServiceHandler.handleMessage 185 serviceId="+serviceId+" msg.what="+msg.what+" intent="+intent); // modify by mtk_debug 2015-3-19;
if (intent != null) {
String action = intent.getAction();
// NEED Replace with CB ACTION
if (Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) {
handleCBMessageReceived(intent);
}
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.ServiceHandler.handleMessage 162 "); // modify by mtk_debug 2015-3-05;
if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(intent.getAction())){
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.ServiceHandler.handleMessage receiver a ACTION_SIM_STATE_CHANGED 164 "); // modify by mtk_debug 2015-3-05;
synchronized(this){
handleSIMStateChangedReceived(intent);
}
}
}
// NOTE: We MUST not call stopSelf() directly, since we need to
// make sure the wake lock acquired by AlertReceiver is released.
if(!isAddingDefaultChannel){
CBMessageReceiver.finishStartingService(CBMessageReceiverService.this, serviceId);
}
}
}
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.handleSIMStateChangedReceived 191 "); // modify by mtk_debug 2015-3-05;
long subId = intent.getLongExtra(PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.INVALID_SUB_ID);
String stateExtra = intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE);
// boolean stateExtra = intent.getBooleanExtra("ready",false);
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.handleSIMStateChangedReceived 214 stateExtra="+stateExtra);
if(IccCardConstants.INTENT_VALUE_ICC_READY.equals(stateExtra)){
// if(stateExtra){
if(queryIfChannelInDatabase(subId,"Channel1",50))
{
Log.d(TAG, " CBMessageReceiverService.handleSIMStateChangedReceived subid="+subId+" channel1 50 in database");
isAddingDefaultChannel=false;
}else{
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.handleSIMStateChangedReceived subid="+subId+" channel1 50 not in database 699 "); // modify by mtk_debug 2015-3-02;
if(SmsManager.getSmsManagerForSubscriber(subId).activateCellBroadcastSms(true))/*这里会先把CB打开*/
Log.d(TAG, " CBMessageReceiverService.handleSIMStateChangedReceived addCustomChanneltoList(subId,Channel1,50);");
addCustomChanneltoList(subId,"Channel1",50);
isAddingDefaultChannel=false;
}else{
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.handleSIMStateChangedReceived activateCellBroadcastSms fail 716 "); // modify by mtk_debug 2015-3-05;
//add retry
if (!mServiceHandler.hasMessages(EVENT_RETRY_ADD_CHANNEL_TIME_OUT)) {
Message msg = mServiceHandler.obtainMessage(EVENT_RETRY_ADD_CHANNEL_TIME_OUT,intent);
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.handleSIMStateChangedReceived send retry message 235 "); // modify by mtk_debug 2015-3-19;
mServiceHandler.sendMessageDelayed(msg, 2000);
isAddingDefaultChannel=true;
}
}
}
}
}
private void addCustomChanneltoList(long mSubId,String channelName,int channelNum){
Log.d(TAG, "addCustomChanneltoList: mSubId=" + mSubId
+ ", channelName= " + channelName + ", channelNum= " + channelNum);
SmsBroadcastConfigInfo[] objectList = new SmsBroadcastConfigInfo[1];
objectList[0] = new SmsBroadcastConfigInfo(channelNum,channelNum, -1, -1, true);
Log.d(TAG, "addCustomChanneltoList: setCellBroadcastSmsConfig");
//SmsManagerEx.getDefault().setCellBroadcastSmsConfig(objectList, objectList, mSimId);
boolean isSetConfigSuccess = SmsManager.getSmsManagerForSubscriber(mSubId).setCellBroadcastSmsConfig(objectList, objectList);
if(isSetConfigSuccess){
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.addCustomChanneltoList set channel " +channelNum +" success 784 "); // modify by mtk_debug 2015-3-05;
addChannelToDatabase(mSubId,channelName,channelNum);
}else{
Log.d(" CBMessageReceiverService ", " CBMessageReceiverService.addCustomChanneltoList set channel "+ channelNum +" failed 786 "); // modify by mtk_debug 2015-3-05;
}
Log.d(TAG, " CBMessageReceiverService addCustomChanneltoList: function end");
}
private boolean addChannelToDatabase(long mSubId,String channelName,int channelNum){
// ClearChannel();
Log.d(TAG, "addChannelToDatabase: mSubId=" + mSubId
+ ", channelName= " + channelName + ", channelNum= " + channelNum);
String[] projection = new String[] { NUMBER, SUBID};
String SELECTIONNum = "(" + NUMBER + " = " + channelNum + ")";
String SELECTIONid = "(" + SUBID + " = " + mSubId + ")";
Cursor cursornum = null;
Cursor cursorid = null;
Cursor cursorzz = this.getContentResolver().query(CHANNEL_URI,
projection,
NUMBER + " = ? AND " +
SUBID + " = ?",
new String[] {String.valueOf(channelNum), String.valueOf(mSubId)},
null);
Log.d(TAG, "addChannelToDatabase: cursor.getCount"+cursorzz.getCount());
if(cursorzz.getCount() == 0){//if ((cursornum.getCount() == 0)&&(cursorid.getCount() == 0)){
Log.d(" CBMessageReceiverService ", " SmsReceiverService.addChannelToDatabase add mSubId=" + mSubId
+ ", channelName= " + channelName + ", channelNum= " + channelNum +"to database"); // modify by mtk_debug 2015-3-05;
ContentValues values = new ContentValues();
values.put(NAME,channelName);
values.put(NUMBER, channelNum);
values.put(ENABLE, true); //请注意:如果贵司希望预置的频道默认为disable状态,把true改成false即可
values.put(SUBID, mSubId);
try {
//if(mSimId==PhoneConstants.SUB1){
this.getContentResolver().insert(CHANNEL_URI, values);
//}else if(mSimId==PhoneConstants.SUB2){
// this.getContentResolver().insert(CHANNEL_URI1, values);
//}
} catch (Exception e){
Log.d(" CBMessageReceiverService ", " SmsReceiverService.addChannelToDatabase exception 828 "); // modify by mtk_debug 2015-3-05;
//cursornum.close();
//cursorid.close();
cursorzz.close();
return false;
}
//cursornum.close();
// cursorid.close();
cursorzz.close();
return true;
}
else{
//cursornum.close();
//cursorid.close();
cursorzz.close();
return false;
}
}
private boolean queryIfChannelInDatabase(long mSubId,String channelName,int channelNum){
Log.d(TAG, "queryIfChannelInDatabase: mSubId=" + mSubId
+ ", channelName= " + channelName + ", channelNum= " + channelNum);
String[] projection = new String[] { NUMBER, SUBID};
String SELECTIONNum = "(" + NUMBER + " = " + channelNum + ")";
String SELECTIONid = "(" + SUBID + " = " + mSubId + ")";
Cursor cursornum = null;
Cursor cursorid = null;
Cursor cursorzz = this.getContentResolver().query(CHANNEL_URI,
projection,
NUMBER + " = ? AND " +
SUBID + " = ?",
new String[] {String.valueOf(channelNum),String.valueOf(mSubId)},
null);
if(cursorzz != null&&cursorzz.getCount() > 0){
//if ((cursornum.getCount() != 0)&&(cursorid.getCount() != 0)){
Log.d(TAG, "queryIfChannelInDatabase: cursor.getCount"+cursorzz.getCount());
cursorzz.close();
return true;
}else{
cursorzz.close();
Log.d(TAG, "queryIfChannelInDatabase: return false");
return false;
}
}
case URL_CHANNEL: qb.setTables(CbDatabaseHelper.CHANNEL_TABLE); qb.appendWhere("(sub_id = " + SmsProvider.getSubIdFromUri(url) + ")"); break;修改成:
case URL_CHANNEL: qb.setTables(CbDatabaseHelper.CHANNEL_TABLE); if (selection == null || !selection.contains("sub_id")) { qb.appendWhere("(sub_id = " + SmsProvider.getSubIdFromUri(url) + ")"); } break;