2012-04-26 92 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