4.4 SMS API によると、新しいバージョンは次の機能を提供します。
アプリがデバイス上でSMSおよびMMSメッセージを読み書きできるようにする
この機能に関する情報も、新しいSDKのサンプルも見つかりません。これは、私がこれまでに新しい着信メッセージを読むために持っているものです。
しかし、私は既存のメッセージを読むデバイスに保存したいと思います:
// Can I only listen for incoming SMS, or can I read existing stored SMS?
SmsMessage[] smsList = Telephony.Sms.Intents.getMessagesFromIntent(intent);
for(SmsMessage sms : smsList) {
Log.d("Test", sms.getMessageBody())
}
注意:SMSコンテンツプロバイダー の使用について知っていますが、この方法はサポートされていません。リンクされたAPIによると、サポートされている方法でこれを実行できるはずです。
このクラスを使用して機能させることができるようです。パッケージは Telephony.Sms.Conversations です。
次のコードはコンテンツプロバイダーメソッドを使用していますが、これはSMSメッセージを読み取るためにAPIレベル19(KitKat)で追加された公式APIになりました。
public List<String> getAllSmsFromProvider() {
List<String> lstSms = new ArrayList<String>();
ContentResolver cr = mActivity.getContentResolver();
Cursor c = cr.query(Telephony.Sms.Inbox.CONTENT_URI, // Official CONTENT_URI from docs
new String[] { Telephony.Sms.Inbox.BODY }, // Select body text
null,
null,
Telephony.Sms.Inbox.DEFAULT_SORT_ORDER); // Default sort order
int totalSMS = c.getCount();
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
lstSms.add(c.getString(0));
c.moveToNext();
}
} else {
throw new RuntimeException("You have no SMS in Inbox");
}
c.close();
return lstSms;
}
私は次のようにそれをしました。 SMSObjectを作成します。
public class SMSObject {
private String _id;
private String _address;
private String _msg;
private String _readState; // "0" for have not read sms and "1" for have
// read sms
private String _time;
private String _folderName;
//+ getter and setter methods and
@Override
public String toString() {
return "SMSObject [_id=" + _id + ", _address=" + _address + ", _msg="
+ _msg + ", _readState=" + _readState + ", _time=" + _time
+ ", _folderName=" + _folderName + "]";
}
そしてここに、現在のすべてのSMSオブジェクトを単純にログに記録する単純な関数があります
private void readSMS() {
List<SMSObject> lstSms = new ArrayList<SMSObject>();
SMSObject objSms = new SMSObject();
Uri message = Uri.parse("content://sms/");
ContentResolver cr = this.getContentResolver();
Cursor c = cr.query(message, null, null, null, null);
// this.startManagingCursor(c);
int totalSMS = c.getCount();
Log.d("SMS Count->", "" + totalSMS);
if (c.moveToFirst()) {
for (int i = 0; i < totalSMS; i++) {
objSms = new SMSObject();
objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
objSms.setAddress(c.getString(c
.getColumnIndexOrThrow("address")));
objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
objSms.setReadState(c.getString(c.getColumnIndex("read")));
objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
objSms.setFolderName("inbox");
} else {
objSms.setFolderName("sent");
}
lstSms.add(objSms);
Log.d("SMS at " + i, objSms.toString());
c.moveToNext();
}
}
// else {
// throw new RuntimeException("You have no SMS");
// }
c.close();
// return lstSms;
}
私は数日前にこれを見つけましたが、どのサイトからか思い出せません。ユーザーがアプリをデフォルトのSMSアプリにすることを選択した場合にのみ、メッセージを復元できます。これはあなたの質問に完全に答えるかどうかはわかりません。私はまだこれを試していません
現在のデフォルトSMSアプリのパッケージ名を照会し、保存します。
String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
SMSメッセージを復元するには、デフォルトのSMSアプリをアプリに変更するようにユーザーに要求します(デフォルトのSMS = SMSプロバイダー)に書き込むためのアプリ。
Intent intent = new Intent(context, Sms.Intents.ACTION_CHANGE_DEFAULT);
intent.putExtra(Sms.Intents.EXTRA_PACKAGE_NAME, context.getPackageName());
startActivity(intent);