4

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(AndroidでSIMカードからSMSメッセージを取得する)で見つけましたが、これは私がやりたいことをしているように見えますが、実際には「ブロードキャストレシーバー」を拡張しています。すでにSIMに保存されています。

助けてくれてありがとう。

4

3 に答える 3

2

これは私が自分自身と戦ってきたことの1つです。多くの関数が @HIDE アノテーションでマークされたことは事実です。

しばらく調査した結果、Reflection を使用して 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を参照してください。サンプル コードで呼び出される、使用されている android の組み込みクラスとメソッドの詳細については、%29を参照してください。

于 2013-05-26T02:57:06.890 に答える
2

答えを見つけました。Android には、「(@HIDE)」タグでマークされたパブリック関数が多数あります。これらの関数は、Android SDK から取り除かれ、平均的なプログラマーによる使用を思いとどまらせます (まあ、ほとんど防止します)。

もちろん、導入された課題は、一部のプログラマーにとってはやり過ぎです...

詳細については、http: //devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/を参照してください。

残念ながら、現在の携帯電話 (Samsung Galaxy S および LG、2012 年) では、彼が参照しているファイルが削除されているようです。そのため、上記のプロセスはサポートされなくなりました。

于 2012-05-04T17:52:48.210 に答える
0

シリアル デバイスにアクセスできる場合 (Android /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"
于 2013-05-09T02:27:42.357 に答える