安卓中小区广播填加预制频段

最近在改一个客户需求,要求在小区广中预制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}
};

其中如果预置多个号码和name的话,需要加上属性NVRAM_ATTR_MULTI_DEFAULT
    {
        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 方法:

protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) {
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);
}
 3、在 CBMessageReceiverService.java:
 
1),导入以下包:
//modify/add by MTK begin date: 2015-3-03;time: 16:5:16
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_STATE = 33;
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;
private static final boolean isAddingDefaultChannel = false;
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);
}
}
}

4), 增加以下方法:
private void handleSIMStateChangedReceived(Intent intent) {
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;
 
 //SmsManager.getSmsManagerForSubscriber(subId).activateCellBroadcastSms(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;
}

}
3、/packages/providers/TelephonyProvider/src/com/android/providers/telephony/CbProvider.java
找到query方法中
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;
请注意:
L0和L1的sub id类型不一样,如果是L0则直接参考FAQ即可。
如果是L1,需要相应的改成int,参考下面几处
1、int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
2、private void addCustomChanneltoList(int mSubId,String channelName,int channelNum){
3、private boolean addChannelToDatabase(int mSubId,String channelName,int channelNum){
4、private boolean queryIfChannelInDatabase(int mSubId,String channelName,int channelNum){

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值