近期三星陸續放出android4.4.2ROM更新包,android4.4.2對短信雖說是放開了權限,但其實是加強了限制,一台手機智能通過一個設置為默認應用的短信應用軟件才能發送短信,否則就無法對短信數據庫進行操作。
以為只是對這個進行了變更, 認真觀察android4.4.2 mms源碼完,發現對短信的廣播也進行了一些變更,有些廠家為了兼容會繼續發送android.provider.Telephony.SMS_RECEIVED廣播,但是有些廠家就不厚道了,在android4.4上就發送android.provider.Telephony.SMS_DELIVER廣播,因為他只對自帶的短信應用負責。
所以短信應用如果需要兼容android4.4.2及以下版本,則需要接收這兩個廣播,這樣一來就可以保證都能收的到;但是總是開心的太早,換了一部android4.4.2的手機,發現開始接收到重復的短信,原來這些所謂厚道的廠家,兩個廣播都發;這下好了,改怎么處理呢?
這邊有一個最土的方式,就是攔截,獲取短信時間,判斷時間是否與上一條短信時間相同,如果相同不做處理,基本上是同事觸發。這個方法雖然最快,但是並不覺的靠譜,繼續實現的話,還得繼續分析android4.4.2的源碼。
以下提供判斷android4.4.2默認短信應用代碼:
/**
* 默認短信檢測
* @param context 應用對象
* @param myPackageName 應用包名
* @return
*/
public static boolean isDefaultSms(Context context,String myPackageName){
boolean isDefault=false;
try {
int currentapiVersion=android.os.Build.VERSION.SDK_INT;
if(currentapiVersion>=android.os.Build.VERSION_CODES.KITKAT){
String defaultSmsApplication = Telephony.Sms.getDefaultSmsPackage(context);
if (defaultSmsApplication != null && defaultSmsApplication.equals(myPackageName)) {
isDefault=true;
}
}
} catch (Exception e) {
// TODO: handle exception
}
return isDefault;
}
/**
* 前往設置默認短信應用
* @param context 應用對象
* @param myPackageName 應用包名
*/
public static void startSetDefault(Context context,String myPackageName){
String ACTION_CHANGE_DEFAULT = "android.provider.Telephony.ACTION_CHANGE_DEFAULT";
String EXTRA_PACKAGE_NAME = "package";
int currentapiVersion=android.os.Build.VERSION.SDK_INT;
if(currentapiVersion>=android.os.Build.VERSION_CODES.KITKAT){
if(!isDefaultSms(context,myPackageName)){
Intent intent = new Intent(ACTION_CHANGE_DEFAULT);
intent.putExtra(EXTRA_PACKAGE_NAME, context.getPackageName());
context.startActivity(intent);
}
}
}
