編輯:關於Android編程
開發中,難免會遇到各種各樣的適配問題,尤其是經過深度修改定制過的系統,有的無論是軟硬件上都有很大的區別,這裡不得不提到一種奇葩的機型,沒錯,那就是雙卡雙待的手機(比如XT800, A60, S8600 , Lenovo A750,中興V889D等).由於是雙SIM卡,而且兩個卡槽支持的運營商或者網絡制式不一定相同,比如一個卡槽支持WCDMA,另一個卻只支持GSM ,導致用正常方法解析短信很容易遇到異常
想深入了解雙卡雙待手機短信發送與接收流程的話,請看我之前關於 MMS的分析:
Android 短信模塊分析(四) MMS之短信的發送與接收
這裡先看下解決方案,這裡需要以反射的方式解析不同類型的短信,並且對於不同機型,需對應地進行調整適配:
獲取短信信息,注意:為解決雙卡雙待手機解析短信異常問題,使用Java反射機制,優先解析GSM類型的短信,假如解析失敗才按CDMA類型的短信進行解析)
public static SmsMessage[] getSmsMessage(Intent intent) {
SmsMessage[] msgs = null;
Object messages[] = (Object[]) intent.getSerializableExtra(pdus);
int len = 0;
if (null != messages && (len = messages.length) > 0) {
msgs = new SmsMessage[len];
try {
for (int i = 0; i < len; i++) {
SmsMessage message = null;
if (GSM.equals(intent.getStringExtra(from))) { // 適配MOTO XT800雙卡雙待手機
message = createFromPduGsm((byte[]) messages[i]);
} else if (CDMA.equals(intent.getStringExtra(from))) { // 適配MOTO XT800雙卡雙待手機
message = createFromPduCdma((byte[]) messages[i]);
} else {
message = SmsMessage.createFromPdu((byte[]) messages[i]); // 系統默認的解析短信方式
}
if (null == message) { // 解決雙卡雙待類型手機解析短信異常問題
message = createFromPduGsm((byte[]) messages[i]);
if (null == message) {
message = createFromPduCdma((byte[]) messages[i]);
}
}
if (null != message) {
msgs[i] = message;
}
}
} catch (Exception e) {
e.printStackTrace();
msgs = getSmsMessageByReflect(intent); // 解決雙卡雙待手機解析短信異常問題
} catch (Error er) {
er.printStackTrace();
msgs = getSmsMessageByReflect(intent); // 解決雙卡雙待手機解析短信異常問題
}
}
return msgs;
}
反射方式獲取短信
/**
* 使用Java反射機制獲取短信信息(解決雙卡雙待手機解析短信異常問題,優先解析GSM類型的短信,假如解析失敗才按CDMA類型的短信進行解析)
*
* @param intent
* @return
*/
private static SmsMessage[] getSmsMessageByReflect(Intent intent) {
SmsMessage[] msgs = null;
Object messages[] = (Object[]) intent.getSerializableExtra(pdus);
int len = 0;
if (null != messages && (len = messages.length) > 0) {
msgs = new SmsMessage[len];
try {
for (int i = 0; i < len; i++) {
SmsMessage message = createFromPduGsm((byte[]) messages[i]);
if (null == message) {
message = createFromPduCdma((byte[]) messages[i]);
}
if (null != message) {
msgs[i] = message;
}
}
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
return msgs;
}
通過Java反射機制解析GSM類型的短信:
private static SmsMessage createFromPduGsm(byte[] pdu) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
return createFromPdu(pdu, com.android.internal.telephony.gsm.SmsMessage);
}
解析CDMA類型的短信
private static SmsMessage createFromPduCdma(byte[] pdu) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
return createFromPdu(pdu, com.android.internal.telephony.cdma.SmsMessage);
}
private static SmsMessage createFromPdu(byte[] pdu, String className) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class clazz = Class.forName(className);
Object object = clazz.getMethod(createFromPdu, byte[].class).invoke(clazz.newInstance(), pdu);
if (null != object) {
Constructor constructor = SmsMessage.class.getDeclaredConstructor(Class.forName(com.android.internal.telephony.SmsMessageBase));
constructor.setAccessible(true);
return (SmsMessage) constructor.newInstance(object);
} else {
return null;
}
}
Android左右滑出菜單實例分析
現在的Android應用,只要有一個什麼新的創意,過不了多久,幾乎所有的應用都帶這個創意。這不,咱們公司最近的一個持續性的項目,想在首頁加個從左滑動出來的菜單,我查閱網上
Android 自定義SeekBar動態改變硬件音量大小實現和音量鍵的同步(推薦)
1,上圖:2,代碼:MainActivity.Javapackage com.hero.zhaoq.seekbarchangeddemo;import android.c
Android 圖片選擇詳解及實例代碼
Android 圖片選擇可以達到的效果:1.第一個圖片的位置放照相機,點擊打開照相機2.其余的是顯示全部存儲的圖片,點擊一次是查看大圖,長按則是每張圖片出現一
第1個Android應用程序 Android制作簡單單頁導航
本例子演示如何添加一個簡單的單頁導航,在此基礎上,再演示如何在第2個頁面中顯示第1個頁面中撥打過的所有電話號碼。(1)通過該例子理解Android App的基本架構。(2