【问题标题】:Accessing SMS messages on SIM访问 SIM 上的 SMS 消息
【发布时间】:2013-10-18 02:14:41
【问题描述】:

我需要访问存储在 SIM 卡(而不是手机)上的 SMS 消息。

根据 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) 上找到了这篇文章,这似乎可以满足我的要求,但它实际上扩展了“广播接收器”,我将其解释为捕获传入消息,而不是读取已存储在 SIM 卡上的消息.

感谢您的帮助。

【问题讨论】:

  • 如果用户没有sim卡怎么办?
  • 在用户没有 SIM 卡的情况下使用此应用程序是一个例外情况。应用程序将指示错误。
  • 好吧,仅供参考,有大量用户没有模拟人生,但您可能知道这一点

标签: android sms sim-card


【解决方案1】:

找到答案。 Android 中有许多公共函数都标有“(@HIDE)”标签。这些函数已从 android SDK 中删除,以阻止(嗯,几乎阻止)普通程序员使用它们。

当然,引入的挑战对于一些程序员来说实在是太大了...

有关详细信息,请参阅: http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

不幸的是,目前的手机(三星 Galaxy S 和 LG,2012 年)似乎已经删除了他所指的文件,因此不再支持上述过程。

【讨论】:

    【解决方案2】:

    这是我一直在与自己斗争的一件事。确实很多函数都标有@HIDE注解。

    经过一段时间的研究,我注意到我可以利用反射的隐藏方法来读取 SIM 消息。您可以在 Java 中查找反射。

    请注意,在使用隐藏/内部方法时,不能保证这些方法在现有的 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 以获取有关示例代码中调用的使用的 android 内置类和方法的详细信息。

    【讨论】:

      【解决方案3】:

      如果您可以访问串行设备(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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多