读取短信出现"com.android mms.mms"提示,怎么解决

今天看啥 热点:
应用程序 “com.android.mms&已意外终止,请重试。怎么办?高手帮帮忙!!!
com.android.mms的意思是该应用程序识别出你的触摸屏驱动有问题,有些应用程序可能开发的较早。对于触摸屏手机需要你加装触摸屏驱动才有用的。建议网上找个万能触摸屏驱动装下就OK了。以后也不会有这个问题了
&&一,很多人在Android2.2开启APP2SD之后如果安装程序时死机或者遇到其他情况,当再次安装程序会提示”应用程序未安装”,从而安装程序失败。& &&解决方法:储存模式连接电脑找到SD卡目录下的.android_secure文件夹,里面应该会有一个smdl2tmp1.asec,也可能是其他名称,总之与正常程序命名格式明显不一样的文件,删除,再次安装软件,看看是不是好了。&& &&二,打开设置-管理应用程序-& &&用系统自带的程序管理查看SD卡上的程序时,有的程序是没有彩色图标的,原来就是这些没有图标的软件在作怪,这些没有图标的软件就是以前一些没有正确安装或者卸载不完全软件数据,如果你再次安装就会报错,现在我们用系统自带的软件管理把它们卸载干净,再次安装软件时就不会出错了.&& &&三,还有一部分因为软件签名更改了,所以不能覆盖安装,直接删除重新安装新的版本即可&&&&四.不支持add-on属性的& 联通行货小V在装一些软件时,手机PC助手会显示“您的机器不支持Add-on属性”,如果直接用手机装的话就显示:”应用程序未安 Android深入浅出开场白及课前准...Android Contex... 装“,91也是显示”安装失败“,让人非常恼火,洒家在网上搜索一番,发现其他品牌如MOTO的行货版本都存在类似问题,唉,其实主要原因是阉割了google服务(天朝啊,和google有仇啊!),需要加 这 三 个 文 件 : 地 图 程 序 框 架 : /system/framework/com.le.android.maps.jar;地图权限:/system/etc/permissi**/com.google.android.maps.xml;网络定位程序:/data/app_s/NetworkLocation.apk。你只需将上述文件放到手机中的相应位置,重启手机就好了。本人亲测可用。&方法:& 首先机器要ROOT,然后用RE管理器,把要复制的文件复制到相应的位置,最后改权限和其他一样644,就是竖着3趟,左边全选,中间最上面选上,右边全空。接着重启机器就好了,重启后你会发现如爱帮公交,endomondo,时光网等软件都可以安装了。&不会修改权限?不是吧,自己查查看。&具体就是把这三个文件。& /system/framework/com.google.android.maps.jar;&/system/etc/permissi**/com.google.android.maps.xml;&/data/app_s/NetworkLocation.apk。&放到相应位置,没有文件夹的,请自己建立。& 为了大家方便,我顺便把文件也上传了,压缩包里是另外两个文&&&&五.安装失败文件在date/local/temp& &&六.&程序越装越多,系统提示内存空间不足了吧?卸载一些程序也 不会增加多少可用空间,教你一招,保准管用,绝对安全可行。ROOT后,打开RE&-&&data-dalvik-cache&这个文件夹里面的都是系统缓存文件和卸载定制程序留下来的无用垃圾,可以放心全部删除,系统所需文件重启后能自动生成的,删除后查看手机内存空间有原来剩余30MB增加到了101MB,释放ROM空间71MB,不过重启的时候,时间有点久,大概2-3分钟,期间有段时间为黑屏状态,不要担心,一会系统就加载完成,启动加载期间,不要有任何操作,要耐心等待......系统启动加载完毕,一切正常。再打开data-dalvik-cache&查看,系统缓存文件已恢复,用安卓优化大师查看ROM剩余由重启前的101MB降至78MB,证明系统缓存文件已恢复垃圾文件已全部彻底删除了,本次操作实际释放ROM空间48MB,打开几个软件全部正常启动,至此,宣布成功& 七.死机解决办法& 关机状态下按住音量下键不放,再按开机键直到出现机器人和三角形。再按下小房间键就会看到几行英文。再按音量下键将光标调到倒数第二行英文,再按menu键,就可以看到很多no,再按音量下键调到yes.&....再按menu键下面就会出现一个机器人和小纸合还会有几行红色的英文。等待一下最后一步回到第一次英文界面按一下menu键就自动开机按开机键就可以开机了。开机比较慢,开机后所有安装的程序将删除,恢复到出厂界面。
是不是手机安装了腾讯管家或者手机BUG,信息备份到SD卡里面,先到程序管理试试信息删除,开机试试,如果还是不行到RE管理器里面,在/data/data下,搜索telephony文件夹把里面文件删除里面,OK了——个人经历,如果这两个方法都不出厂设置
删除卡内信息的时候,调用到了MMS,一般都是nullpoint exception。不会影响你的使用,只能说程序没有做好,有BUG。
机锋网移动版和机锋市场是同一个东西,随着版本改进,功能的完善,现在统一命名为机锋市场;楼主可以在机锋网论坛下载机锋市场。
相关搜索:
相关阅读:
相关频道:
电脑知识最近更新关于android模拟器的问题:Application&Messaging(in&process&com.android.mms)is&nbsp
用android&1.6模拟器运行程序出现下面的问题:
Application&Messaging(in&process&com.android.mms)is&not&responding
The&process&com.android.phone&has&stopped.
而用android2.1模拟器就没有问题。
解决办法:
删除AVD1.6模拟器,重新创建一下AVD1.6模拟器,则没问题了。
其实最后我发现直接选择等待,好像也没什么影响,后来才弄明白这是laucher还没完全加载完出现的提示(完全加载完成会直接进入你启动的项目,在console窗口中可以看到),你只要耐心等一下就可以了,不用解决
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1050人阅读
相关控件初始化方法:showSmscPref
& private void showSmscPref() {
&&&&&&& int count = MSimTelephonyManager.getDefault().getPhoneCount();
&&&&&&& boolean airplaneModeOn = Settings.System.getInt(getContentResolver(),
&&&&&&&&&&&&&&& Settings.System.AIRPLANE_MODE_ON, 0) != 0;
&&&&&&& for (int i = 0; i & i++) {
&&&&&&&&&&& final Preference pref = new Preference(this);
&&&&&&&&&&& pref.setKey(String.valueOf(i));
&&&&&&&&&&& String title = (count &= 1) ? getString(R.string.pref_one_smcs)
&&&&&&&&&&&&&&&&&&& : getString(R.string.pref_more_smcs, i + 1);
&&&&&&&&&&& pref.setTitle(title);
&&&&&&&&&&& pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
&&&&&&&&&&&&&&& @Override
&&&&&&&&&&&&&&& public boolean onPreferenceClick(Preference preference) {
&&&&&&&&&&&&&&&&&&& MyEditDialogFragment dialog = MyEditDialogFragment.newInstance(
&&&&&&&&&&&&&&&&&&&&&&&&&&& MessagingPreferenceActivity.this,
&&&&&&&&&&&&&&&&&&&&&&&&&&& preference.getTitle(),
&&&&&&&&&&&&&&&&&&&&&&&&&&& preference.getSummary(),
&&&&&&&&&&&&&&&&&&&&&&&&&&& Integer.valueOf(preference.getKey()));
&&&&&&&&&&&&&&&&&&& dialog.show(getFragmentManager(), &dialog&);
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&& }
&&&&&&&&&&& });
&&&&&&&&&&& mSmscPrefCate.addPreference(pref);
&&&&&&&&&&& mSmscPrefList.add(pref);
&&&&&&&&&&& updateSMSCPref(i, airplaneModeOn);
&&&&&&& registerReceiver();
这里使用了一个内部类MyEditDialogFragment,该类继承了DialogFragment;
public static class MyEditDialogFragment extends DialogFragment {
&&&&&&& private MessagingPreferenceActivity mA
&&&&&&& public static MyEditDialogFragment newInstance(MessagingPreferenceActivity activity,
&&&&&&&&&&&&&&& CharSequence title, CharSequence smsc, int sub) {
&&&&&&&&&&& MyEditDialogFragment dialog = new MyEditDialogFragment();
&&&&&&&&&&& dialog.mActivity =
&&&&&&&&&&& Bundle args = new Bundle();
&&&&&&&&&&& args.putCharSequence(TITLE, title);
&&&&&&&&&&& args.putCharSequence(SMSC, smsc);
&&&&&&&&&&& args.putInt(SUB, sub);
&&&&&&&&&&& dialog.setArguments(args);
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public Dialog onCreateDialog(Bundle savedInstanceState) {
&&&&&&&&&&& final int sub = getArguments().getInt(SUB);
&&&&&&&&&&& if (null == mActivity) {
&&&&&&&&&&&&&&& mActivity = (MessagingPreferenceActivity) getActivity();
&&&&&&&&&&&&&&& dismiss();
&&&&&&&&&&& }
&&&&&&&&&&& final EditText edit = new EditText(mActivity);
&&&&&&&&&&& edit.setPadding(15, 15, 15, 15);
&&&&&&&&&&& edit.setText(getArguments().getCharSequence(SMSC));
&&&&&&&&&&& Dialog alert = new AlertDialog.Builder(mActivity)
&&&&&&&&&&&&&&&&&&& .setTitle(getArguments().getCharSequence(TITLE))
&&&&&&&&&&&&&&&&&&& .setView(edit)
&&&&&&&&&&&&&&&&&&& .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
&&&&&&&&&&&&&&&&&&&&&&& public void onClick(DialogInterface dialog, int whichButton) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& MyAlertDialogFragment newFragment = MyAlertDialogFragment.newInstance(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& mActivity, sub, edit.getText().toString());
&&&&&&&&&&&&&&&&&&&&&&&&&&& newFragment.show(getFragmentManager(), &dialog&);
&&&&&&&&&&&&&&&&&&&&&&&&&&& dismiss();
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& })
&&&&&&&&&&&&&&&&&&& .setNegativeButton(android.R.string.cancel, null)
&&&&&&&&&&&&&&&&&&& .setCancelable(true)
&&&&&&&&&&&&&&&&&&& .create();
&&&&&&&&&&& alert.getWindow().setSoftInputMode(
&&&&&&&&&&&&&&&&&&& WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
&&&&&&&&&&&
上述代码调用了另一个内部类:《TAG 1-2》
&public static class MyAlertDialogFragment extends DialogFragment {
&&&&&&& private MessagingPreferenceActivity mA
&&&&&&& public static MyAlertDialogFragment newInstance(MessagingPreferenceActivity activity,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& int sub, String smsc) {
&&&&&&&&&&& MyAlertDialogFragment dialog = new MyAlertDialogFragment();
&&&&&&&&&&& dialog.mActivity =
&&&&&&&&&&& Bundle args = new Bundle();
&&&&&&&&&&& args.putInt(SUB, sub);
&&&&&&&&&&& args.putString(SMSC, smsc);
&&&&&&&&&&& dialog.setArguments(args);
&&&&&&&&&&&
&&&&&&& @Override
&&&&&&& public Dialog onCreateDialog(Bundle savedInstanceState) {
&&&&&&&&&&& final int sub = getArguments().getInt(SUB);
&&&&&&&&&&& final String displayedSMSC = getArguments().getString(SMSC);
&&&&&&&&&&& // When framework re-instantiate this fragment by public empty
&&&&&&&&&&& // constructor and call onCreateDialog(Bundle savedInstanceState) ,
&&&&&&&&&&& // we should make sure mActivity not null.
&&&&&&&&&&& if (null == mActivity) {
&&&&&&&&&&&&&&& mActivity = (MessagingPreferenceActivity) getActivity();
&&&&&&&&&&& }
&&&&&&&&&&& return new AlertDialog.Builder(mActivity)
&&&&&&&&&&&&&&&&&&& .setIcon(android.R.drawable.ic_dialog_alert).setMessage(
&&&&&&&&&&&&&&&&&&&&&&&&&&& R.string.set_smsc_confirm_message)
&&&&&&&&&&&&&&&&&&& .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
&&&&&&&&&&&&&&&&&&&&&&& public void onClick(DialogInterface dialog, int whichButton) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& Intent intent = new Intent();
&&&&&&&&&&&&&&&&&&&&&&&&&&& intent.setComponent(new ComponentName(&com.android.phonefeature&,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &com.android.phonefeature.smsc.SmscService&));
&&&&&&&&&&&&&&&&&&&&&&&&&&& intent.setAction(COMMAND_SET_SMSC);
&&&&&&&&&&&&&&&&&&&&&&&&&&& intent.putExtra(SUB, sub);
&&&&&&&&&&&&&&&&&&&&&&&&&&& intent.putExtra(SMSC, displayedSMSC);
&&&&&&&&&&&&&&&&&&&&&&&&&&& mActivity.startService(intent);
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& })
&&&&&&&&&&&&&&&&&&& .setNegativeButton(android.R.string.cancel, null)
&&&&&&&&&&&&&&&&&&& .setCancelable(true)
&&&&&&&&&&&&&&&&&&& .create();
当用户点击确认(OK)后,会启动一个SmscService服务,并且把修改后的smsc number封装到intent中去,在SmscService服务中的onStartCommand将Intent中的数添加到消息队列中进行处理。
&&& public int onStartCommand(Intent intent, int flags, int startId) {
&&&&&&& int sub = intent.getIntExtra(SUB, 0);
&&&&&&& int count = MSimTelephonyManager.getDefault().getPhoneCount();
&&&&&&& Phone phone = count & 1 ? MSimPhoneFactory.getPhone(sub)
&&&&&&&&&&&&&&& : PhoneFactory.getDefaultPhone();
&&&&&&& if (phone == null) return START_STICKY;
&&&&&&& boolean enable = phone.getIccCard().hasIccCard();
&&&&&&& Intent i = new Intent();
&&&&&&& i.setAction(NOTIFY_PHONE_STATE);
&&&&&&& i.putExtra(SUB, sub);
&&&&&&& i.putExtra(ENABLE, enable);
&&&&&&& sendBroadcast(i);
&&&&&&& String action = intent.getAction();
&&&&&&& if (COMMAND_GET_SMSC.equals(action)) {
&&&&&&&&&&& msg = mHandler.obtainMessage(MSG_GET_SMSC);
&&&&&&&&&&& msg.arg1 =
&&&&&&&&&&& phone.getSmscAddress(msg);
&&&&&&& } else if (COMMAND_SET_SMSC.equals(action)) {
&&&&&&&&&&& msg = mHandler.obtainMessage(MSG_SET_SMSC);
&&&&&&&&&&& msg.arg1 =
&&&&&&&&&&& String displayedSMSC = intent.getStringExtra(SMSC);
&&&&&&&&&&& Bundle bundle = new Bundle();
&&&&&&&&&&& bundle.putString(SMSC, displayedSMSC);
&&&&&&&&&&& msg.setData(bundle);
&&&&&&&&&&& String actualSMSC = adjustSMSC(displayedSMSC);
&&&&&&&&&&& phone.setSmscAddress(actualSMSC, msg);
&&&&&&& return START_STICKY;
上述代码中的phone,通过验证分析,得到phone为GSMPhone的实例,验证的代码为PhoneFactory类中的makeDefaultPhone方法进行验证得到(我这里验证的结果为GSM:
&public static void makeDefaultPhone(Context context) {&TAG 1-1&
&&&&&&& synchronized(Phone.class) {
&&&&&&&&&&& if (!sMadeDefaults) {
&&&&&&&&&&&&&&& sLooper = Looper.myLooper();
&&&&&&&&&&&&&&& sContext =
&&&&&&&&&&&&&&& if (sLooper == null) {
&&&&&&&&&&&&&&&&&&& throw new RuntimeException(
&&&&&&&&&&&&&&&&&&&&&&& &PhoneFactory.makeDefaultPhone must be called from Looper thread&);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& int retryCount = 0;
&&&&&&&&&&&&&&& for(;;) {
&&&&&&&&&&&&&&&&&&& boolean hasException =
&&&&&&&&&&&&&&&&&&& retryCount ++;
&&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&& // use UNIX domain socket to
&&&&&&&&&&&&&&&&&&&&&&& // prevent subsequent initialization
&&&&&&&&&&&&&&&&&&&&&&& new LocalServerSocket(&com.android.internal.telephony&);
&&&&&&&&&&&&&&&&&&& } catch (java.io.IOException ex) {
&&&&&&&&&&&&&&&&&&&&&&& hasException =
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& if ( !hasException ) {
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& } else if (retryCount & SOCKET_OPEN_MAX_RETRY) {
&&&&&&&&&&&&&&&&&&&&&&& throw new RuntimeException(&PhoneFactory probably already running&);
&&&&&&&&&&&&&&&&&&& } else {
&&&&&&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&&&&&& Thread.sleep(SOCKET_OPEN_RETRY_MILLIS);
&&&&&&&&&&&&&&&&&&&&&&& } catch (InterruptedException er) {
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& sPhoneNotifier = new DefaultPhoneNotifier();
&&&&&&&&&&&&&&& // Get preferred network mode
&&&&&&&&&&&&&&& int preferredNetworkMode = RILConstants.PREFERRED_NETWORK_MODE;
&&&&&&&&&&&&&&& if (TelephonyManager.getLteOnCdmaModeStatic() == PhoneConstants.LTE_ON_CDMA_TRUE) {
&&&&&&&&&&&&&&&&&&& preferredNetworkMode = Phone.NT_MODE_GLOBAL;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& int networkMode = Settings.Global.getInt(context.getContentResolver(),
&&&&&&&&&&&&&&&&&&&&&&& Settings.Global.PREFERRED_NETWORK_MODE, preferredNetworkMode);
&&&&&&&&&&&&&&& Rlog.i(LOG_TAG, &Network Mode set to & + Integer.toString(networkMode));
&&&&&&&&&&&&&&& // As per certain operator requirement, the device is expected to be in global《TAG 1-2》
&&&&&&&&&&&&&&& // mode from boot up, by enabling the property persist.env.phone.global the
&&&&&&&&&&&&&&& // network mode is set to global during boot up.
&&&&&&&&&&&&&&& if (SystemProperties.getBoolean(&persist.env.phone.global&, false)) {
&&&&&&&&&&&&&&&&&&& networkMode = Phone.NT_MODE_LTE_CMDA_EVDO_GSM_WCDMA;
&&&&&&&&&&&&&&&&&&& Settings.Global.putInt(context.getContentResolver(),
&&&&&&&&&&&&&&&&&&&&&&&&&&& Settings.Global.PREFERRED_NETWORK_MODE, networkMode);
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& // Get cdmaSubscription mode from Settings.Global
&&&&&&&&&&&&&&& int cdmaS
&&&&&&&&&&&&&&& cdmaSubscription = Settings.Global.getInt(context.getContentResolver(),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Settings.Global.CDMA_SUBSCRIPTION_MODE,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sPreferredCdmaSubscription);
&&&&&&&&&&&&&&& Rlog.i(LOG_TAG, &Cdma Subscription set to & + cdmaSubscription);
&&&&&&&&&&&&&&& //reads the system properties and makes commandsinterface
&&&&&&&&&&&&&&& sCommandsInterface = new RIL(context, networkMode, cdmaSubscription);
&&&&&&&&&&&&&&& // Instantiate UiccController so that all other classes can just call getInstance()
&&&&&&&&&&&&&&& UiccController.make(context, sCommandsInterface);
&&&&&&&&&&&&&&& int phoneType = TelephonyManager.getPhoneType(networkMode);
&&&&&&&&&&&&&&& if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
&&&&&&&&&&&&&&&&&&& Rlog.i(LOG_TAG, &Creating GSMPhone&);
&&&&&&&&&&&&&&&&&&& sProxyPhone = new PhoneProxy(new GSMPhone(context,
&&&&&&&&&&&&&&&&&&&&&&&&&&& sCommandsInterface, sPhoneNotifier));
&&&&&&&&&&&&&&&&&&&&&&&&&&& android.util.Log.d(&bill&,&GSM&);
&&&&&&&&&&&&&&& } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
&&&&&&&&&&&&&&&&&&& switch (TelephonyManager.getLteOnCdmaModeStatic()) {
&&&&&&&&&&&&&&&&&&&&&&& case PhoneConstants.LTE_ON_CDMA_TRUE:
&&&&&&&&&&&&&&&&&&&&&&&&&&& Rlog.i(LOG_TAG, &Creating CDMALTEPhone&);
&&&&&&&&&&&&&&&&&&&&&&&&&&& sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sCommandsInterface, sPhoneNotifier));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& android.util.Log.d(&bill&,&CDMALTE&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& case PhoneConstants.LTE_ON_CDMA_FALSE:
&&&&&&&&&&&&&&&&&&&&&&& default:
&&&&&&&&&&&&&&&&&&&&&&&&&&& Rlog.i(LOG_TAG, &Creating CDMAPhone&);
&&&&&&&&&&&&&&&&&&&&&&&&&&& sProxyPhone = new PhoneProxy(new CDMAPhone(context,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& sCommandsInterface, sPhoneNotifier));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& android.util.Log.d(&bill&,&CDMA&);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& sMadeDefaults =
&&&&&&&&&&& }
但是GSMPhone中并没有setSmscAddress()方法,但是GSMPhone继承了BasePhone类,因此我们在BasePhone中找到了setSmscAddress()方法;
&&& @Override
&&& public void setSmscAddress(String address, Message result) {
&&&&&&& mCi.setSmscAddress(address, result);
上述代码中的mCi为接口CommandsInterface的实例,mCi的所引用的实例为BasePhone构造函数中传递过来的,因此我们代码&TAG1-1&中找到了该实例为RIL的实例。因此我们在RIL类中找到了setSmscAddress方法;
&&& @Override
&&& public void setSmscAddress(String address, Message result) {
&&&&&&& RILRequest rr = RILRequest.obtain(RIL_REQUEST_SET_SMSC_ADDRESS, result);
&&&&&&& rr.mParcel.writeString(address);
&&&&&&& if (RILJ_LOGD) riljLog(rr.serialString() + && & + requestToString(rr.mRequest)
&&&&&&&&&&&&&&& + & : & + address);
&&&&&&& send(rr);
&&& private void
&&& send(RILRequest rr) {
&&&&&&& if (mSocket == null) {
&&&&&&&&&&& rr.onError(RADIO_NOT_AVAILABLE, null);
&&&&&&&&&&& rr.release();
&&&&&&&&&&&
&&&&&&& msg = mSender.obtainMessage(EVENT_SEND, rr);
&&&&&&& acquireWakeLock();
&&&&&&& msg.sendToTarget();
在上述代码中send()方法会发消息给RIL中RILSender进行处理,同时msg中封装了MSG_SET_SMSC,在RIL的RILSender中执行写卡操作,同时发消息给SmscService。
&//***** Handler implementation
&&&&&&& @Override public void
&&&&&&& handleMessage(Message msg) {
&&&&&&&&&&& RILRequest rr = (RILRequest)(msg.obj);
&&&&&&&&&&& RILRequest req =
&&&&&&&&&&& switch (msg.what) {
&&&&&&&&&&&&&&& case EVENT_SEND:
&&&&&&&&&&&&&&&&&&& /**
&&&&&&&&&&&&&&&&&&&& * mRequestMessagePending++ already happened for every
&&&&&&&&&&&&&&&&&&&& * EVENT_SEND, thus we must make sure
&&&&&&&&&&&&&&&&&&&& * mRequestMessagePending-- happens once and only once
&&&&&&&&&&&&&&&&&&&& */
&&&&&&&&&&&&&&&&&&& boolean alreadySubtracted =
&&&&&&&&&&&&&&&&&&& try {
&&&&&&&&&&&&&&&&&&&&&&& LocalS
&&&&&&&&&&&&&&&&&&&&&&& s = mS
&&&&&&&&&&&&&&&&&&&&&&& if (s == null) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& rr.onError(RADIO_NOT_AVAILABLE, null);
&&&&&&&&&&&&&&&&&&&&&&&&&&& rr.release();
&&&&&&&&&&&&&&&&&&&&&&&&&&& if (mRequestMessagesPending & 0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& mRequestMessagesPending--;
&&&&&&&&&&&&&&&&&&&&&&&&&&& alreadySubtracted =
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& synchronized (mRequestList) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& mRequestList.add(rr);
&&&&&&&&&&&&&&&&&&&&&&&&&&& mRequestMessagesWaiting++;
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& if (mRequestMessagesPending & 0)
&&&&&&&&&&&&&&&&&&&&&&&&&&& mRequestMessagesPending--;
&&&&&&&&&&&&&&&&&&&&&&& alreadySubtracted =
&&&&&&&&&&&&&&&&&&&&&&& byte[]
&&&&&&&&&&&&&&&&&&&&&&& data = rr.mParcel.marshall();
&&&&&&&&&&&&&&&&&&&&&&& rr.mParcel.recycle();
&&&&&&&&&&&&&&&&&&&&&&& rr.mParcel =
&&&&&&&&&&&&&&&&&&&&&&& if (data.length & RIL_MAX_COMMAND_BYTES) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& throw new RuntimeException(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &Parcel larger than max bytes allowed! &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + data.length);
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& // parcel length in big endian
&&&&&&&&&&&&&&&&&&&&&&& dataLength[0] = dataLength[1] = 0;
&&&&&&&&&&&&&&&&&&&&&&& dataLength[2] = (byte)((data.length && 8) & 0xff);
&&&&&&&&&&&&&&&&&&&&&&& dataLength[3] = (byte)((data.length) & 0xff);
&&&&&&&&&&&&&&&&&&&&&&& //Rlog.v(RILJ_LOG_TAG, &writing packet: & + data.length + & bytes&);
&&&&&&&&&&&&&&&&&&&&&&& s.getOutputStream().write(dataLength);
&&&&&&&&&&&&&&&&&&&&&&& s.getOutputStream().write(data);
&&&&&&&&&&&&&&&&&&& } catch (IOException ex) {
&&&&&&&&&&&&&&&&&&&&&&& Rlog.e(RILJ_LOG_TAG, &IOException&, ex);
&&&&&&&&&&&&&&&&&&&&&&& req = findAndRemoveRequestFromList(rr.mSerial);
&&&&&&&&&&&&&&&&&&&&&&& // make sure this request has not already been handled,
&&&&&&&&&&&&&&&&&&&&&&& // eg, if RILReceiver cleared the list.
&&&&&&&&&&&&&&&&&&&&&&& if (req != null || !alreadySubtracted) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& rr.onError(RADIO_NOT_AVAILABLE, null);
&&&&&&&&&&&&&&&&&&&&&&&&&&& rr.release();
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& } catch (RuntimeException exc) {
&&&&&&&&&&&&&&&&&&&&&&& Rlog.e(RILJ_LOG_TAG, &Uncaught exception &, exc);
&&&&&&&&&&&&&&&&&&&&&&& req = findAndRemoveRequestFromList(rr.mSerial);
&&&&&&&&&&&&&&&&&&&&&&& // make sure this request has not already been handled,
&&&&&&&&&&&&&&&&&&&&&&& // eg, if RILReceiver cleared the list.
&&&&&&&&&&&&&&&&&&&&&&& if (req != null || !alreadySubtracted) {
&&&&&&&&&&&&&&&&&&&&&&&&&&& rr.onError(GENERIC_FAILURE, null);
&&&&&&&&&&&&&&&&&&&&&&&&&&& rr.release();
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& } finally {
&&&&&&&&&&&&&&&&&&&&&&& // Note: We are &Done& only if there are no outstanding
&&&&&&&&&&&&&&&&&&&&&&& // requests or replies. Thus this code path will only release
&&&&&&&&&&&&&&&&&&&&&&& // the wake lock on errors.
&&&&&&&&&&&&&&&&&&&&&&& releaseWakeLockIfDone();
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& if (!alreadySubtracted && mRequestMessagesPending & 0) {
&&&&&&&&&&&&&&&&&&&&&&& mRequestMessagesPending--;
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&
这里进行判断写卡操作是否成功,并发送广播。
&&& private Handler mHandler = new Handler() {
&&&&&&& @Override
&&&&&&& public void handleMessage(Message msg) {
&&&&&&&&&&& AsyncResult ar = (AsyncResult) msg.
&&&&&&&&&&& String smsc =
&&&&&&&&&&& switch (msg.what) {
&&&&&&&&&&&&&&& case MSG_SET_SMSC:
&&&&&&&&&&&&&&&&&&& if (ar.exception != null) {
&&&&&&&&&&&&&&&&&&&&&&& notifyChange(NOTIFY_SMSC_ERROR, null, 0);
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&& } else {
&&&&&&&&&&&&&&&&&&&&&&& Bundle bundle = msg.getData();
&&&&&&&&&&&&&&&&&&&&&&& smsc = bundle.getString(SMSC);
&&&&&&&&&&&&&&&&&&&&&&& notifyChange(NOTIFY_SMSC_SUCCESS, null, 0);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&
&&& private void notifyChange(String notify, String smsc, int sub) {
&&&&&&& Intent intent = new Intent(notify);
&&&&&&& intent.putExtra(SMSC, smsc);
&&&&&&& intent.putExtra(SUB, sub);
&&&&&&& sendBroadcast(intent);
我们在MessagingPreferenceActivity的registerReceiver()方法中注册广播接收器进行监听。
&private void registerReceiver() {
&&&&&&& if (mReceiver != null)
&&&&&&& mReceiver = new BroadcastReceiver() {
&&&&&&&&&&& @Override
&&&&&&&&&&& public void onReceive(Context context, Intent intent) {
&&&&&&&&&&&&&&& String action = intent.getAction();
&&&&&&&&&&&&&&& if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
&&&&&&&&&&&&&&&&&&& /*AddBy:yabin.huang BugID:SWBUG Date:*/
&&&&&&&&&&&&&&&&&&& updateSMSCPref(ALL_SUB, isAirplaneModeOn());
&&&&&&&&&&&&&&&&&&& Message msg = new Message();
&&&&&&&&&&&&&&&&&&& msg.what = AIR_PLANE_MODE_CHANGED;
&&&&&&&&&&&&&&&&&&& msg.arg1 = (isAirplaneModeOn() ? AIR_PLANE_MODE_ENABLE : AIR_PLANE_MODE_DISABLE);
&&&&&&&&&&&&&&&&&&& mAirPlaneModeHandler.sendMessage(msg);
&&&&&&&&&&&&&&& } else if(TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)){
&&&&&&&&&&&&&&&&&&& if(isSimReady())
&&&&&&&&&&&&&&&&&&& updateSMSCPref(ALL_SUB, isAirplaneModeOn());
&&&&&&&&&&&&&&& } else if (NOTIFY_SMSC_ERROR.equals(action)) {
&&&&&&&&&&&&&&&&&&& showToast(R.string.set_smsc_error);
&&&&&&&&&&&&&&& } else if (NOTIFY_SMSC_SUCCESS.equals(action)) {
&&&&&&&&&&&&&&&&&&& showToast(R.string.set_smsc_success);
&&&&&&&&&&&&&&&&&&& int sub = intent.getIntExtra(SUB, 0);
&&&&&&&&&&&&&&&&&&& String summary = intent.getStringExtra(SMSC);
&&&&&&&&&&&&&&&&&&& Log.d(&bill&,&summary--&+summary);
&&&&&&&&&&&&&&&&&&& mSmscPrefList.get(sub).setSummary(summary);
&&&&&&&&&&&&&&& } else if (NOTIFY_SMSC_UPDATE.equals(action)) {
&&&&&&&&&&&&&&&&&&& int sub = intent.getIntExtra(SUB, 0);
&&&&&&&&&&&&&&&&&&& if(TextUtils.isEmpty(mSmscPrefList.get(sub).getSummary())){
&&&&&&&&&&&&&&&&&&&&&&& String summary = intent.getStringExtra(SMSC);
&&&&&&&&&&&&&&&&&&&&&&& if(summary==null||summary.length()==0){
&&&&&&&&&&&&&&&&&&&&&&&&&&& updateSMSCPref(ALL_SUB, isAirplaneModeOn());
&&&&&&&&&&&&&&&&&&&&&&&&&&& mSmscPrefList.get(sub).setEnabled(false);
&&&&&&&&&&&&&&&&&&&&&&&&&&& mSmscPrefList.get(sub).setSummary(null);
&&&&&&&&&&&&&&&&&&&&&&& }else{
&&&&&&&&&&&&&&&&&&&&&&&&&&& mSmscPrefList.get(sub).setEnabled(true);
&&&&&&&&&&&&&&&&&&&&&&&&&&& mSmscPrefList.get(sub).setSummary(summary);
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }else{
&&&&&&&&&&&&&&&&&&&&&&& mSmscPrefList.get(sub).setEnabled(true);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& };
&&&&&&& IntentFilter filter = new IntentFilter();
&&&&&&& filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
&&&&&&& filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
&&&&&&& filter.addAction(NOTIFY_SMSC_ERROR);
&&&&&&& filter.addAction(NOTIFY_SMSC_SUCCESS);
&&&&&&& filter.addAction(NOTIFY_SMSC_UPDATE);
&&&&&&& registerReceiver(mReceiver, filter);
至此,修改短信中心号码的整个流程都整理完了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

我要回帖

更多关于 android mms 的文章

 

随机推荐