web-dev-qa-db-ja.com

新しいテレフォニーコンテンツプロバイダーを使用してSMS

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によると、サポートされている方法でこれを実行できるはずです。

11
CodingIntrigue

このクラスを使用して機能させることができるようです。パッケージは 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;
}
31
hichris123

私は次のようにそれをしました。 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;

}
1
longi

私は数日前にこれを見つけましたが、どのサイトからか思い出せません。ユーザーがアプリをデフォルトのSMSアプリにすることを選択した場合にのみ、メッセージを復元できます。これはあなたの質問に完全に答えるかどうかはわかりません。私はまだこれを試していません

  1. 現在のデフォルトSMSアプリのパッケージ名を照会し、保存します。

    String defaultSmsApp = Telephony.Sms.getDefaultSmsPackage(context);
    
  2. 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);
    
0
Pontus Backlund