2012-04-26 118 views
4

我需要訪問存儲在SIM上的短信(不是在電話上)。在SIM上訪問短信

根據grepcode(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/android/telephony/SmsManager.java),android telephony.SmsManger API包含一個公共函數「getAllMessagesFromIcc()」,並表明它存在於2.1中,但是官方的android SDK不支持這樣的函數。

爲什麼這種差異?

這個功能正是我所需要的。如果它不存在,我如何才能讀取SIM卡上當前的SMS消息?

我沒有找到這個帖子在stackoverflow(Retrieving the SMS Messages from the SIM card on with android),SEEMS做我想做的,但它實際上擴展了「廣播接收器」,我解釋爲捕獲傳入的消息,不讀取已存儲在SIM卡上的消息。

感謝您的任何幫助。

+3

如果用戶沒有SIM卡,你會怎麼做? – 2012-04-26 18:46:37

+0

在用戶沒有SIM的情況下使用此應用程序是一種例外情況。該應用程序將指示一個錯誤。 – user1359314 2012-04-27 11:57:43

+0

好吧,僅供參考,有大量的用戶沒有模擬人生,但你可能知道這個 – 2012-04-27 13:13:21

回答

2

找到了答案。 Android中有許多公共功能都標有「(@HIDE)」標籤。這些函數從android SDK中被剝離,以阻止(很好地防止)普通程序員使用它們。

當然,引進的挑戰實在太多了一些程序員...

欲瞭解更多信息,請參見: http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

不幸的是,這似乎是目前的手機(三星Galaxy S的,LG,2012)刪除了他所引用的文件,因此不再支持上述過程。

0

如果可以訪問串行設備(的Android seems to have/dev/smd0可用),那麼可以用下面的AT命令讀取從SIM SMS消息:

AT+CPMS="SM","SM" 
AT+CMGF=0 
AT+CMGL=4 

以上是PDU模式中,使用以下文字模式

AT+CPMS="SM","SM" 
AT+CMGF=1 
AT+CMGL="ALL" 
2

這是我一直在與自己爭鬥的一件事。確實很多功能都是用@HIDE註釋標記的。

經過一段時間的研究,我發現我可以利用隱藏的方法使用反射來讀取SIM卡消息。你可以在Java中查找Reflection。

請注意在使用隱藏/內部方法時,您不能保證這些方法在現有的Android平臺(版本)中會存在或具有相同的行爲。

導入下面的包

import android.telephony.SmsMessage; 
import java.lang.reflect.Method; 

下面是一個示例代碼的嘗試,它爲我工作反正。

public ArrayList<SmsMessage> getSimCardMessages() { 

    // this implementation was recorded to work for android 1.6 
    // it was tested Ok on android 2.3 

    ArrayList<SmsMessage> list = new ArrayList<SmsMessage>(); 

    try { 
     Class<?> smsMgrClass = Class.forName("android.telephony.SmsManager"); 
     Method getSMSMgr = smsMgrClass.getMethod("getDefault"); 
     Object smsDefaultInstance = getSMSMgr.invoke(null); 
     Method getMessages = smsMgrClass.getMethod("getAllMessagesFromIcc"); 
     @SuppressWarnings("unchecked") 
     list = (ArrayList<SmsMessage>) getMessages.invoke(smsDefaultInstance); 

     Log.d("sms manager", "length: " + list.size()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return list; 
} 

你可能想查找http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/telephony/SmsManager.java#SmsManager.getAllMessagesFromIcc%28%29爲所使用的機器人內置的類和方法的細節在示例代碼中調用。

+0

這個解決方案也適用於Android冰淇淋三明治 – 2013-05-28 09:46:07