Android Message Learning from MTK
您在设置要显示的联系人时,请确认是否是设置成只显示Phone中的联系人,还是显示手机/移动卡中的联系人。
另外,请按以下检查步骤查看各处的filter是否正确:
(1). 设置要显示的联系人时,对应的可在AccountFilterActivity.java文件中的onItemClick()方法中
final ContactListFilter filter = (ContactListFilter ) view.getTag;
语句处下断点或加log,查看此处获得的filter信息是否正确。打印log时可以将filter中的账户名字和账户类型打印出来。
(2). 在ContactBrowseListFragment.java文件的configureAdapter()方法中
adapter.setFilter()处设置断点或加log,查看账户信息。
此处会调用ContactEntryListAdapter.java文件的setFilter()方法设置DefaultContactListAdapter的filter,即联系人列表的过滤条件。
(3). 在ContactEntryListAdapter.java文件的setFilter()中,可以下断点或加log查看设置的mFilter的accountName和accountType。
(4). 在DefaultContactListAdapter.java文件的configureLoader()方法中
ContactListFilter filter = getFilter();
语句后也可以打印log,查看得到的filter的信息是否是正常的。
且该query的URI是content://com.android.contacts/data/phones, 这样会影响到acroe进程memory被吃掉。
泄漏到一定程度,可能会导致其它查询contacts的进程的query变慢,或者是无返回结果等。贵司可以先将
该程序移除掉,看能否复现该问题。还是需要贵司提供下db 文件来确定anr 的正真原因。
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: PossibleCursorLeak:content://com.android.contacts/data/phones,QueryCounter:12
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: at android.content.ContentResolver.query(ContentResolver.java:399)
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: at android.content.ContentResolver.query(ContentResolver.java:316)
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: at com.tencent.tmsecure.module.aresengine.DefaultSysDao$b.b(Unknown Source)
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: at com.tencent.tmsecure.module.aresengine.DefaultSysDao.getAllContact(Unknown Source)
03-22 16:01:00.683 3511 9601 E CursorLeakDetecter: at blx.run(Unknown Source)
1. UMTS Release 3GPP baseline Release :R7
2. UMTS max downlink data rate :21Mbps
3. UMTS max uplink data rate :5.6Mbps
4. Cell Broadcast :Yes
5. Fast Dormancy :Yes
6. GSM Release 3GPP baseline Release :R5
7. GSM Frequncy Bands
7.1 GSM 850 Power Class :Power class 4
7.2 GSM 900 Power Class :Power Class 4
7.3 GSM 1800 Power Class :Power Class 1
7.4 GSM 1900 Power Class :Power Class 1
8. GSM Security
8.1 GSM A5/3 :Yes
8.2 Supported GEA :GEA1,2,3
因为这些信息是保存在DataBase中的,去操作DB是需要storage支持的,
如果storage很低,可能会发生一些SQLite 相关的Exception,导致load 数据失败,
从而APP看不见数据,但并不表示这些数据被删除了,只是load 不出来而已。
NetworkStatsService.java:
private void registerPollAlarmLocked() {
try {
if (mPollIntent != null) {
mAlarmManager.remove(mPollIntent);
} mPollIntent = PendingIntent.getBroadcast(
mContext, 0, new Intent(ACTION_NETWORK_STATS_POLL), 0); final long currentRealtime = SystemClock.elapsedRealtime();
mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime,
mSettings.getPollInterval(), mPollIntent);
} catch (RemoteException e) {
// ignored; service lives in system_server
}
} public void systemReady() {
...
// listen for periodic polling events
final IntentFilter pollFilter = new IntentFilter(ACTION_NETWORK_STATS_POLL);
mContext.registerReceiver(mPollReceiver, pollFilter, READ_NETWORK_USAGE_HISTORY, mHandler);
...
} private BroadcastReceiver mPollReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// on background handler thread, and verified UPDATE_DEVICE_STATS
// permission above.
performPoll(FLAG_PERSIST_ALL); // verify that we're watching global alert
registerGlobalAlert();
}
}; private void performPoll(int flags) {
synchronized (mStatsLock) {
mWakeLock.acquire(); // try refreshing time source when stale
///M: USE_TRUESTED_TIME
if (mTime.getCacheAge() > mSettings.getTimeCacheMaxAge() && USE_TRUESTED_TIME ) {
mTime.forceRefresh();
} try {
performPollLocked(flags);
} finally {
mWakeLock.release();
}
}
} /**
* Periodic poll operation, reading current statistics and recording into
* {@link NetworkStatsHistory}.
*/
private void performPollLocked(int flags) {
if (!mSystemReady) return;
if (LOGV) Slog.v(TAG, "performPollLocked(flags=0x" + Integer.toHexString(flags) + ")" ); final long startRealtime = SystemClock.elapsedRealtime(); final boolean persistNetwork = (flags & FLAG_PERSIST_NETWORK) != 0;
final boolean persistUid = (flags & FLAG_PERSIST_UID) != 0;
final boolean persistForce = (flags & FLAG_PERSIST_FORCE) != 0; // TODO: consider marking "untrusted" times in historical stats
///M: USE_TRUESTED_TIME
final long currentTime = (mTime.hasCache() && USE_TRUESTED_TIME) ? mTime.currentTimeMillis()
: System.currentTimeMillis(); try {
// snapshot and record current counters; read UID stats first to
// avoid overcounting dev stats.
final NetworkStats uidSnapshot = getNetworkStatsUidDetail();
final NetworkStats xtSnapshot = mNetworkManager.getNetworkStatsSummaryXt();
final NetworkStats devSnapshot = mNetworkManager.getNetworkStatsSummaryDev(); mDevRecorder.recordSnapshotLocked(devSnapshot, mActiveIfaces, currentTime);
mXtRecorder.recordSnapshotLocked(xtSnapshot, mActiveIfaces, currentTime);
mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveIfaces, currentTime);
mUidTagRecorder.recordSnapshotLocked(uidSnapshot, mActiveIfaces, currentTime);
} catch (IllegalStateException e) {
///M: modify
Log.e(TAG, "problem reading network stats:"+e);
return;
} catch (RemoteException e) {
// ignored; service lives in system_server
return;
} // persist any pending data depending on requested flags
if (persistForce) {
mDevRecorder.forcePersistLocked(currentTime);
mXtRecorder.forcePersistLocked(currentTime);
mUidRecorder.forcePersistLocked(currentTime);
mUidTagRecorder.forcePersistLocked(currentTime);
} else {
if (persistNetwork) {
mDevRecorder.maybePersistLocked(currentTime);
mXtRecorder.maybePersistLocked(currentTime);
}
if (persistUid) {
mUidRecorder.maybePersistLocked(currentTime);
mUidTagRecorder.maybePersistLocked(currentTime);
}
} if (LOGV) {
final long duration = SystemClock.elapsedRealtime() - startRealtime;
Slog.v(TAG, "performPollLocked() took " + duration + "ms");
} ///M: MTK-START Disable EventLog @{
/* if (mSettings.getSampleEnabled()) {
// sample stats after each full poll
performSampleLocked();
}
*/
///@} // finally, dispatch updated event to any listeners
final Intent updatedIntent = new Intent(ACTION_NETWORK_STATS_UPDATED);
updatedIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mContext.sendBroadcastAsUser(updatedIntent, UserHandle.ALL,
READ_NETWORK_USAGE_HISTORY);
}
如果要手动更新数据流量,也可以仿照DataUsageSummary.java中调用NetworkStatsService.forceUpdate(),
不过如果调用过于频繁,可能会影响整机效率。
@Override
public void forceUpdate() {
mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
assertBandwidthControlEnabled(); final long token = Binder.clearCallingIdentity();
try {
performPoll(FLAG_PERSIST_ALL);
} finally {
Binder.restoreCallingIdentity(token);
}
}
应该是说所有system 和APP 的私有数据都不会删除
Rom在低于4M 的时候,只会删除/data/core“和”/data/system/dropbox 下面的部分
因为这些是debug log 文件,另外还有一部分Cache里面保存的东西,这些东西相当于是运行中产生的temp file
除此之外其他都不会删除,请知悉,谢谢。
2.添加50等频道,请参考FAQ06820。
3.MTK_CMAS_SUPPORT宏来控制CMAS。
隔一段时间,或者第二天再发送短信,应该就ok了。属于网络问题。
MTK-->对于CMS error 47 的错误,短信不可发送,是不影响通话和上网业务的,因为短信走的是CS域,而通话走的也是cs域,但打电话时,向下 下发的命令是ECPI,对于CMS 的error 不是会影响ECPI的命令的。而上网是走PS 域的,在需要上网时,ps需要attach上,才能正常上网。如果有具体的网路的问题的话,就需要负责 网络模块的同仁分析了。
对于cms error的解释,并没有相应文档,贵司可以查询 24.011 spec。
对于CMS ERROR 47 : "Resources unavailable, unspecified".
This cause is used to report a resource unavailable event only when no other cause applies.
2、在Settings 中查看mms type的apn,并截图;
3、在Settings中查看default type(browser apn)的apn,并截图
4、pull 手机中的telephony.db
5、修改default type(browser apn)的apn,并截图
6、pull 手机中的telephony.db
7、查看mms type的apn,并截图;
接收的时候,收到网络的PDU后,会调用smsMessage的parsePDU()来进行解码
在net log里。搜索发送的pdu(MMS m-send-req )
打开该pdu.可以看到该pdu的smil文件,在该smil文件里。一个par对应一页。只要看有几个<par>标签就行了。
从接收端看出接收的彩信是几页:
在net log里。搜索接收的pdu(MMS m-retrieve-conf)
同样打开该pdu.可以看到该pdu的smil文件,在该smil文件里。一个par对应一页。只要看有几个<par>标签就行了。
如参考DMS上以下路径的 文档Omacp_Customization_Guide_Document.doc :
/SW/3G Phone Data/Smart Phone/Standard Package/MT6572 SW Doc Package/Application/Browser
1. Google default表情字符
这部分没有改动原样保留,Google原生的是21个,请查看packages/apps/mms/res/values/arrays.xml 里面,有个array叫default_smiley_texts,这21个就是google default的表情。
2. MTK扩展表情字符
这部分符号其他手机很可能是不支持的。但这些表情对应的字符组合是经过UI特别设计的,每个字符组合本身传达的意思可以和表情吻合。
因为输入法只是帮忙将字符表情中的字符一次性输入到输入框中,如果您通过第三方输入法(如华为输入法)输入的表情符号不在上述表情符号中,那么就无法显示出对应的表情图标,而是显示字符组合,而这些字符组合也是会表达一定含义的,并非完全无意义的乱码。所以不会影响用户对短信的基本理解。
如果一定要解决这个问题,以下提供一个解法,让长短信每片短信都单独显示出来,这样全选的时候就可以将所有短信都选中。
SmsProvider.java这支文件:
1. 将getAllMessagesFromIcc()和getAllMessagesFromIcc(int slotId)函数中的如下变量固定为false.
boolean showInOne = false;
2. getConcatSmsIndexAndBody(ArrayList<SmsMessage> messages, int index)函数:
(1) 删除messages.set(i, null);这行代码
(2)在 int concatCount = concatMsg.size();这行代码后添加一行代码:
///
for (int k = 0; k < concatCount; k++) {
SmsMessage sms = concatMsg.get(k);
SmsHeader smsHeader = sms.getUserDataHeader();
Xlog.d(TAG, " refNumber:" + smsHeader.concatRef.refNumber);
Xlog.d(TAG, " index:" + sms.getIndexOnIcc());
Xlog.d(TAG, " seqNumber:" + smsHeader.concatRef.seqNumber);
}
/
(3) 在smsBody.append(sms.getDisplayMessageBody());这行代码后添加一行代码:
messages.remove(sms);//mtkxxx
这个权限本身对应用层来说并不能做什么事.只是android fw 有对这个做检查.如果不加的话.fw是不允许采用多用户的形式运行这个apk.
中的
// 若仅仅不让卡2上网,但又不影响卡2彩信的使用,还需要加上判断当前是不是彩信apn
if(mGsmPhone .getMySimId()== PhoneConstants.GEMINI_SIM_2
/* && !PhoneConstants.APN_TYPE_MMS.equals(apnType)*/){
其它没有在编码表里的,以空格方式发送可以按以下方式修改:
一,在GsmAlphabet.countGsmSeptets((CharSequence s, boolean use7bitOnly))这个方法的第一行添加一行:
use7bitOnly=true;
(注意:该方法在GsmAlphabet里有三种重载形式,请误加错.)
二,在 GsmAlphabet的public static byte[] stringToGsm7BitPacked(String data, int startingSeptetOffset,
boolean throwException, int languageTable, int languageShiftTable)
throws EncodeException {(注意该文件里很多这个方法的重载,请不要修改错方法)里:
在该方法的第一行添加:throwException=false;
比如在onTextChanged里增加s=s.toString().replaceAll("a","*");.就会把a替换成*号.
目前代码中默认MMS重发次数为5次,在代码DefaultRetryScheme.java中通过如下变量设定:
Private static final int[] sDefaultRetryScheme ={
0, 1*60*1000, 5*60*1000, 10*60*1000, 30*60*1000};
即如果彩信发送失败,会在0分钟,1分钟后,5分钟后,10分钟后,30分钟后重新发送,5次都发送失败后,将不再尝试发送,且将该彩信标志为发送失败状态。用户可以根据实际情况调整sDefaultRetryScheme的定义从而来调整重发次数和时间。在重发功能未完成之前,手机一起会显示正在发送的界面,一定要等到重发执行完成之后,才会提示发送失败。
以上是MTK功能设计如此
至于如何让铃声不受静音影响.贵司可以尝试以下方法:
静音模式下,会将受静音影响的铃声类型的音量设为0,如果希望某种铃声不受静音模式的影响,可以先做如下修改:
1,AudioService.java:中 mRingerModeAffectedStreams保存着静音模式时会影响的streamType,因此如果希望某种类型的声音在静音模式下也能够有声音,就应该将其从mRingerModeAffectedStreams移出:
1)如,希望通知铃STREAM_NOTIFCATION声在静音下不受影响,添加如下一句:
private void readPersistedSettings() {
.....
mRingerModeAffectedStreams &= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED);/*Add this line*/
Settings.System.putIntForUser(cr,
Settings.System.MODE_RINGER_STREAMS_AFFECTED,
mRingerModeAffectedStreams,
UserHandle.USER_CURRENT
2) private class SettingsObserver extends ContentObserver {
....
public void onChange(boolean selfChange) {
....
ringerModeAffectedStreams&= ~(1 << AudioSystem.STREAM_SYSTEM_ENFORCED);/*Add this line*/
if (ringerModeAffectedStreams != mRingerModeAffectedStreams) {
/*
* Ensure all stream types that should be affected by ringer mode
* are in the proper state.
*/
mRingerModeAffectedStreams = ringerModeAffectedStreams;
setRingerModeInt(getRingerMode(), false);
}
2,对应的播放铃声时就是用上面从mRingerModeAffectedStreams移出不受静音影响的类型,如上面将AudioSystem.STREAM_SYSTEM_ENFORCED从mRingerModeAffectedStreams移出不受静音影响,则Application中使用ringtone播放时设置的streamtype为STREAM_SYSTEM_ENFORCED。
3,贵司可以在CBMessagingNotification.updateNotification的适当位置添加播放铃声的code.比如:
AudioProfileManager mProfileManager = (AudioProfileManager) context.getSystemService(Context.AUDIOPROFILE_SERVICE);
String mActiveProfileKey = mProfileManager.getActiveProfileKey();
if(mActiveProfileKey!=null){
Log.d("mtk_debug", " MessagingNotification.updateNotification 1241 mActiveProfileKey="+mActiveProfileKey); // modify by mtk_debug 2013-12-18;
if(mActiveProfileKey.equals("mtk_audioprofile_silent")){
Log.d("mtk_debug", " MessagingNotification.updateNotification 1243 "); // modify by mtk_debug 2013-12-18;
// Ringtone r=RingtoneManager.getRingtone(context, Uri.parse(NotificationPreferenceActivity.NOTIFICATION_RINGTONE),7);
//
Ringtone r = new Ringtone(context, true);
r.setStreamType(AudioSystem.STREAM_SYSTEM_ENFORCED);
Log.d("mtk_debug", " MessagingNotification.updateNotification 1253 ringtoneStr="+ringtoneStr); // modify by mtk_debug 2013-12-18;
r.setUri(Uri.parse(ringtoneStr));
r.play();
Log.d("mtk_debug", " MessagingNotification.updateNotification 1246 "); // modify by mtk_debug 2013-12-18;
}
修改手机 /system/etc/ mtklog-config.prop 里的内容为:
com.mediatek.log.mobile.enabled = true
com.mediatek.log.modem.enabled = true
com.mediatek.log.net.enabled = true
方案:会话chat list号码后8位匹配,但是前缀以最后一条短信为准,自动更换回信的号码。(如短信chat list为302+A,但是最新的一条短信号码是301+A,则自动回复到301+A上而不是302+A上)【Samsung方案】,所有后8位相同的号码都在同一个会话中。
优点:不影响号码匹配需求;
缺点:所有后8位相同的号码会在同一个会话中;
“只有收到一条信息时才替换为最新的号码”这个方案,是可行的。
考虑到收到一条信息生成thread id的逻辑是特殊的,会走SmsProvider的逻辑,所以可以对该段逻辑做修改,而且还不会影响到其他的生成thread的逻辑
具体做法:
定位到SmsProvider.java中getSingleAddressId()方法,当从db中匹配到联系人时,用新的联系人替换,并返回替换后的id
还请贵司自行修改并验证。
private long getSingleAddressId(String address, SQLiteDatabase db) {
boolean isEmail = Mms.isEmailAddress(address);
boolean isPhoneNumber = Mms.isPhoneNumber(address);
/** M: We lowercase all email addresses, but not addresses that aren't numbers, because
* that would incorrectly turn an address such as "My Vodafone" into "my vodafone"
* and the thread title would be incorrect when displayed in the UI.*/
String refinedAddress = isEmail ? address.toLowerCase() : address;
String selection = "address=?";
String[] selectionArgs;
long retVal = -1L;
if (!isPhoneNumber || (address != null && address.length() > NORMAL_NUMBER_MAX_LENGTH)) {
selectionArgs = new String[] { refinedAddress };
} else {
boolean useStrictPhoneNumberComparation = getContext().getResources().getBoolean(
com.android.internal.R.bool.config_use_strict_phone_number_comparation);
selection += " OR " + String.format(Locale.ENGLISH, "PHONE_NUMBERS_EQUAL(address, ?, %d)",
(useStrictPhoneNumberComparation ? 1 : 0));
selectionArgs = new String[] { refinedAddress, refinedAddress };
}
Cursor cursor = null;try {
cursor = db.query("canonical_addresses", CANONICAL_ADDRESSES_COLUMNS_2,
selection, selectionArgs, null, null, null);if (cursor.getCount() == 0) {
retVal = insertCanonicalAddresses(db, refinedAddress);
MmsLog.d(TAG, "getSingleAddressId: insert new canonical_address for " + address + ", _id=" + retVal);
return retVal;
} else {
while (cursor.moveToNext()) {
String currentNumber = cursor.getString(cursor.getColumnIndexOrThrow(CanonicalAddressesColumns.ADDRESS));
MmsLog.d(TAG, "getSingleAddressId(): currentNumber != null ? " + (currentNumber != null));
if (currentNumber != null) {
if (refinedAddress.equals(currentNumber) || currentNumber.length() <= NORMAL_NUMBER_MAX_LENGTH) {
retVal = cursor.getLong(cursor.getColumnIndexOrThrow(CanonicalAddressesColumns._ID));
MmsLog.d(TAG, "getSingleAddressId(): get exist id=" + retVal);
//qiyanlong add
ContentValues contentValues = new ContentValues();
contentValues.put(CanonicalAddressesColumns.ADDRESS, refinedAddress);
db.update("canonical_addresses", contentValues, "_id="+ retVal,null);
MmsLog.d(TAG, "getSingleAddressId() refinedAddress =" + refinedAddress);
//end
break;
}
}
}
if (retVal == -1) {
retVal = insertCanonicalAddresses(db, refinedAddress);
}
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return retVal;
}
Frame #: Time: 938557 Local Time: 18:15:22:600 2013/01/01 Message: [AT_I p46, s9]AT+CSCB?
Frame #: Time: 938557 Local Time: 18:15:22:600 2013/01/01 Message: [AT_R p46, s9]+CSCB: 1,"","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15",1
Frame #: Time: 941987 Local Time: 18:15:38:430 2013/01/01 Message: [AT_I p45, s8]AT+CSCB?
Frame #: Time: 941987 Local Time: 18:15:38:430 2013/01/01 Message: [AT_R p45, s8]+CSCB: 1,"","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15",1
Frame #: Time: 943134 Local Time: 18:15:43:723 2013/01/01 Message: [AT_I p46, s9]AT+CSCB?
Frame #: Time: 943134 Local Time: 18:15:43:723 2013/01/01 Message: [AT_R p46, s9]+CSCB: 1,"","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15",1
Frame #: Time: 943134 Local Time: 18:15:43:723 2013/01/01 Message: [AT_I p46, s9]AT+CSCB=0, "", "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15"
Frame #: Time: 943166 Local Time: 18:15:43:871 2013/01/01 Message: [AT_I p46, s9]AT+CSCB?
Frame #: Time: 943166 Local Time: 18:15:43:871 2013/01/01 Message: [AT_R p46, s9]+CSCB: 0,"","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15",1
Frame #: Time: 943166 Local Time: 18:15:43:871 2013/01/01 Message: [AT_I p46, s9]AT+CSCB=1, "", "0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15"
Frame #: Time: 943216 Local Time: 18:15:44:101 2013/01/01 Message: [AT_I p46, s9]AT+CSCB=0, "4370-4381"
Frame #: Time: 943243 Local Time: 18:15:44:226 2013/01/01 Message: [AT_I p46, s9]AT+CSCB=0, "", "", 1
Frame #: Time: 943256 Local Time: 18:15:44:286 2013/01/01 Message: [AT_I p46, s9]AT+CSCB?
Frame #: Time: 943256 Local Time: 18:15:44:286 2013/01/01 Message: [AT_R p46, s9]+CSCB: 0,"4370-4381","",1
Frame #: Time: 943256 Local Time: 18:15:44:286 2013/01/01 Message: [AT_I p46, s9]AT+CSCB=0, "4370-4381", ""
Frame #: Time: 967718 Local Time: 18:17:37:178 2013/01/01 Message: [AT_I p45, s8]AT+CSCB?
Frame #: Time: 967718 Local Time: 18:17:37:178 2013/01/01 Message: [AT_R p45, s8]+CSCB: 0,"4370-4381","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15",1
因为很多小区广播是紧急预警的,例如地震、气象等紧急信息,像拨打紧急电话类似,不插卡也要可以work 不可以关掉。所以只要手机能连上网络(比如拨打112等,能拨打紧急电话的网络),运营商发出CB,手机就能正常接收CB,请知悉。
-> 手机注册到哪家运营商的网络,就可以接收到其发出的小区广播。
我们知道有几个特殊的频道是预报海啸,地震的,但我们内网是50频道,为什么也可以接收?
-> 其实小区广播接收与SIM卡并无关系,只要注册到网络,就可以接收到运营商下发的广播。既然贵司已经预置了50频道,那么肯定可以接收。不过插入SIM卡可以进行小区广播的相关设置,比如设置小区广播语言及频道。
在CBMessageListActivity.java 文件开头先定义一个宏 THREADID:
private static final String THREADID = "thread_id";
再修改:
1. 修改方法:
private void initActivityState(Bundle bundle, Intent intent) {
long threadId = 0;
if (bundle != null) {
// TODO process bundle != null
// return;
threadId = bundle.getLong(THREADID, 0);
}else{ threadId = intent.getLongExtra(THREADID , 0);
}
// If we have been passed a thread_id, use that to find our
// conversation.
// long threadId = intent.getLongExtra("thread_id", 0);
if (threadId > 0) {
mConversation = Conversation.get(this, threadId, false);
} else {
Uri intentData = intent.getData();
if (intentData != null) {
// try to get a conversation based on the data URI passed to our intent.
mConversation = Conversation.get(this, intent.getData(), false);
} else {
mConversation = Conversation.createNew(this);
}
}
}
2. 添加onSaveInstanceState()方法:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save the current thread id
outState.putLong(THREADID, mConversation.getThreadId());
Xlog.i(LogTag.CB, "saved thread id:" + mConversation.getThreadId());
}
Android Message Learning from MTK相关推荐
- MTK驱动(46)---- Android CPU频率设置(MTK平台)
Android CPU频率设置(MTK平台) 1.CPU 频率设置 主要设置CPU的最大和最小频率 mPerfServiceWrapper.userReg 注册 mPerfServiceWrapper ...
- Android Message和obtainMessage的区别
Android Message和obtainMessage的区别 类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以 ...
- Android Message 及其使用
一.线程间通讯的Message机制 1.Message介绍 frameworks\base\core\java\android\Os\Message.java Message是线程之间传递信息的载体, ...
- Android Message解析
在android的消息机制中,Message其充当着信息载体的一个角色,通俗的来说,我们看作消息机制就是个工厂的流水线,message就是流水线上的产品,messageQueue就是流水线的传送带.之 ...
- android message 代码,Android Handler移除Message详解及实例代码
Android Handler移除Message详解 问题: 1.removeMessage(what)函数是否只能移除对应what值的Message? 2.对于Delayed发送的Message,能 ...
- mtk android 5.1 logo,Android ROM DIY之MTK平台手机通用移植
在之前的文章中,我们讨论过ROM刷机原理,修改ROM包以及如何让ROM包获取root权限.那么接下来,我们谈谈MTK平台手机ROM移植的话题.如果你是ROM小白,那么建议可以先看看之前的文章. ROM ...
- mtk android手机 代码问题,MTK用户必备 Android手机也能系统恢复
很多PC用户会在新装系统.驱动和常用软件之后进行Ghost备份,一旦系统异常直接恢复即可.实际上,Android手机也有类似的整套系统备份方法,让手机随时原地满血复活. 全局性的系统备份 可能有同学会 ...
- android 高通与MTK编译命令
分享一下,如何编译自己修改的源码模块 1).build/envsetup.sh //进入源码目录,执行源码build目录下的envsetup.sh脚本,使mmm命令有效(此命令要在源码根目 ...
- Android P 9.0 MTK平台 增加以太网静态IP功能
前言 朋友们,最近又开始搞 Android P了,同样的以太网静态 IP 是少不了的功能,今天我们就开始来整一下.之前弄6.0 和 8.1 的都 ok 了. 没想到 9.0 改动还是略微有点大的.来来 ...
最新文章
- postfix报错postfix: fatal: parameter inet_interfaces: no local interface found for ::1
- C#LeetCode刷题之#69-x 的平方根(Sqrt(x))
- 页面导入样式时,使用link和@import有什么区别?
- ei eo eq什么意思_音响中的EQ是什么意思呀?
- VMware Workstation Pro 虚拟机做RAID
- 2018前端面试题总结
- 【优化预测】基于matlab粒子群算法优化BP神经网络(多输入多输出)【含Matlab源码 1418期】
- 是谁让你的 Linux 平稳运行?感谢封包人吧
- SQL查询分析器单文件绿色版
- 知识图谱入门 (二) 知识表示与知识建模
- PTA 背包问题凑零钱
- 【源码】SIMULINK中的Logitech X-56 H.O.T.A.S飞行控制器
- 云计算学习笔记——第四章 存储虚拟化
- linux 开放5222端口,XMPP协议、IM、客户端互联详解
- 世界主要货币英文缩写
- 判断用户输入的数是正数还是负数
- [引爆流行]Meme Engine话题(一)
- 使用python爬虫抓站的一些技巧总结:进阶篇 (转)
- python笔记10:数据处理之去除空格
- MATLAB绘图导出后变成灰色