MTK 发送彩信函数

合集下载

【Android】Android彩信发送的两种方式+源代码

【Android】Android彩信发送的两种方式+源代码

【Android 】Android 彩信发送的两种⽅式+源代码Android 彩信发送的两种⽅式第⼀种:直接调⽤彩信发送接⼝ 实现代码如下, 看到彩信发送的代码,跟短信发送的代码有很⼤的不同,彩信发送不同于短信发送,调⽤系统的彩信发送会出现发送界⾯。

有朋友就要问了,这样不适合我的需求,我需要实现⾃定义彩信发送,并且不调⽤系统彩信。

第⼆种⽅法将满⾜我们的需求第⼆种:⾃定义彩信发送 ⾃定义彩信发送,⽆需进⼊彩信发送界⾯,需要调⽤系统源码 PDU 实现。

⾸先给出发送代码APNManager.getSimMNC ⽤来设置 彩信Url 和代理端⼝MMSSender.sendMMS 实现彩信的发送APNManager 类源代码Intent intent = new Intent(Intent.ACTION_SEND);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url));// uri 为你的附件的uriintent.putExtra("subject", "it's subject"); //彩信的主题intent.putExtra("address", "10086"); //彩信发送⽬的号码intent.putExtra("sms_body", "it's content"); //彩信中⽂字内容intent.putExtra(Intent.EXTRA_TEXT, "it's EXTRA_TEXT");intent.setType("image/*");// 彩信附件类型intent.setClassName("com.android.mms","poseMessageActivity");startActivity(intent);//彩信发送函数public static void sendMMS(final Context context, String number,String subject, String text, String imagePath, String audioPath) {final MMSInfo mmsInfo = new MMSInfo(context, number, subject, text,imagePath, audioPath);final List<String> list = APNManager.getSimMNC (context);new Thread() {@Overridepublic void run() {try {byte [] res = MMSSender.sendMMS (context, list,mmsInfo.getMMSBytes());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}};}.start();}View Codepackage com.rayray.util;import java.util.ArrayList;import java.util.List;import android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import .Uri;import android.telephony.TelephonyManager;import android.text.TextUtils;import android.util.Log;public class APNManager {// 电信彩信中⼼url ,代理,端⼝public static String mmscUrl_ct = "http://mmsc.vnet.mobi";public static String mmsProxy_ct = "10.0.0.200";// 移动彩信中⼼url ,代理,端⼝public static String mmscUrl_cm = "";public static String mmsProxy_cm = "10.0.0.172";// 联通彩信中⼼url ,代理,端⼝public static String mmscUrl_uni = "http://mmsc.vnet.mobi";public static String mmsProxy_uni = "10.0.0.172";private static String TAG = "APNManager";private static final Uri APN_TABLE_URI = Uri.parse("content://telephony/carriers");// 所有的APN 配配置信息位置private static final Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");// 当前的APNprivate static String[] projection = { "_id", "apn", "type", "current","proxy", "port" };private static String APN_NET_ID = null ;private static String APN_WAP_ID = null ;public static List<String> getSimMNC(Context context) {TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);String imsi = telManager.getSubscriberId();if (imsi != null) {ArrayList<String> list = new ArrayList<String>();if (imsi.startsWith("46000") || imsi.startsWith("46002")) {// 因为移动⽹络编号46000下的IMSI已经⽤完,所以虚拟了⼀个46002编号,134/159号段使⽤了此编号 // 中国移动list.add(mmscUrl_cm);list.add(mmsProxy_cm);} else if (imsi.startsWith("46001")) {// 中国联通list.add(mmscUrl_uni);list.add(mmsProxy_uni);} else if (imsi.startsWith("46003")) {// 中国电信list.add(mmscUrl_ct);list.add(mmsProxy_ct);}shouldChangeApn(context);return list;}return null;}private static boolean shouldChangeApn(final Context context) {final String wapId = getWapApnId(context);String apnId = getCurApnId(context);// 若当前apn不是wap,则切换⾄wapif (!wapId.equals(apnId)) {APN_NET_ID = apnId;setApn(context, wapId);// 切换apn需要⼀定时间,先让等待2秒try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return true;}return false;}public static boolean shouldChangeApnBack(final Context context) {// 彩信发送完毕后检查是否需要把接⼊点切换回来if (null != APN_NET_ID) {setApn(context, APN_NET_ID);return true;}return false;}// 切换成NETAPNpublic static boolean ChangeNetApn(final Context context) {final String wapId = getWapApnId(context);String apnId = getCurApnId(context);// 若当前apn是wap,则切换⾄netif (wapId.equals(apnId)) {APN_NET_ID = getNetApnId(context);setApn(context, APN_NET_ID);// 切换apn需要⼀定时间,先让等待⼏秒,与机⼦性能有关try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}Log.d("xml", "setApn");return true;}return true;}// 切换成WAPAPNpublic static boolean ChangeWapApn(final Context context) {final String netId = getWapApnId(context);String apnId = getCurApnId(context);// 若当前apn是net,则切换⾄wapif (netId.equals(apnId)) {APN_WAP_ID = getNetApnId(context);setApn(context, APN_WAP_ID);// 切换apn需要⼀定时间,先让等待⼏秒,与机⼦性能有关try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}Log.d("xml", "setApn");return true;}return true;}// 获取当前APNpublic static String getCurApnId(Context context) {ContentResolver resoler = context.getContentResolver();// String[] projection = new String[] { "_id" };Cursor cur = resoler.query(PREFERRED_APN_URI, projection, null, null, null);String apnId = null;if (cur != null && cur.moveToFirst()) {apnId = cur.getString(cur.getColumnIndex("_id"));}Log.i("xml", "getCurApnId:" + apnId);return apnId;}public static APN getCurApnInfo(final Context context) {ContentResolver resoler = context.getContentResolver();// String[] projection = new String[] { "_id" };Cursor cur = resoler.query(PREFERRED_APN_URI, projection, null, null, null);APN apn = new APN();if (cur != null && cur.moveToFirst()) {apn.id = cur.getString(cur.getColumnIndex("_id"));apn.apn = cur.getString(cur.getColumnIndex("apn"));apn.type = cur.getString(cur.getColumnIndex("type"));}return apn;}public static void setApn(Context context, String id) {ContentResolver resolver = context.getContentResolver();ContentValues values = new ContentValues();values.put("apn_id", id);resolver.update(PREFERRED_APN_URI, values, null, null);Log.d("xml", "setApn");}// 获取WAP APNpublic static String getWapApnId(Context context) {ContentResolver contentResolver = context.getContentResolver();// 查询cmwapAPNCursor cur = contentResolver.query(APN_TABLE_URI, projection,"apn = \'cmwap\' and current = 1", null, null);// wap APN 端⼝不为空if (cur != null && cur.moveToFirst()) {do {String id = cur.getString(cur.getColumnIndex("_id"));String proxy = cur.getString(cur.getColumnIndex("proxy"));if (!TextUtils.isEmpty(proxy)) {Log.i("xml", "getWapApnId" + id);return id;}} while (cur.moveToNext());}return null;}public static String getNetApnId(Context context) {ContentResolver contentResolver = context.getContentResolver();Cursor cur = contentResolver.query(APN_TABLE_URI, projection,"apn = \'cmnet\' and current = 1", null, null);if (cur != null && cur.moveToFirst()) {return cur.getString(cur.getColumnIndex("_id"));}return null;}// 获取所有APNpublic static ArrayList<APN> getAPNList(final Context context) {ContentResolver contentResolver = context.getContentResolver();Cursor cr = contentResolver.query(APN_TABLE_URI, projection, null, null, null);ArrayList<APN> apnList = new ArrayList<APN>();if (cr != null && cr.moveToFirst()) {do {Log.d(TAG,cr.getString(cr.getColumnIndex("_id")) + ";"+ cr.getString(cr.getColumnIndex("apn")) + ";"+ cr.getString(cr.getColumnIndex("type")) + ";"+ cr.getString(cr.getColumnIndex("current"))+ ";"+ cr.getString(cr.getColumnIndex("proxy")));APN apn = new APN();apn.id = cr.getString(cr.getColumnIndex("_id"));apn.apn = cr.getString(cr.getColumnIndex("apn"));apn.type = cr.getString(cr.getColumnIndex("type"));apnList.add(apn);} while (cr.moveToNext());cr.close();}return apnList;}// 获取可⽤的APNpublic static ArrayList<APN> getAvailableAPNList(final Context context) { // current不为空表⽰可以使⽤的APNContentResolver contentResolver = context.getContentResolver();Cursor cr = contentResolver.query(APN_TABLE_URI, projection,"current is not null", null, null);ArrayList<APN> apnList = new ArrayList<APN>();if (cr != null && cr.moveToFirst()) {do {Log.d(TAG,cr.getString(cr.getColumnIndex("_id")) + ";"+ cr.getString(cr.getColumnIndex("apn")) + ";"+ cr.getString(cr.getColumnIndex("type")) + ";"+ cr.getString(cr.getColumnIndex("current"))+ ";"+ cr.getString(cr.getColumnIndex("proxy")));APN apn = new APN();apn.id = cr.getString(cr.getColumnIndex("_id"));apn.apn = cr.getString(cr.getColumnIndex("apn"));apn.type = cr.getString(cr.getColumnIndex("type"));apnList.add(apn);} while (cr.moveToNext());cr.close();}return apnList;}// ⾃定义APN包装类static class APN {String id;String apn;String type;@Overridepublic String toString() {return "id=" + id + ",apn=" + apn + ";type=" + type;}}}MMSSender类源代码View Code//发送类package com.rayray.util;import java.io.DataInputStream;import java.io.IOException;import .SocketException;import java.util.List;import org.apache.http.HttpEntity;import org.apache.http.HttpHost;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.params.ConnRoutePNames;import org.apache.http.entity.ByteArrayEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;import org.apache.http.protocol.HTTP;import android.content.Context;import android.util.Log;/*** @author* @version创建时间:2012-2-1 上午09:32:54*/public class MMSSender {private static final String TAG = "MMSSender";// public static String mmscUrl = "";// public static String mmscProxy = "10.0.0.172";public static int mmsProt = 80;private static String HDR_VALUE_ACCEPT_LANGUAGE = "";private static final String HDR_KEY_ACCEPT = "Accept";private static final String HDR_KEY_ACCEPT_LANGUAGE = "Accept-Language";private static final String HDR_VALUE_ACCEPT = "*/*, application/vnd.wap.mms-message, application/vnd.wap.sic";public static byte[] sendMMS(Context context, List<String> list, byte[] pdu)throws IOException {System.out.println("进⼊sendMMS⽅法");// HDR_VALUE_ACCEPT_LANGUAGE = getHttpAcceptLanguage();HDR_VALUE_ACCEPT_LANGUAGE = HTTP.UTF_8;String mmsUrl = (String) list.get(0);String mmsProxy = (String) list.get(1);if (mmsUrl == null) {throw new IllegalArgumentException("URL must not be null.");}HttpClient client = null;try {// Make sure to use a proxy which supports CONNECT.// client = HttpConnector.buileClient(context);HttpHost httpHost = new HttpHost(mmsProxy, mmsProt);HttpParams httpParams = new BasicHttpParams();httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, httpHost);HttpConnectionParams.setConnectionTimeout(httpParams, 10000);client = new DefaultHttpClient(httpParams);HttpPost post = new HttpPost(mmsUrl);// mms PUD STARTByteArrayEntity entity = new ByteArrayEntity(pdu);entity.setContentType("application/vnd.wap.mms-message");post.setEntity(entity);post.addHeader(HDR_KEY_ACCEPT, HDR_VALUE_ACCEPT);post.addHeader(HDR_KEY_ACCEPT_LANGUAGE, HDR_VALUE_ACCEPT_LANGUAGE);post.addHeader("user-agent","Mozilla/5.0(Linux;U;Android 2.1-update1;zh-cn;ZTE-C_N600/ZTE-C_N600V1.0.0B02;240*320;CTC/2.0)AppleWebkit/530.17(KHTML,like Gecko) Version/4.0 Mobile Safari/530.17");// mms PUD ENDHttpParams params = client.getParams();HttpProtocolParams.setContentCharset(params, "UTF-8");System.out.println("准备执⾏发送");// PlainSocketFactory localPlainSocketFactory =// PlainSocketFactory.getSocketFactory();HttpResponse response = client.execute(post);System.out.println("执⾏发送结束,等回执。

MTK平台指令

MTK平台指令

MTK平台基本信息MTK手机设置指令:*#66*#中文语言:*#0086# + send查看版本:*#8375#软件版本:*#8882#测试:*#87#调试:*#8899#默认语言:*#0000#+通话键设置英文:*#0044#+通话键繁体中文:*#0886#+通话键简体中文:*#0086#+通话键串号查询:*#06#工程指令:*#3646633# 或*#3698741#自动测试:*#87#软件版本:*#8882#MMT芯片的出厂密码为1122原厂设置┳━━Version版本信息┃┣━━MCU SW微程序控制器软件┃┣━━Melody曲调版本┃┣━━Serial No.序列号┃┣━━BB Chip基板芯片(MT6218B,还有哪个手机用它的?)┃┣━━DSP Code数字信号处理器代码┃┣━━DSP Patch 数字信号处理器修正版本号┃┣━━MS Board MS 板(不太清楚,不知是什么的缩写。

Memory System??)┃┗━━Build No. 版本号┃┣━━Resource BIN 资源BIN(不知道该怎么翻,二进制代码吗?)┃┣━━Audio音频┃┣━━Image图像┃┣━━STR字符串(猜的)┃┗━━Font字体┃┣━━Echo Loop循环显示(不知道翻的准不准)可以开关,但是不知道有啥用┃┣━━按键(原本就是中文)按确定进入可以测试键盘上的键是否好使┃按下相应的键,屏幕上的字符会消失,证明此键好使┃UP:方向键上DN:方向键下LF:方向键左RT:方向键右┃LSK:左软键(一点都没觉得软)RSK:有软键(还不如左软键)┃Snd:接通键End:挂机键Vup:音量大Vdn:音量小┃ 1 2 3 4 5 6 7 8 9 0 * # :数字键及*#┃测试完成后会出现Pass┃┣━━Vibrator震动测试选“开”测试震动功能是否可用┃┣━━Loud Spk扬声器(我一直想说“喇叭”)测试选“开”测试扬声器是否可以发声┃┣━━铃声(原本就是中文)铃声测试选“开”测试铃声功能是否正常┃┣━━LED发光二极管指示灯(彩灯)测试┃┣━━Main LCM BL 主显示屏背光(可开关,选关会熄灭,再按一下左键可再打开)┃┣━━Sub LCM BL子显示屏背光(可开关,但我得没什么反应,没坏吧?)┃┣━━Keypad LED键盘灯(可开关)┃┣━━Status LED R状态灯红色┃┣━━Status LED G状态灯绿色┃┗━━Status LED B状态灯蓝色(我的三种颜色错位了)┃┣━━LCD显示屏测试┃┣━━Auto display自动测试自动用红绿蓝白四色填充屏幕,可测出是否有坏点┃┣━━Red用红色填充屏幕┃┣━━Green用绿色填充屏幕┃┣━━Blue用蓝色填充屏幕┃┗━━White用白色填充屏幕┃┣━━LCD Contract显示屏对比度测试┃┣━━Main LCD主显示屏对比度,会显示一张图片┃┃按方向键上下可调十五级对比度,不过我怎么调都没什么变化┃┗━━Sub LCD子(外)显示屏对比度,可以调十五级对比度┃调整有变化,但是没有图片,只有文字┃┣━━Receiver接收机(??)测试本来想翻成话筒的,但是话筒被什么反应┃不知这个Receiver指什么┃选开始就发出吱吱的声音,刺耳死了┃┣━━ADC不知是什么的缩写┃┣━━VBAT电池电压┃┣━━BTemp电池温度(很多人说电池温度低不能充电,道理就在这)┃┣━━VAUX辅助电压(不知是什么),通常为0.02V┃┣━━Current充电电流,用数据线充电时为0.33A,不小阿┃┗━━VChgr充电电压,插上充电器/数据线才会有┃┣━━Charger充电器,进入以后和上面的ADC是同一个菜单┃┣━━Headset耳机测试(耳机丢了,没法试),可以开关,可能插上耳机会有什么声音吧┃┣━━RTC个人推测应该是Real Time Clock的缩写,实际上是测试关机闹钟的┃按“确定”会马上关机并测试关机闹钟是否可以在关机状态下启动闹铃┃┣━━MTBF依然不知是什么的缩写┃按“确定”后把振动、扬声器、LCD、LED整合在一起测试┃┣━━Nand Flash闪存芯片测试,如果正常显示“成功”┃┗━━CAMERA摄像头测试,按“确定”进入,选择“选项”有三个选项┣━━Flash Level R按照翻译过来的意思,应该是调闪光灯色彩的┣━━Flash Level G但是不管怎么调都没什么变化┗━━Flash Level B于是不知道这几个是管什么的了工程模式进入工程模式后,会出现一个全新界面,有很多人可能觉得新鲜,但我要说的是,看看可以,尽量不要随意改动设置,毕竟这不是开放给普通用户的,否则会造成很严重的后果,下面给大家介绍一下,具体内容:打开数字键盘,输入*#3646633#或*#3698741#进入工程模式菜单。

MTK个人笔记

MTK个人笔记
5、MTK工程里面的语言种类,其宏控制和字串ID可以在Res_SSC.c里面的PopulateSSCRes()里面查看。
6、查看进入MTK手机工程模式的指令可在CustResDef.h里,对应值为:SSC_ENGINEERING_MODE。
7、打包命令:armar -r *.a(或者*.lib) *.obj,解包命令:armar -x *.a,执行时都要先运行到obj或者库文件目录下。
22、Idle界面里面的触摸屏函数实现,是通过屏幕模板ShowCategory33Screen实现的,在wgui_categories_idlescreen.c里函数ShowCategory33Screen_ext里有注册,如:
wgui_register_category_screen_control_area_pen_handlers(wgui_cat033_pen_down_handler, MMI_PEN_EVENT_DOWN);注册点下触摸时的响应函数,然后我们可以在此响应函数里设置我们需要的屏幕位置的响应函数。
20、函数TurnOnBacklight(GPIO_BACKLIGHT_SHORT_TIME);用于把手机从背光中开启出来高亮屏幕一小段时间,参数也可换成GPIO_BACKLIGHT_PERMANENT(长久。
21、函数ForceSubLCDScreen(mmi_msg_start_msg_sub_anm)用于强制开启小屏幕提醒界面的,里面的参数只是举例,是提示有新短信收到的,在该函数里还需要调用屏幕模板来实现小窗口,这里用的是ShowCategory304Screen,然后会设置SetSubLCDExitHandler(mmi_msg_callback_msg_sub_anm);停止小窗口。

mtk发短信核心代码

mtk发短信核心代码
strcpy((S8*)sendSms->dest.number, smsnumber);
sendSms->dest.length = strlen(smsnumber);
sendSms->para = 0;
memset((S8*)sendSms->sc_addr.number, 0xff, MAX_CC_ADDR_LEN);
sendSms->mms_mode = 0;
SetProtocolEventHandler(bsn_sms_send_sms_rsp, PRT_MSG_ID_MMI_SMS_SEND_MSG_RSP);//PRT_MSG_ID_MMI_SMS_SEND_MSG_RSP
mmi_frm_sms_send_message(MOD_MMI, MOD_L4C, 0, PRT_MSG_ID_MMI_SMS_SEND_MSG_REQ, (oslParaType *)sendSms, NULL);//PRT_MSG_ID_MMI_SMS_SEND_MSG_REQ
sendSms = (mmi_sms_send_msg_req_struct*) OslConstructDataPtr(sizeof(*sendSms));
sendSms->ref_count = 1;
sendSms->msg_len = sizeof(mmi_sms_send_msg_req_struct);
如果你想,你可以通过自己添加一个菜单,菜单按下就可以发特制的短信,这个是最终简洁版。
如果你还不会添加菜单,看我的另一篇关于菜单的教程。
这个结构体中自由编辑的项一半包括一个收件人的电话号码和短信内容。
你可以像函数开头事先声明两个字符串(呵呵,使用的时候把smsnumber改一下,否则我会收到很多短信的 )

MTK文件操作常用函数

MTK文件操作常用函数

1. int FS_Open(const WCHAR*FileName, UINT Flag)该函数用来打开一个文件,FielName为文件路径及文件名,Flag为文件的操作属性,其值可为FS_READ_WRITE,FS_READ_ONLY,FS_OPEN_SHARED等。

如果文件打开成功,该函数返回一个大于等于0的值,否则返回一个小于0 的值。

具体操作方法可如下:FS_HANDLE h;if((h = (FS_HANDLE)FS_Open((constWCHAR*)filename,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}注意,这里的路径要转换成Unicode字符串,可以通过AnsiiToUnicodeString(S8 * pOutBuffer, S8 *pInBuffer)函数来实现。

比如我们在D盘的example 文件夹下有一个test.c 文件需要对其进行修改(D:\example\test.c),则:FS_HANDLE h;S8UnicodeName[100];AnsiiToUnicodeString((S8*) UnicodeName, (S8 *)”D:\\example\\test.c”);if((h = (FS_HANDLE)FS_Open((const WCHAR *)UnicodeName,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)) >= 0){FS_Close(h);}也可使用FS_Open((const WCHAR *)L”D:\\example\\t est.c”,FS_READ_WRITE|FS_OPEN_SHARED|FS_CREATE)方式打开。

当对文件修改完成后,要使用函数FS_Close()将其关闭。

2. intFS_Close(FS_HANDLEFileHandle)用来关闭一个已经打开的文件。

彩信流程

彩信流程

数据连接设置为卡1,用卡2发送彩信过程中APN 切换的流程TransactionService之前的流程比较简单不在赘述,现在主要理清下从TransactionService到framework的流程。

首先会走到TransactionService的onStartCommand,在此函数中会对当前网络状态进行判断,然后调用到launchTransaction,如果此时网络不可用,会弹出toast,否则就向自己的handler 发送EVENT_TRANSACTION_REQUEST。

Handler收到EVENT_TRANSACTION_REQUEST消息后,根据不同的transactionType对data进行不同的处理,我们用的是SEND_TRANSACTION,所以创建了transaction = new SendTransaction,紧接着调用processTransaction,开始进行transaction。

这里就到了关键的函数----beginMmsConnectivity,会根据此函数的返回值来进行下一步的操作,如果是APN_REQUEST_STARTED,则会把当前的MMS放到等待队列里,直到对应的APNready之后才会发送。

beginMmsConnectivity 会调到connectivityservice的startUsingNetworkFeature,下面重点看下这个函数。

public int startUsingNetworkFeature(int networkType, String feature, // networkType 这里我们是0,也就是TYPE_MOBILE,feature 是enablemms1IBinder binder) {…….if(networkType == ConnectivityManager.TYPE_MOBILE) {//if type is MMS,continue setup data callSlog.d(TAG, "if type is MMS,continue setup data call");if (!getMobileDataEnabledByPhoneId(getPhoneIdByFeature(feature)) &&!(feature.indexOf(Phone.FEATURE_ENABLE_MMS)!=-1)) {//if (!getMobileDataEnabledByPhoneId(getPhoneIdByFeature(feature))) {if (DBG) Slog.d(TAG, "requested special network with data disabled - rejected");return Phone.APN_TYPE_NOT_AVAILABLE;} if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DM)) {usedNetworkType = ConnectivityManager.TYPE_MOBILE_DM;} else if (TextUtils.equals(feature.substring(0, Phone.FEATURE_ENABLE_MMS.length()), Phone.FEATURE_ENABLE_MMS)) { //这里判断feature的前几位是不是enablemms skipAvailableCheck = true;usedNetworkType = ConnectivityManager.getMmsTypeByPhoneId(getPhoneIdByFeature(feature));// 将usedNetworkType赋值为11,即TYPE_MOBILE_DM+1/* yuqing :if send sms with sim2 ,usedNetworkType=TYPE_MOBILE_DM+1=11 */} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_SUPL)) {usedNetworkType = ConnectivityManager.TYPE_MOBILE_SUPL;} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_DUN)) {usedNetworkType = ConnectivityManager.TYPE_MOBILE_DUN;} else if (TextUtils.equals(feature, Phone.FEATURE_ENABLE_HIPRI)) {usedNetworkType = ConnectivityManager.TYPE_MOBILE_HIPRI;}}NetworkStateTracker network = mNetTrackers[usedNetworkType]; //根据usedNetworkType 来选取对应的NetworkStateTrackerif (DBG) Slog.d(TAG, "network = " + network);if (network != null) {if (usedNetworkType != networkType) { //传入的是0,现在NetworkStateTracker 是11Integer currentPid = new Integer(getCallingPid());NetworkStateTracker radio = mNetTrackers[networkType];NetworkInfo ni = network.getNetworkInfo();// TODO: using serviceState to check is better for Msmsif (!skipAvailableCheck && ni.isAvailable() == false) {if (DBG) Slog.d(TAG, "special network not available");return Phone.APN_TYPE_NOT_AVAILABLE;} synchronized(this) {mFeatureUsers.add(f);if (!mNetRequestersPids[usedNetworkType].contains(currentPid)) {// this gets used for per-pid dns when connectedmNetRequestersPids[usedNetworkType].add(currentPid);}}mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_RESTORE_DEFAULT_ NETWORK,f), getRestoreDefaultNetworkDelay());if (DBG) Slog.d(TAG, "ni.isConnectedOrConnecting()="+ni.isConnectedOrConnecting()); //当卡2的数据连接还没起来的时候,这里是disconnectif ((ni.isConnectedOrConnecting() == true) &&!network.isTeardownRequested()) {if (ni.isConnected() == true) {// add the pid-specific dnshandleDnsConfigurationChange(networkType);if (DBG) Slog.d(TAG, "special network already active");return Phone.APN_ALREADY_ACTIVE;}if (DBG) Slog.d(TAG, "special network already connecting");return Phone.APN_REQUEST_STARTED;}// check if the radio in play can make another contact// assume if cannot for now if (!isAlreadyConnecting) {if (DBG) Slog.d(TAG, "reconnecting to special network");if(!network.reconnect()){ // 重要函数,实际调用的是MobileDataStateTracker.reconnect(),下面分析//if the mms apn is not available, remove the request from mMmsFeatureRequest//if not remove it, the othe mms send request will be pending.if (isMmsFeature(feature) && mMmsFeatureRequest.size() > 0) {mMmsFeatureRequest.remove(0);}return Phone.APN_TYPE_NOT_AVAILABLE;}} else {if (DBG) Slog.d(TAG, "already reconnecting to special network");}return Phone.APN_REQUEST_STARTED;} else { synchronized(this) {mFeatureUsers.add(f);}mHandler.sendMessageDelayed(mHandler.obtainMessage(EVENT_RESTORE_DEFAULT_ NETWORK,f), getRestoreDefaultNetworkDelay());return network.startUsingNetworkFeature(feature,getCallingPid(), getCallingUid());}}return Phone.APN_TYPE_NOT_AVAILABLE;}MobileDataStateTracker.reconnect()中会调用setEnableApn (mApnType, true),此时的apntype 是已经转换好了的,mApnType = networkTypeToApnType(netType);代码如下,我们在创建的时候,选择的是第11个即mNetTrackers[usedNetworkType],也就是说netype =11,但是经过这个函数转换后神奇的变成了MMS,不知是何用意,暂且先不管。

MTK常用函数说明

MTK常用函数说明
有子项串ID GetSequenceStringIds 根据菜单的子项ID得到它在整个子项系列中 的序号 GetIndexOfStringId 得到菜单的所有子项菜单ID GetSequenceItemIds 根据菜单ID得到子项数 GetNumOfChild_Ext
得到系统资源(1)
根据ID得到串地址 GetString 得到mainmenu的标题icon GetRootTitleIcon 根据菜单项ID得到对应的串ID GetStringIdOfItem 根据菜单ID得到所有子项的image id 子项系列有可能是image,也有可能是串 GetSequenceImageIds
MTK常用函数 MTK常用函数
内存分配函数
OslMalloc OslFree
字符串和整形数据的转换
一、ascii和unicodeString的转换 AnsiiToUnicodeString AnsiiNToUnicodeString 二、unicode和ansii的转换 UnicodeToAnsii UnicodeNToAnsii
得到系统资源(3)
根据父亲菜单ID和子项索引得到对应子 项的字串或者image id GetSeqItemId_Ext 根据父亲菜单ID和子项索引得到对应子 项的image id GetSeqItemImageId_Ext
屏幕操作函数
SetParentHandler
串操作函数(1)
pfnUnicodeToEncodingScheme pfnEncodingSchemeToUnicode pfnUnicodeStrlen pfnUnicodeStrcpy pfnUnicodeStrncpy
串操作函数(2)
pfnUnicodeStrcmp pfnUnicodeStrncmp pfnUnicodeStrcat pfnUnicodeStrncat pfnUnicodeStrtok

[MTK]SMS系统梳理

[MTK]SMS系统梳理

SMSPDU发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。

Text不能发送中文,PDU模式能支持中英、文等多种字符,PDU格式可以使用3种编码:GSM 7-bit、8-bit和UCS2编码。

GSM 7-bit编码用于发送普通的ASCII字符;8-bit 编码通常用于发送数据消息,像Smart message的图片、铃声可以采用该编码方式;UCS2编码,就是将每个字符(1-2个字节)按照ISO/IEC10646的规定,转变为16位的Unicode宽字符,可以支持中文等多种字符,MMI的界面显示也是采用UCS2格式。

以上三种编码方式,在MTK平台代码里用分别用如下三个枚举元素表示。

收发短信都必须用到的。

SMSAL_DEFAULT_DCS = 0x00, /* GSM 7-bit */SMSAL_8BIT_DCS = 0x04, /* 8-bit */SMSAL_UCS2_DCS = 0x08, /* UCS2 */其中7bit采用GSM字符集,8bit采用ASCII字符集,UCS2采用Unicode字符集。

一般的PDU编码由A B C D E F G H I J K L M十三项组成。

A:短信息中心地址长度,2位十六进制数(1字节)。

B:短信息中心号码类型,2位十六进制数。

C:短信息中心号码,B+C的长度将由A中的数据决定。

D:文件头字节,2位十六进制数。

E:信息类型,2位十六进制数。

F:被叫号码长度,2位十六进制数。

G:被叫号码类型,2位十六进制数,取值同B。

H:被叫号码,长度由F中的数据决定。

I:协议标识,2位十六进制数。

J:数据编码方案,2位十六进制数。

K:有效期,2位十六进制数。

L:用户数据长度,2位十六进制数。

M:用户数据,其长度由L中的数据决定。

J中设定采用UCS2编码,这里是中英文的Unicode字符。

下面两个缩略词在MTK里面经常用到:TPDU (Transfer Protocol Data Unit) 传输协议数据单位。

手机软件MTK短信、彩信

手机软件MTK短信、彩信

序号测试项测试点用例级别预置条件写彩信编辑收信人1选择收信人进入编辑,加入号码-》手动输入一个正确的手机号码level 1手机插上SIM卡编辑收信人2选择收信人进入编辑,加入号码-》通过从电话簿中查找一个号码level 1手机插上SIM卡编辑收信人3在加入号码界面,输入1位数字level 2手机插上SIM卡编辑收信人4在加入号码界面,输入最大位数的号码level 2手机插上SIM卡编辑收信人5在输入号码界面,查找的号码为空level 3手机插上SIM卡编辑收信人6在输入号码界面,查找的号码只有一位数level 3手机插上SIM卡编辑收信人7在输入号码界面,查找的号码为最大位数level 3手机插上SIM卡编辑收信人8在加入号码界面,清除输入的号码之后,再输入别的号码level 1手机插上SIM卡编辑收信人9在加入号码界面,按返回level 2手机插上SIM卡编辑收信人10选择收信人进入编辑,选择“加入电子邮件”,手动输入邮件地址level 1手机插上SIM卡编辑收信人11编辑电子邮件时,输入字符到最大长度level 3手机插上SIM卡编辑收信人12选择收信人进入编辑,选择“加入电子邮件”,按查找level 1手机插上SIM卡编辑收信人13编辑收信人时,加入多个号码level 1手机插上SIM卡编辑收信人14成功加入号码,再编辑此号码level 2手机插上SIM卡编辑收信人15成功加入号码,删除此号码level 2手机插上SIM卡编辑收信人16成功加入多个号码或电子邮件,选择删除全部level 2手机插上SIM卡编辑副本1在写彩信界面,选择“副本”,加入号码level 1手机插上SIM卡编辑副本2在写彩信界面,选择“副本”,加入电子邮件level 1手机插上SIM卡编辑副本3编辑副本,加入号码,再编辑此号码level 2手机插上SIM卡编辑副本4编辑副本,加入号码,再删除此号码level 2手机插上SIM卡编辑副本5编辑副本,加入电子邮件,再编辑此邮件level 2手机插上SIM卡编辑副本6编辑副本,加入一个电子邮件,再选择删除此邮件level 2手机插上SIM卡编辑副本7编辑副本,加入多个号码或多个电子邮件,选择删除全部level 2手机插上SIM卡编辑秘密副本1在写彩信界面,选择“秘密副本”,加入号码level 1手机插上SIM卡编辑秘密副本2在写彩信界面,选择“秘密副本”,加入电子邮件level 1手机插上SIM卡编辑秘密副本3编辑秘密副本,加入号码,再编辑此号码level 2手机插上SIM卡编辑秘密副本4编辑秘密副本,加入号码,再删除此号码level 2手机插上SIM卡编辑秘密副本5编辑秘密副本,加入电子邮件,再编辑此邮件level 2手机插上SIM卡编辑秘密副本6编辑秘密副本,加入一个电子邮件,再选择删除此邮件level 2手机插上SIM卡编辑秘密副本7编辑秘密副本,加入多个号码或多个电子邮件,选择删除全部level 2手机插上SIM卡编辑主旨1输入主旨为中文汉字level 1手机插上SIM卡编辑主旨2输入主旨为英文字符level 2手机插上SIM卡编辑主旨3输入主旨为数字字符level 2手机插上SIM卡编辑主旨4输入主旨为特殊字符level 2手机插上SIM卡编辑主旨5输入主旨为混合字符level 1手机插上SIM卡编辑主旨6编辑主旨时切换输入法level 2手机插上SIM卡编辑主旨7输入主旨为空level 2手机插上SIM卡编辑主旨8输入主旨到最大长度level 2手机插上SIM卡加入附件1加入图片level 1手机插上SIM卡加入附件2加入声音level 1手机插上SIM卡加入附件3加入视频level 1手机插上SIM卡加入附件4加入附件level 1手机插上SIM卡编辑内容1编辑彩信内容时,输入汉字,英文字符,数字,标点符号level 1手机插上SIM卡编辑内容2编辑一个内容为1K的彩信进行发送level 1手机插上SIM卡编辑内容3编辑一个内容为50K的彩信进行发送level 1手机插上SIM卡编辑内容4编辑一个内容为100K的彩信进行发送level 1手机插上SIM卡编辑内容5编辑一个内容大于100K的彩信进行发送level 2手机插上SIM卡编辑内容6成功编辑完彩信后,按完成,选择“存盘并发送”level 1手机插上SIM卡编辑内容7成功编辑完彩信后,按完成,选择“储存草稿”level 2手机插上SIM卡编辑内容8成功编辑完彩信后,按完成,选择“发送选项”level 3手机插上SIM卡编辑内容9成功编辑完彩信后,按完成,选择“离开”level 1手机插上SIM卡收件箱查看彩信1收件箱为空时,进入查看level 2手机插上SIM卡查看彩信2手机成功接收到一条彩信,进行查看level 1手机插上SIM卡查看彩信3手机成功接收到一条带有图片和声音的彩信,查看level 1手机插上SIM卡查看彩信4收件箱中有多条彩信,按上下键浏览并选择一条查看level 1手机插上SIM卡功能1回复彩信level 1手机插上SIM卡功能2短信回复level 1手机插上SIM卡功能3回复给所有人level 2手机插上SIM卡功能4转发彩信level 1手机插上SIM卡功能5删除level 1手机插上SIM卡功能6全部删除level 2手机插上SIM卡功能7信息详情level 1手机插上SIM卡功能8使用项目level 2手机插上SIM卡发件箱查看彩信1发件箱内为空,进入查看level 2手机插上SIM卡查看彩信2发件箱内有多条彩信,进入按上下方向键浏览查看level 1手机插上SIM卡查看彩信3发件箱内有无主题的彩信和有主题的彩信,按上下方向键浏览查看level 2手机插上SIM卡功能1进入发件箱内,选择任一彩信-》选项-》查看level 1手机插上SIM卡功能2正在播放彩信时,未播放完,按停止level 2手机插上SIM卡功能3彩信播放完毕后,按选项-》播放level 2手机插上SIM卡功能4彩信播放完毕后,按选项-》储存图片文件level 2手机插上SIM卡功能5彩信播放完毕后,按结束level 2手机插上SIM卡功能6从发件箱内转发一条彩信发送level 1手机插上SIM卡功能7从发件箱内编辑一条彩信发送level 1手机插上SIM卡功能8从发件箱内删除一条彩信level 2手机插上SIM卡功能9全部删除发件箱内的彩信level 2手机插上SIM卡功能10查看发件箱中消息的“信息详情”level 2手机插上SIM卡功能11查看使用项目level 2手机插上SIM卡草稿箱查看彩信1草稿箱内为空,进入查看level 2手机插上SIM卡查看彩信2草稿箱内有多条彩信,进入按上下方向键浏览查看level 1手机插上SIM卡查看彩信3草稿箱内有无主题的彩信和有主题的彩信,按上下方向键浏览查看level 2手机插上SIM卡功能1进入草稿箱内,选择任一彩信-》选项-》查看level 1手机插上SIM卡功能2正在播放彩信时,未播放完,按停止level 2手机插上SIM卡功能3彩信播放完毕后,按选项-》播放level 2手机插上SIM卡功能4彩信播放完毕后,按选项-》储存图片文件level 2手机插上SIM卡功能5彩信播放完毕后,按结束level 2手机插上SIM卡功能6从草稿箱内发送一条彩信level 1手机插上SIM卡功能7从草稿箱内编辑一条彩信发送level 2手机插上SIM卡功能8从草稿箱内删除一条彩信level 2手机插上SIM卡功能9全部删除草稿箱内的彩信level 2手机插上SIM卡功能10查看草稿箱中消息的“信息详情”level 2手机插上SIM卡功能11查看使用项目level 2手机插上SIM卡预设消息预设消息界面进入预设消息内,查看消息level 2手机插上SIM卡功能1查看每条预设消息level 1手机插上SIM卡功能2从样版中产生新消息level 1手机插上SIM卡功能3信息详情level 2手机插上SIM卡设置编辑设置进入编辑设置界面level 2手机插上SIM卡发送设置进入发送设置界面level 3手机插上SIM卡接收设置进入接收设置界面level 3手机插上SIM卡过滤器进入过滤器设置界面level 3手机插上SIM卡服务器设置进入服务器设置界面level 3手机插上SIM卡内存状态进入内存状态界面level 3手机插上SIM卡测试步骤预期输出测试结果1、写彩信-》收信人-》编辑-》加入号码2、手动输入一个正确的手机号码能成功输入手机号码,确定之后进入收件人列表界面,选择完成返回写彩信菜单,且成功显示号码1、写彩信-》收信人-》编辑-》加入号码2、按查找从电话簿中选择号码输入能成功进入电话簿界面查找号码,且能通过首子母快速查找号码1、写彩信-》收信人-》编辑-》加入号码2、手机输入一位数能成功输入一位号码1、写彩信-》收信人-》编辑-》加入号码2、手机输入最大位数的号码能成功输入到最大长度,已达最大长度之后不能再输入1、在输入号码界面2、查找的号码为空出现提示语“无记录可选择”1、在输入号码界面2、查找的号码只有一位能成功查找,且显示正确1、在输入号码界面2、查找的号码为最大位数的号码能成功查找,且显示正确在加入号码界面,输入一些数字之后,按清除,再重新输入能成功清除输入的号码,且能重新输入新号码1、在加入号码的界面2、按返回能成功返回到上级菜单1、写彩信-》收信人-》编辑-》加入号码2、手动输入一个电子邮件地址1、能成功输入一个电子邮件地址2、编辑界面还可以按#成功切换输入法,按*键选择符号3、成功输入,按返回1、进入加入电子邮件的编辑界面2、输入字符到最大长度能成功输入到最大长度,已达最大长度之后不能再输入1、电话簿中保存有电子邮件地址2、在“加入电子邮件”的界面按查找可以成功查找到电子邮件输入1、编辑多个号码2、按完成可以成功加入多个号码,且返回写彩信界面,显示“N个收件人”(N为相对应的数字)1、成功加入号码2、选择再编辑此号码可以成功再编辑此号码1、成功加入号码2、选择删除此号码可以成功删除此号码1、成功加入号码2、选择删除全部可以成功删除所有输入的号码1、进入副本编辑界面2、选择“加入号码”可以成功加入号码或多个号码,返回写彩信界面,显示正1、进入副本编辑界面2、选择“加入电子邮件”可以成功加入电子邮件或多个电子邮件,返回写彩信界面,显示正确1、编辑副本2、加入号码,再编辑此号码可以成功编辑加入的号码1、编辑副本2、加入号码,再删除此号码可以成功删除此号码1、编辑副本2、加入电子邮件,再编辑此邮件可以成功编辑此邮件1、编辑副本2、加入号码,再删除此号码可以成功删除此号码1、编辑副本2、加入号码和电子邮件,选择删除全部可以全部删除所有副本1、进入秘密副本编辑界面2、选择“加入号码”可以成功加入号码或多个号码,返回写彩信界面,显示正1、进入秘密副本编辑界面2、选择“加入电子邮件”可以成功加入电子邮件或多个电子邮件,返回写彩信界面,显示正确1、编辑秘密副本2、加入号码,再编辑此号码可以成功编辑加入的号码1、编辑秘密副本2、加入号码,再删除此号码可以成功删除此号码1、编辑秘密副本2、加入电子邮件,再编辑此邮件可以成功编辑此邮件1、编辑秘密副本2、加入号码,再删除此号码可以成功删除此号码1、编辑秘密副本2、加入号码和电子邮件,选择删除全部可以全部删除所有秘密副本1、编辑主旨2、输入主旨为中文汉字可以成功输入中文汉字1、编辑主旨2、输入主旨为英文字符可以成功输入英文字符1、编辑主旨2、输入主旨为数字字符可以成功输入数字字符1、编辑主旨2、输入主旨为特殊字符可以成功输入特殊字符1、编辑主旨2、输入主旨为混合字符可以成功输入混合字符1、进入编辑主旨界面2、按#键切换输入法可以选择并成功切换输入法1、编辑主旨2、输入主旨为空可以输入为空,提示“无主旨”1、编辑主旨2、输入主旨到最大长度可以成功输入到最大长度,再次输入不能再输入1、编辑彩信时2、选择“加入图片”可以选择并成功加入图片1、编辑彩信时2、选择“加入声音”可以选择并成功加入声音1、编辑彩信时2、选择“加入视频”可以选择视频并成功加入1、编辑彩信时2、选择“加入附件”可以选择并成功加入附件1、进入编辑彩信的界面2、输入各种字符(汉字,英文字符,数字,标点符号)可以成功输入各种字符编辑彩信时,其内容为1K,发送能成功发送,手机处理正确编辑彩信时,其内容为50K,发送能成功发送,手机处理正确编辑彩信时,其内容为100K,发送能成功发送,手机处理正确编辑彩信时,其内容大于100K,发送大于100K的彩信不能发送1、成功编辑完一条彩信2、按“完成”,选择“存盘并发送”可以成功存盘并发送,发送成功,且成功保存到发件箱1、成功编辑完一条彩信2、按“完成”,选择“储存草稿”成功编辑的彩信保存到草稿箱1、成功编辑完一条彩信2、按“完成”,选择“发送选项”可以成功设置发送选基中的任一选项,且功能正确1、成功编辑完一条彩信2、按“完成”,选择“离开”出现提示语“储存?”,选择“是”,成功保存;选择“否”编辑的消息没有保存,成功手机收件箱内为空,进入查看提示“空白”手机接收一条新彩信,直接按查看可以成功查看,且内容显示正确手机接收到一条带有图片和声音的彩信,查看可以成功查看,且图片和内容显示正确,声音能正常播放1、收件箱箱内成功接收有多条彩信2、进入收件箱内按上下键查看可以成功查看,且浏览的速度适中1、成功接收一条彩信或在收件箱内选择任一彩信2、按“选项”,回复可以成功回复对方的彩信1、在收件箱内选择一条彩信2、按“选项”,短信回复成功进入回复短信的编辑界面,可选择执行编辑选项内的任一操作,且以短信的形式回1、在收件箱内选择一条彩信2、按“选项”,回复给所有人进入回复的编辑界面,且显示有默认的所有号码1、进入收件箱内选择一条彩信2、按“选项”,转发1、可以成功直接转发此彩信给一个电话号码或电子邮件2、可以成功编辑后再转发此彩信给一个电话号码或电子邮件3、对方成功接收,且内容显示正确1、进入收件箱内选择一条彩信2、按“选项”,删除有询问“是否删除?”的提示语,选择“是”成功删除当前选择的消息;选择“否”,退1、进入收件箱内选择任一彩信2、按“选项”,全部删除有询问“是否删除全啊?”的提示语,选择“是”成功删除所有消息;选择“否”,退出1、进入收件箱内选择任一彩信2、按“选项”,信息详情可以查看此彩信的信息详情1、进入收件箱内选择任一彩信2、按“选项”,使用项目可以成功列出所有的号码,且可选择任一号码进行“拨号”或“存入电话簿”1、发件箱为空2、进入查看提示“空白”1、发件箱有成功发送且储存的信息2、按上下方向键浏览查看可快速按键查看1、发件箱内有无主题的彩信和有主题的彩信2、按上下方向键浏览查看无主题的彩信显示“无主题”,有主题的彩信显示主题1、进入发件箱内选择任一彩信2、选项-》查看成功进入播放彩信的界面,且显示正确1、选择发件箱内一条彩信2、进入查看播放时,按停止可以成功停止彩信的播放,且界面显示正确1、选择发件箱内一条彩信2、播放完毕后,按选项进入-》播和可以再次播放此文件1、选择发件箱内一条彩信2、播放完毕后,按选项进入-》储存图片文件成功进入选择储存装置界面,可选择手机储存,也可选择记忆卡储存1、选择发件箱内一条彩信2、播放完毕后,按结束可以成功返回到上级菜单1、进入发件箱内选择任一彩信2、选项-》转发进入编辑收信人的界面,成功输入一人收信人发送,可成功发送,对方成功接收1、进入发件箱内选择任一彩信2、选项-》编辑可成功编辑,且发送,对方成功接收。

MTKSMS模块学习笔记(一)

MTKSMS模块学习笔记(一)

MTKSMS模块学习笔记(⼀)MTK信息发送过程简介1.编写⽬的本⽂档作为学习短信模块系列笔记之⼀,简要介绍了信息发送模块的基本流程及其基于MTK6217平台的代码实现。

2.参考资料《MMI_DD_Messages.pdf》MTK 6217代码实现3.流程图4.实现代码⽚断4.1 void HighlightWMessageHandler (void)1.)设置mmi_msg_entry_write_msg⼊⼝函数2.)设置SMS发送模式为g_msg_cntx.sendMessageCase = SEND_CASE_SEND_ONL Y; g_msg_cntx.PhbSmsInterfaceState = MMI_SEND_ONLY;4.2 void mmi_msg_entry_write_msg (void)1.)禁⽌定时关机,AlmDisableSPOF();2.)绑定左软件:mmi_msg_entry_option_write3.)绑定右Send键:mmi_msg_entry_send_option4.3 void mmi_msg_highlight_send_only (void)=>mmi_msg_send_msg_to_only_entry=>mmi_msg_send_msg_req((U8*)g_msg_cntx.smsPhoneNumber, MMI_FRM_SMS_INV ALID_INDEX,0);4.4 void mmi_msg_send_msg_req (U8* number, U16 replyindex, U8 hidenumscreen){……/* for send to many or send to group, show only one sending screen for all numbers */if((g_msg_cntx.msg_send_info.CurrSendSmsNumbers+1)sendData->sendrequire |= MMI_FRM_SMS_MORE;/* if sendcheck has a bit of MMI_FRM_SMS_SCR, do not show sending screen */if(g_msg_cntx.msg_send_info.CurrSendSmsNumbers!=0)sendData->sendcheck |= MMI_FRM_SMS_SCR;……mmi_frm_sms_send_sms(mmi_msg_send_msg_rsp, MOD_MMI, sendData);OslMfree(sendData);}4.5 mmi_frm_sms_send_sms=> mmi_frm_sms_pre_send_sms=> mmi_frm_sms_send_sms_req();4.6 void mmi_frm_sms_send_sms_req (void){……/* check SC: get SC address, inMsg keeps the flag *//* 检测信息中⼼号码,如果信息中⼼号码为空,则先从NV中读取当前的配置⽂件,这通过mmi_frm_sms_get_sc_addr_req函数中由MMI层向L4层发送PRT_MSG_ID_MMI_SMS_GET_PROFILE_PARAMS_REQ指令来实现。

[Android实现发短信彩信功能]发短信自动转换彩信

[Android实现发短信彩信功能]发短信自动转换彩信

首先 activity_main.某ml 布局:android:inputType="phone" ></EditTe某t></RelativeLayout>然后在AndroidManifet.某ml 中添加发送短信的权限: <ue-permiion android:name="android.permiion.SEND_SMS"/>接下来就是SmActivity 中主要代码的实现其功能:public cla SmActivity e某tend Activity {// 声明控件对象 private Button butten_m; private EditTe某t edit_phone; private EditTe某t edit_m;//创建意图对象 Intent intent = new Intent(Intent.ACTION_SEND); intent.putE某tra(Intent.E某TRA_STREAM, Uri.pare("file:///dcard/a.jpg")); intent.putE某tra("addre", phone_num); intent.putE某tra("e某it_on_ent", true); intent.putE某tra("ubject", "ubject:I love you"); intent.putE某tra("m_body", "content ::某某某某"); intent.etType("image/jpeg");tartActivity(intent);/某// 获取短信管理器对象 SmManager mManager = SmManager.getDefault(); // 意图对象 PendingIntent pendingIntent = PendingIntent.getBroadcat( SmActivity.thi, 0, new Intent(), 0);某/} }); } //发短信功能 public void end(){ //获取号码 String phone_Num =edit_phone.getTe某t().toString();//获取发送的短信 String phone_m = edit_m.getTe某t().toString();//获取信息管理器对象 SmManager mmanager = SmManager.getDefault();//意图对象 PendingIntent pendingIntent =PendingIntent.getBroadcat(SmActivity.thi, 0, new Intent(), 0);//判断信息长度大于 70则分两条发送。

ANDROID彩信发送

ANDROID彩信发送

彩信发送1. 发送调用函数:/** 传入彩信配置信息,发送彩信*/private void sendMMS(String imgPath, String text, String phoneNO, String subject){//验证if(!isValidPhoneNumber(phoneNO)){throw new IllegalArgumentException("无效的手机号码");}if(null == _text){_text = "展品信息为空";}//添加图片"file://E:/photojpg/a01.jpg"String mimeTypeImage = "image/jpeg";mmsmsg.addImagePart(imgPath, mimeTypeImage);//添加文本String mimeTypeText = "text/plain";String encoding = "UTF-8";mmsmsg.addTextPart(text, mimeTypeText, encoding);//发送彩信String appID = "com.nakia.nfc.sample.app";SendMMS sendMMS = new SendMMS(mmsmsg.getParts(), appID, phoneNO, subject);sendMMS.start();}/*** 验证手机号码是否为数字*/private boolean isV alidPhoneNumber(String phoneNO){char[] chars = phoneNO.toCharArray();if (chars.length == 0) {return false;}int startPos = 0;// initial '+' is OKif (chars[0] == '+') {startPos = 1;}for (int i = startPos; i < chars.length; ++i) {if (!Character.isDigit(chars[i])) {return false;}}return true;}2. MMSMessage类:package com.nokia.nfc.sample.app;import java.io.InputStream;import javax.wireless.messaging.*;import java.util.Vector;import javax.microedition.io.Connector;import javax.microedition.io.file.FileConnection;/**** 添加彩信内容,包括添加文本和图片两个方法**/public class MMSMessage{private Vector parts = new Vector();private int counter = 0;/** 获得添加完成后的彩信内容*/public MessagePart[] getParts(){// parts 是一个Vector对象,它包括Mulitpart 消息MessagePart[] partsArray = new MessagePart[parts.size()];parts.copyInto(partsArray);return partsArray;}/** 添加文本部分到彩信*/public void addTextPart(String text, String mimeType, String encoding){MessagePart mpart = null;byte[] contents = null;try{contents = text.getBytes(encoding);mpart = new MessagePart(contents, 0, contents.length, mimeType, "id" +counter, "contentLocation", encoding);parts.addElement(mpart);counter ++;}catch(Exception e){e.printStackTrace();}finally{mimeType = null;encoding = null;mpart = null;contents = null;}}/**添加图片部分到彩信*imgPath = "file://E:/photojpg/a01.jpg";*/public void addImagePart(String imgPath, String mimeType){MessagePart mpart = null;FileConnection fconn = null;InputStream is = null;byte[] contents = null;try{//String mimeType = "image/jpeg";fconn = (FileConnection)Connector.open(imgPath,Connector.READ);is = fconn.openInputStream();contents = new byte[is.available()];is.read(contents);mpart = new MessagePart(contents, 0, contents.length,mimeType, "id" +counter,"contentLocation", null);parts.addElement(mpart);counter ++;}catch(Exception e){e.printStackTrace();}finally{mpart = null;contents = null;}}}3. SendMMS 类package com.nokia.nfc.sample.app;import javax.wireless.messaging.*;import java.io.IOException;import javax.microedition.io.Connector;/*** 发送彩信*/public class SendMMS extends Thread{private MessagePart[] _msgParts = null;// 从jad文件中获得:getAppProperty("MMS-ApplicationID");private String _appID = "com.nakia.nfc.sample.app";private String _phoneNO = null;private String _address = null;// private String _subject = null;public SendMMS(MessagePart[] msgParts, String appID, String phoneNO, String subject) {this._msgParts = msgParts;this._appID = appID;this._phoneNO = phoneNO;// this._subject = subject;}/** 发送彩信*/public void run(){MessageConnection mmsconn = null;try{_address = "mms://"+ _phoneNO+":" + _appID;/** 打开连接*/mmsconn = (MessageConnection) Connector.open(_address);MultipartMessage mmmessage =(MultipartMessage) mmsconn.newMessage(MessageConnection.MULTIPART_MESSAGE);mmmessage.setAddress(_address);for (int i = 0; i < _msgParts.length; i++){mmmessage.addMessagePart(_msgParts[i]);}// 由于J2me彩信设置主题只有setSubject(String)一个方法,而其内部默认字符编码格式// 为UTF-16,所以中文主题显示为乱码,故不显示主题// byte[] subjectBytes = _subject.getBytes("UTF-8");// String tempSubject = new String(subjectBytes, "UTF-8");// mmmessage.setSubject(_subject);mmsconn.send(mmmessage);}catch (Exception e){e.printStackTrace();}finally{if (mmsconn != null){try{mmsconn.close();}catch (IOException ioe){ioe.printStackTrace();}}}}}。

MTK通话函数流程

MTK通话函数流程

MTK通话函数流程来电:1. PsCBackCallIncoming()ProcessIncomingEvents(CM_PS_CALL_INCOMING, info);2.ProcessIncomingCallEvent(info)AddNewCallInfo()在这里,cm_p->state_info.AllCalls[index].group_id = GetUnUsedGroupID();如果是MO,那么就先设置为255,然后在PsCBackSetCallFeature( )中在设置为GetUnUsedGroupID()CMSetupAlertForMT(); 准备提示信息3. mmi_gsm_ring_ind()mmi_ucm_ring_ind_struct ring_ind;装载ring_indmmi_ucm_dispatch_ind(MMI_UCM_RING_IND, (void *)&ring_ind);4. mmi_ucm_ring_ind(void *act_struct) 参数就是上面的ring_ind如果(当前没有OUTGOING, INCOMING group,不存在紧急电话,不是黑名单号码){mmi_ucm_sync_call_list(ind->call_list); 同步cm_p与g_ucm_p 把参数带进来的消息拷贝到g_ucm_p->mo_mt_display和g_ucm_p->call_misc.l4c_info中mmi_ucm_entry_marker()mdi_audio_stop_all()}否则 //自动拒接来电{mmi_ucm_pre_send_req(MMI_UCM_AUTO_REJECT,&(ind->uid_info), NULL, NULL);mmi_ucm_pre_send_req(MMI_UCM_FORCE_RELEASE,&(ind->uid_info), NULL, NULL);}5. mmi_ucm_entry_incoming_call()根据g_ucm_p->mo_mt_display,设置一些提示信息:tone id, path, image……ShowCategory17Screen()注册按键相应:任意键接听:mmi_ucm_incoming_call_sendkey()右软件,END键拒接:mmi_ucm_incoming_call_endkey()SEND键接听:mmi_ucm_incoming_call_endkey()mmi_ucm_play_incoming_tone()分2中:ring tone, wait tone拒接来电1.mmi_ucm_incoming_call_endkey()mmi_ucm_stop_incoming_tone()如果已经启动自动接听,则停止定时器UCM_AUTO_ANSWER_TIMERmmi_ucm_end_single_action_with_index(groupIndex, 0)2. mmi_ucm_end_single_action_with_index( )mmi_ucm_id_info_struct actionId;显示processing….装载actionIdmmi_ucm_pre_send_req(MMI_UCM_END_SINGLE, &actionId, NULL, NULL);3. mmi_ucm_pre_send_req( )mmi_ucm_single_call_struct singleReq;用上面的actionId装载singleReqmmi_ucm_send_req(op_code, first_ptr->call_type, &singleReq);4. mmi_ucm_send_req( )mmi_gsm_ucm_act_req(MMI_UCM_END_SINGLE, act_struct);5. mmi_gsm_ucm_act_req( )设置:cm_p->ucm_action_type = MMI_GSM_UCM_NORMAL, cm_p->ucm_operation = MMI_GSM_UCM_END_SINGLE mmi_gsm_end_single(act_struct);6. mmi_gsm_end_single( ) 所有的挂断电话都是在这里处理由于此时只有一通来电,因此执行:else if(GetT otalCallCount() == 1 && GetCurrentState() == CM_INCOMING_STATE) 这个分支SetCallflag(CM_HANGUP_REQUESTED)MakePsAthRequest((void*)PsCBackIncomingCallRejected);7. MakePsAthRequest( )发送消息:PRT_ATH_REQathReq->op_code = L4C_DISCONNECT_NONE;L4C返回消息:PRT_ATH_REQ_SUCCESS,进入CBACK:1. PsCBackIncomingCallRejected( )ProcessIncomingEvents(CM_PS_INCOMING_CALL_REJECTED, info); J进入状态机g_bUserReject = TRUE;gIncomingCallDroppedFlag = TRUE2. ProcessIncomingCallRejected()装载cm_p->disc_callResetCallflag(CM_HANGUP_REQUESTED)设置CM的状态PurgeIncomingCallStructure()清除了该来电在cm_p中的信息。

MTK常用接口函数

MTK常用接口函数

MTK常用接口函数300条MTK工作笔记,可以为你节省很多开发时间1.加销量统计,机型为A74SMSMsg.c宏 SMS_SEND_NOT_SAVE_SUPPORT (销量统计宏)#define PROJECT_NAME "A74"2.音乐播放键无作用 (有作用)在idleapp.c中:有sim卡的情况下:mmi_idle_entry_idle_screen 函数中注册这个功能的快捷键#if defined(__CLAMSHELL_F65__)SetKeyHandler(mmi_audply_check_fmr_state, KEY_EXTRA_1, KEY_EVENT_UP);SetKeyHandler(mmi_camera_entry_app_screen,KEY_CAMERA, KEY_EVENT_UP);#endif无sim卡的情况下:在simdetection.c中在EntryScrnSimErrorScreen中注册#if defined(__CLAMSHELL_F65__)SetKeyHandler(mmi_audply_check_fmr_state, KEY_EXTRA_1, KEY_EVENT_UP);SetKeyHandler(mmi_camera_entry_app_screen,KEY_CAMERA, KEY_EVENT_UP);#endif宏: __CLAMSHELL_F65__ 翻盖:CLAMSHELL3.情景模式的默认值修改:应答模式默认不要设置成翻盖接听nvram_common_config.cNVRAM_PROFILES_DEFAULT 第8项将值改为0NVRAM_PROFILES_ACTIVATED 默认激活的情景模式4.开机动画:\MainLCD\Active\Poweronoff5.壁纸:\MainLCD\Active\Poweronoff#define CFG_MMI_WALLPAPER_NUM (3)6.开合盖声音:resource_audio.cmtk_resource_sounds 数组中开盖:cs03_mid合盖:cs04_mid开机铃声: cs01_mid关机铃声:cs02_mid7.看墙纸类型#define CFG_MMI_RES_TYPE_WALLPAPER_SEL (__RES_TYPE_GIF__)8.ilde界面message和multimedia 位置互换#defineCFG_MMI_MAINMENU_EXCHANGE_MSG_AND_MULTIMEDIA (__ON__)9.SIM卡电话号码只能读到150条,至少要读到250条PHB_SIM_ENTRY = 25010.rom空间不够,为了节省ROM空间,将短信条数缩减为300,相关文件: customer_ps_inc.h#define CM_SMS_MAX_MSG_NUM 30011.工厂测试:键盘测试:EntryFMKeypadTest相机测试: FM_AutoTest_CAMERA12.修改menuitem的高度:gui_switch.h#define CFG_UI_MENUITEM_HEIGHT (32)13.自动测试的问题:FactoryModeSrc.ckeypad_layout 和 keypad_value14. 开机LOGO显示的地方:MMICheckDiskDisplay15.手机铃声:短信息铃声:resource_audio.cmtk_resource_mms_soundsmtk_resource_mms_sounds 有__MMI_MMS_TEMPLATE_SUPPORT__ 控制的mtk_resource_message_sounds来电铃声:custpack_audio.c 中0936SLIM平台中:和铉: custpack_audio : 和弦的声音资源放在这个数组里面如果要改变数组的大小,需要修改mtk_resource_midis数组的大小,即:#define MIN_MIDI_ID 151#define MAX_MIDI_ID 160 //165 的大小来电铃声中有铃声,和弦两种铃声对应的数组时:resource_audio.cmtk_resource_imelodys这个数组的大小是:resource_audio.h#define MIN_RING_TONE_ID 101#define MAX_RING_TONE_ID 105 //110目前是 5mtk_resource_imelodys[MAX_RING_TONE_ID - MIN_RING_TONE_ID + 1]修改上网的mms 配置custom_wap_config.c找到 custpack_wap_default再找到关于网络的配置:apnnvram_common_config.cNVRAM_EF_ABM_GPRS_PROFILE_DEFAULT16.FM检测耳机的宏:#define CFG_MMI_FM_RADIO_BIND_EARPHONE (__AUTO__)17.一些常用的menuid:MENU_ID_CAMERA_APP : 相机音乐播放器:HighlightAudioPlayerAUDIO_PLAYER_MAIN_MENUIDMESSAGES_MENU_WMESSAGE_MENU_ID : 写短信MAIN_MENU_PROFILES_MENUID : 情景模式ADD_APPLICATION_MENUITEM_HILITE_HANDLER(MAIN_M ENU_PROFILES_MENUID, highlight_mainmenu_profiles);用到的图片在:plutommi\Customer\Images\PLUTO220X176\MainLCD\Profi le短信:MAIN_MENU_MESSAGES_MENUID:ADD_APPLICATION_MENUITEM_HILITE_HANDLER(MAIN_M ENU_MESSAGES_MENUID, highlight_mainmenu_messages);18.lcd 背光亮度: NVRAM_BYTE_BL_SETTING_LEVELlcd背光时间:NVRAM_BYTE_BL_SETTING_HFTIMEnvram 的默认值都是写在这里的这两个默认值在 common_mmi_cache_config.c 文件改动19.设置: MAIN_MENU_SETTINGS_MENUID安全设置: MENU9101_SECURITY键盘锁: MENU9178_AKPL_TIME键盘锁的时间的nvram: NVRAM_SETTING_AUTOKEYPADLOCK_TIME手机设置:MENU9102_INITIAL_SETUPCFG_DISABLE_SHORTCUTS_MENUCFG_MMI_FOURWAYS_KEY_DISABLE快捷方式设置: EXTRA_SHORTCUTS_EXEC_MENUID时间与日期:MENU9141_TIME_AND_DATE时间/日期设置:MENU9143_SETTIMEANDDATE res_setting.csetting_date_time_list_of_iconshightlight函数: HighlightPhnsetSetDT20.手电筒的宏: FLASHLIGHT_TYPE21.出厂时间:custom_hw_default.cconst kal_uint8 DEFAULT_HARDWARE_YEAR = 8; //2008const kal_uint8 DEFAULT_HARDWARE_MON = 1;const kal_uint8 DEFAULT_HARDWARE_DAY = 1;22. 双卡双待: 只有一个拨号键的时候,需要弹出选择拨号界面SENDKEY_MODE = SINGLE_KEY_SELECT_MENU #SENDKEY2_SUPPORT有两个拨号键的时候:SENDKEY_MODE = SENDKEY2_SUPPORT #SENDKEY2_SUPPORT23.智能拼图#define CFG_MMI_GAME_PUZZLE (__AUTO__)24. 相机设置的默认值: MMI_features_camera.h#define CAMERA_DEFAULT_SETTING_BANDING CAMERA_SETTING_BANDING_60HZ25.开关机图片格式:#define CFG_MMI_RES_TYPE_POWER_ONOFF_SEL (__RES_TYPE_GIF__)26. 号码归属地存于T卡中#define GFG_MMI_INCOMINGCALL_DATA_IN_TCARD (__AUTO__)获取手机号码归属地的函数: FetchMobileHomeArea27.music: 路径: MUSIC_FOLDER6225D上如果是中文的路径: CFG_MMI_FOLDER_SM_CHINESE28.滑动换墙纸#define CFG_MMI_WIPE_EFFECT (__ON__)29. 读短信的:mmi_msg_inbox_list_get_hint30. 进入短线列表: mmi_msg_entry_inbox_list6225.阅读短信: mmi_msg_entry_view_msg31. 常用短信:__MMI_MESSAGES_TEMPLATE__短信的handle 一般这个函数注册: mmi_msg_set_msg_menu_highlight_handler (SmsMoMtGuiInterface.c)MSG_TEMPLATE_LANG_ENGLISHCalTemplateBase32.改外文的大小: pluto_en_standardFamily (fontres.c)33.卡1和卡2通话记录合并:# define CFG_MMI_COMBIN_SIM1_AND_SIM2_ENABLE (__ON__)魔音通话:VOICETONE_PITCHSHIFT = TRUEg_imui_ui_param.imui_bottom = MMI_content_y + MMI_content_height - 1-100;handle_inline_full_screen_edit_complete7900修改imui.c这个文件34.关机时退出系统: QuitSystemOperation (shutdownapp.c)35.来电黑名单: CFG_MMI_CM_BLACK_LIST36. 如果没有触摸屏,请注意将手写也关闭掉,否则编译不过TOUCH_PANEL_SUPPORT = NONEHAND_WRITING = NONEHAND_WRITING_CHS_SUPPORT = FALSE37.打印出错信息MMISWChangeWarning38.开机搜索界面ShowCategory120Screen39. 23平台上的拨号大字体#define CFG_MMI_PHB_GENERIC_MULTI_SELECT (__OFF__) 这个宏打开时,发短信从电话簿选择的时候,会有两个选项,无触摸屏时关掉CFG_FULL_DIAL_SCREEN_WITH_PICTURE40. 发短信时,从电话簿添加mmi_sms_recipient_add_from_contactsmmi_phb_mark_several_for_msg_pre_entryShowCategory199Screenwgui_inputs_sl_resize40. 背景播放挂起:mdi_audio_suspend_background_play挂起后,再继续播放:mdi_audio_resume_background_play41.信息报告界面:ShowCategory145Screen信息报告入口函数:mmi_msg_entry_deliver_report_ind显示界面的图片路径: \Images\PLUTO400X240\MainLCD\DualSIM\MESSAGE\CARD1\ OUTBOX字体颜色的theme: MMI_inputbox_normal_filler42.编模拟器的时候__MTK_TARGET__ 这个是不打开的,编译手机时打开43.EntryPhnseFactoryDefaultCalibrationScr45. 读短信:mmi_sms_entry_viewer收到新短信:mmi_msg_new_msg_ind信息报告:mmi_msg_entry_new_msg_indmmi_msg_nmgr_query_sms_notify获取信息报告的显示信息:mmi_msg_get_deliver_report_msg46.nvram_common_config.c中NVRAM_EF_PORT_SETTING_DEFAULT 中#if defined(__ONLY_ONE_UART__) || defined(__MMI_DUAL_SIM__)0, /* tst-ps uses uart_null(value is 99 (0x63)) */99, /* APP uses uart_port1 (value is 0) */#else0, /* tst-ps uses uart_port2(value is 1) */1, /* APP uses uart_port1 (value is 0) */#endif进入工程模式自动调好47. 触屏校准相关EntryPhnseFactoryDefaultCalibrationScr_internal48. 从文件管理进去看图片FileMgr.chighlight_fmgr_view_image49.修改写信息时,光标的颜色的主题inputbox_cursor_color_defaultTheme50.卡1收件箱MENUID:MENU_MTPNP_SMS_MASTER_INBOX卡2收件箱MENUID:MENU_MTPNP_SMS_SLAVE_INBOX51. 判断卡1还是卡2合法:bootupApp.c文件中卡1合法:mmi_bootup_is_sim_valid卡2合法: mmi_bootup_is_sim2_valid卡1卡2收件箱列表:mmi_msg_entry_divided_inbox_menu隐藏一个菜单:mmi_frm_hide_menu_item将以前隐藏的菜单显示出来:mmi_frm_unhide_menu_item相关文件:MTPNP_PFAL_MessageSetup.c模式设置: 卡1开: (MTPNP_AD_Get_Startup_Mode() == MTPNP_AD_NVRAM_CARD1)卡2开: (MTPNP_AD_Get_Startup_Mode() == MTPNP_AD_NVRAM_CARD2)卡1卡2同时开: (MTPNP_AD_Get_Startup_Mode() == MTPNP_AD_NVRAM_DUALCARD)52.短信编辑界面:写短信息选择字的背景颜色:multitap_filler_defaultTheme53.来电归属地显示:宏: __MMI_INCOMINGCALL_SHOW__FetchMobileHomeArea54. 文件浏览相关:entry_fmgr_explorerexit_fmgr_explorer释放浏览时获取的内存: mmi_fmgr_free_thumb_image_cache55. 信号强度: simdetectiondef.h#define SIGNAL_STRENGTH_LEVEL1 6#define SIGNAL_STRENGTH_LEVEL2 9#define SIGNAL_STRENGTH_LEVEL3 12#define SIGNAL_STRENGTH_LEVEL4 15显示信号强度:NetWorkSignalLevelIndication56. 修改短信条数: #define CM_SMS_MAX_MSG_NUM 15057.电话簿列表-----选项(res_phonebook.c) MITEM101_PBOOK_VIEW_OPTIONS插入号码:EMS_ED_OPT_INS_PHB_NUMBERmmi_msg_highlight_insert_phb_number58 ,工程模式密码: #define SSC_ENGINEERING_MODE "*#638725#"59.保存并发送: SEND_OPT_SAVE_AND_SEND_MENUIDmmi_msg_highlight_send_and_save61. 菜单列表字的颜色:list_normal_text_color_defaultTheme二级菜单选中时的颜色:menu_item_160x22_filler_defaultThemelist_main_menu_normal_item_filler_defaultTheme62.多方发送:__MMI_MESSAGES_SEND_TO_MANY__mmi_msg_highlight_send_to_many发送: mmi_msg_highlight_send_onlymmi_msg_send_msg_to_only_entry写信息函数:mmi_msg_entry_write_msg群发:__MMI_MESSAGES_SEND_BY_GROUP__#define EMS_DEFAULT_DCS_AVAILABLE_LENGTH 160 #define EMS_UCS2_DCS_AVAILABLE_LENGTH 7063. 0928 版:编辑短信,显示信息:wgui_EMS_redraw_remaining_characters_display64.发送名片:#define CFG_MMI_VCARD (__ON__)65. 默认的高亮选项:#defineCFG_MMI_DEFAULT_MAIN_MENU_HIGHLIGHT_MESSAGE (__AUTO__)67.idle的界面,title不变化,相关函数:standard_animated_matrix_highlight_handler_type268.#define CFG_MMI_MESSAGE_LIST_HINT (__ON__)69. 文件路径: CFG_MMI_FOLDER_SM_CHINESE70. 6235 上F82要修改lcd背光时间在文件nvram_common_config.c 中背光时间对应的一项为:NVRAM_BYTE_BL_SETTING_HFTIME71.短信copy 宏: __MMI_MESSAGES_COPY__从手机copy到sim卡或从sim卡copy 到手机72.手机上存储短信分配的条数: nvram_common_defs.hNVRAM_EF_SMSAL_SMS_TOTAL73.sim卡2信息设置 -- 存储位置存储位置:MENU_MTPNP_PREFEREDSTORAGE74.sim卡和手机存储短信的总条数: customer_ps_inc.h#define CM_SMS_MAX_MSG_NUM 35075. 6235平台,双 IMEIDUAL_IMEI = TRUE76.短信设置------sim卡1信息设置-----------存储位置设置----------手机手机无法支持的原因:#define CM_SMS_MAX_MSG_NUM 350CM_SMS_MAX_MSG_NUM 为短信的总条数,短信总条数必须大于 sim卡和手机分配的条数的和手机上存储短信的条数: nvram_common_defs.h#if defined(LOW_COST_SUPPORT)#define NVRAM_EF_SMSAL_SMS_TOTAL (10 * NVRAM_DUAL_RECORD)#else#define NVRAM_EF_SMSAL_SMS_TOTAL (200 * NVRAM_DUAL_RECORD)#endif /* LOW_COST_SUPPORT */77. 有两个拨号键时候,通常要定义DEVICE_KEY_SEND 和 DEVICE_KEY_SEND2在文件keypad_def.c78.电话簿快速搜索CFG_MMI_PHB_QUICK_SEARCH79.收到新信息的入口函数:mmi_msg_new_msg_ind80.发送完信息,然后保存的函数mmi_msg_save_msg_after_send_req81.回复短信menuid : SMS_INBOX_OPT_REPLY_MENUID回复短信高亮函数: mmi_msg_highlight_replymmi_msg_reply_msg新增加的宏__SEND_AND_SAVE_SMS__ 这个宏打开,默认就保存所发出的短信发送并保存短信: mmi_msg_highlight_send_and_save发送并保存: mmi_msg_send_and_save_msg_req写短信:SmsMoMtGuiInterface.c HighlightWMessageHandlermmi_msg_entry_write_msg82. 6235平台,删除短信mmi_sms_delete_msg_rsp83.从电话簿中选中联系人,发送短信MENU_ID_PHB_OPTION_SEND_SMSmmi_phb_highlight_op_send_sms__MMI_PHB_SEND_SMS_FROM_PHB__84.矢量字体__MMI_SKY_FONT__85.拒接电话并发送短信__MMI_UCM_REJECT_BY_SMS__86.快捷EXTRA_SHORTCUTS_MENUIDhighlight_mainmenu_shortcuts_execute87.手机设置:MENU9102_INITIAL_SETUPMENU_IDLE_SCR_DISP88.wifiWIFI_WIZARD_SUPPORT = FALSE # TRUE or FALSE 89. idle 的时候的快捷菜单__MMI_TOUCH_IDLESCREEN_SHORTCUTS__90.获取sms的存储类型mmi_frm_sms_get_storage91.字符串相关的问题将字符串转换成ucs2编码mmi_asc_to_ucs2(temple, " ");mmi_ucs2cpy(viewer_header_buff,GetString(STR_GLOBAL_NOT_SUPPORTED));mmi_ucs2cat(viewer_header_buff, buf2);92.无sim卡时,在idle界面也显示宫格-----------------宏CFG_MMI_NOSIM_HAVE_NORMAL_IDLE_MENU_INTERFACE93. 触摸屏TOUCH_PANEL_SUPPORT94.彩信:MMS_FEATURESMMS_SUPPORTMESSAGES_MENU_MMS_MENUID彩信中创建菜单:mauisemm.cstatic int createMenuItems(int slideCount, int initiated, int slideIndex)95.wap:WAP_SUPPORT96.nvram_common_defs.h#define NVRAM_EF_SMSAL_SMS_TOTAL (200 * NVRAM_DUAL_RECORD)GLOBAL_DEBUG_MEM_SIZE97.0932 照片编辑器:#define CFG_MMI_PHOTOEDITOR (__AUTO__)98. 0932.幻灯片#define CFG_MMI_SLIDESHOW (__AUTO__)99.EntryPhnseFactoryDefaultCalibrationScr_internal100.IdleSetLRKey101.彩信:HighlightMMSHandler编辑彩信时:收信人-编辑-添加号码/添加电子邮件进入的函数为:mobile_suite_app.cwap_entry_fullscreen_editorShowCategory5Screen_ext要将这个编辑界面的背景调白一点在ShowCategory5Screen_ext 函数中dm_set_scr_bg_opacity((U8)(current_MMI_theme->bg_opaci ty_low-110));编辑彩信内容:wgui_categories_MMS.cShowCategory277Screen编辑彩信主题:wgui_inline_edit.chandle_inline_full_screen_edit进入函数:MCU\vendor\wap\obigo_Q03C\adaptation\modules\mma\ source\mmsadp.cgoto_mms_screen102. short cut 图片路径:MainLCD\IdleScreen\Touch103. 有触摸屏时,idle界面左右软件中间的那个键的图片位置:__MMI_WGUI_CSK_ENABLE__#if (defined __MMI_TOUCH_SCREEN__) && (defined __MMI_WGUI_CSK_ENABLE__)ADD_APPLICATION_IMAGE2(IMG_CSK_DIAL_ICON,CUST_IM G_PATH"\\\\MainLCD\\\\Call\\\\T ouch\\\\Call.bmp","icons used in csk to make call");#endif104. 写信息----发送---从电话簿添加(IMG_ID_PHB_TAB_GROUP_ITEM,CUST_IMG_PATH"\\\\MainLCD\\\\Phonebook\\\\Phb_group_ite m.pbm","PHB tab group item")STR_CALLER_GROUP_4mmi_sms_entry_add_recipientmmi_phb_entry_generic_mark_several_and_quick_search_ta b1105. status icon id :IMG_SI_MASTER_SIGNAL_CLOSED106. 自动测试中键盘测试:EntryFMKeypadTest106. 视频播放器:入口函数:MENU_ID_VDOPLY_APPmmi_vdoply_highlight_appmmi_vdoply_entry_player_screen_internal]107. 显示imei:mmi_ssc_get_imei_rsp108. 视频录像器:mmi_vdorec_entry_app_internal109. 视频播放器全屏播放时,不能全屏播放在 mmi_vdoply_init_ui 函数中看创建播放层是否正确即创建这个层: g_vdoply_cntx.fullscr_play_layer_handle在 mmi_vdoply_blt_screen 中看刷屏是否正确在 mmi_vdoply_play_video 中看看是否需要旋转屏幕110 录音: CFG_MMI_SOUND_RECORDER背景播放挂起mdi_audio_suspend_background_play111. 定义wallpaper的类型:#define CFG_MMI_RES_TYPE_WALLPAPER_SEL (__RES_TYPE_JPG__)112. 定义清除键:#define CFG_MMI_WITH_C_KEY (__ON__)113. QQDSM_SUPPORT = TRUE#define CFG_MMI_DSM_QQ_APP (__ON__)#define CFG_QQ_APP_TCARD (__ON__)//MSN#define CFG_MMI_DSM_MSN_APP (__ON__)#define CFG_MSN_TCARD (__ON__)114. 拨号大字体#define CFG_MMI_240X400_DIAL_BIG_SCREEN (__ON__)图片包: \\\\MainLCD\\\\DialingScreen\\\\240X400Dialing115. 电话簿的总大小: PhoneBookTypes.hMAX_PB_ENTRIES116. 启动省电模式:#define CFG_MMI_PROFILE_RETRENCH (__ON__)ActivateRetrenchProfile SettingProf.c117. 调整menuitem的高度:CFG_UI_MENUITEM_HEIGHT118. 语言朗读INTERSOUND_MODULE_SUPPORT119. 照相机切换MENU_ID_CAMERA_SWITCH120. melody.#define GAIN_NOR_MED_VOL_MAX 144121. 0928平台全屏显示信号强度和电池电量宏#define CFG_MMI_STATUSBAR_TOUCH (__ON__)122. cta的宏: __CTA_SUPPORT__123. BT_AUDIO_VIA_SCO你那个MTK版本的蓝牙手机中蓝牙这块软件未将MTK自带的蓝牙功能 BT_AUDIO_VIA_SCO打开,所以来电或拨号就没有提示音的。

MTK_短信_开发经验

MTK_短信_开发经验

MTK短信开发经验本文旨在记录开发中遇到的问题和使用到的资源,方便查找和定位。

文档中添加的注释和描述属于个人理解,仅供参考,请以MTK文档《MMI_DD_Messages》为准。

(V2009-04-10)1、全局变量和资源短信箱容量[\custom\ps\IWIT23_07A_PMJ_BB\customer_ps_inc.h]#define CM_SMS_MAX_MSG_NUM 400 // 手机+ SIM卡[\custom\common\PLUTO_MMI\nvram_common_defs.h]#define NVRAM_EF_SMSAL_SMS_TOTAL 200 // 手机信箱和索引表[\custom\common\mmi_msg_context.c]unsigned short mmi_frm_sms_inbox_list[CM_SMS_MAX_MSG_NUM];// 收件箱索引表unsigned short mmi_frm_sms_outbox_list[CM_SMS_MAX_MSG_NUM]; // 发件箱索引表mmi_frm_sms_msgbox_struct mmi_frm_sms_msg_box[CM_SMS_MAX_MSG_NUM];// 信箱[\plutommi\mmi\miscframework\miscframeworkinc\SMSApi.h]mmi_frm_sms_app_msgbox_enum // 信箱类型枚举MMI_FRM_SMS_APP_INBOX = 0x02,MMI_FRM_SMS_APP_OUTBOX = 0x04[\plutommi\mmi\miscframework\miscframeworkinc\SMSStruct.h]mmi_frm_sms_msgbox_enum // 信箱类型枚举MMI_FRM_SMS_INBOX = 0x02,MMI_FRM_SMS_OUTBOX = 0x04,索引表mmi_frm_sms_inbox_list和索引表mmi_frm_sms_outbox_list,分别对应【消息】菜单中的【收件箱】和【发件箱】。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
message_send_p->bReadReport = (g_jmms_context->sending_settings.read_report == 1) ? E_TRUE : E_FALSE;
message_send_p->bHideSender = (g_jmms_context->sending_settings.hide_sender == 1) ? E_TRUE : E_FALSE;
if (wap_get_user_agent_brand() == EM_WAP_USERAGENT_BRAND_SE)
message_send_p->uiDate = get_current_utc_time();
message_send_p->bDeliveryReport = (g_jmms_context->sending_settings.delivery_report == 1) ? E_TRUE : E_FALSE;
}
message_send_p->pTo = (JC_CHAR*) g_jmms_context->to_p;
U8 ret = 0;
S32 len = 0;
MSG_HANDLE msg_handle = jmms_context_p->msg_handle;
/* free any allocated memory */
mmi_jmms_free_mms_pdu_memory(g_jmms_context);
if (message_send_p->pReplyChargingInfo == NULL){
mmi_jmms_free_mms_pdu_memory(g_jmms_context);
return JC_ERR_MEMORY_ALLOCATION;
}
switch (g_jmms_context->sending_settings.request_type){
break;
case E_VALIDITY_PERIOD_1WEEK:
message_send_p->uiExpiryTime = 1 * 7 * 24 * 3600;
break;
default:
if (wap_get_user_agent_brand() != EM_WAP_USERAGENT_BRAND_SE)
mmi_jmms_free_mms_pdu_memory(g_jmms_context);
return JC_ERR_MEMORY_ALLOCATION;
}
g_jmms_context->msg_header_type_p = (MESSAGE_SEND*)jdd_MemAlloc(sizeof(MESSAGE_SEND), 1);
case E_FULL_MMS:
message_send_p->pReplyChargingInfo->eReplyCharging = E_REQUEST_REPLY_CHARGING;
break;
case E_TEXT_ONLY:
message_send_p->pReplyChargingInfo->eReplyCharging = E_REQUEST_TEXT_ONLY_REPLY_CHARGING;
(JC_UINT32) (gui_atoi((UI_string_type) g_jmms_context->sending_settings.deadline_for_reply_buffer) * 3600);
message_send_p->pReplyChargingInfo->uiSize =
break;
case E_24_HRS:
message_send_p->uiDeliveryTime = 24 * 3600;
break;
default:
message_send_p->uiDeliveryTime = 0;
break;
}
message_send_p->uiExpiryTime = MAX_VALIDITY_PERIOD_VALUE;
break;
}
switch (g_jmms_context->sending_settings.delivery_time){
case E_IMMEDIATE:
message_send_p->uiExpiryTime = 0;
switch (g_jmms_context->sending_settings.validity_period){
case E_VALIDITY_PERIOD_MAX:
if (wap_get_user_agent_brand() != EM_WAP_USERAGENT_BRAND_SE)
* 以一个新函数,采用原来的函数里的代码,但是剔除了和GUI
* 有关的部分代码,在MyApp_send_mms()中被调用
*/
JC_RETCODE MyApp_jmms_create_and_send_new_mms(
U16 message_setting,
mmi_jmms_context_struct *jmms_context_p,
message_send_p->uiDeliveryTime = 0;
break;
case E_1_HR:
message_send_p->uiDeliveryTime = 3600;
break;
case E_12_HRS:
message_send_p->uiDeliveryTime = 12 * 3600;
}
msg_headers_p = g_jmms_context->msg_headers_p;
message_send_p = g_jmms_context->msg_header_type_p;
ret_code = mmi_jmms_set_mmsc_version();
/*
* 取自系统内的函数 mmi_jmms_create_and_send_new_mms(...);
* 函数的作用是将已经配置好的彩信mms结构体g_jmms_context
* 发送出去,但是因为原函数中有涉及到GUI的代码,如果直接
* 调用该函数发送mms,会造成程序自动退出,所以这里自己定
/* error handler */
if (NULL == g_jmms_context->msg_header_type_p){
mmi_jmms_free_mms_pdu_memory(g_jmms_context);
return JC_ERR_MEMORY_ALLOCATION;
g_jmms_context->msg_headers_p = (MESSAGE_HEADERS*)jdd_MemAlloc(sizeof(MESSAGE_HEADERS), 1);
/* error handler */
if (NULL == g_jmms_context->msg_headers_p){
if (g_jmms_context->rc_info != NULL){
message_send_p->pReplyChargingInfo->pszReplyId =
(JC_INT8*) jdi_UtilsStrdup(g_jmms_context->rc_info->pReplyMsgID);
message_send_p->eMsgPriority = (g_jmms_context->sending_settings.priority);
if (g_jmms_context->sending_settings.reply_charging == E_ON){
message_send_p->pReplyChargingInfo = (REPLY_CHARGING*)jdd_MemAlloc(sizeof(REPLY_CHARGING), 1);
g_jmms_context->to_p = mmi_jmms_get_to_addresses();
if (g_jmms_context->to_p == NULL){
mmi_jmms_free_mms_pdu_memory(g_jmms_context);
return JC_ERR_MEMORY_ALLOCATION;
((JC_UINT32) gui_atoi((UI_string_type) g_jmms_context->sending_settings.reply_msg_size_buffer)) * 1000;
}
/* Added by Deepali for reply charging. */
/* error handler */
if (ret_code != JC_OK){
mmi_jmms_free_mms_pdu_memory(g_jmms_context);
return ret_code;
}
message_send_p->pVersion = (JC_INT8*) g_jmms_context->version;
message_send_p->uiExpiryTime = MAX_VALIDITY_PERIOD_VALUE;
相关文档
最新文档