2012-06-03 16 views
26

特定の送信者からすべてのSMSをどのように読み込むのですか?例えば。私はa)身体をスキャンしたい、そしてb)TM-MYAMEXから電話に来たすべてのSMSの日付/時刻。特定の送信者からすべてのSMSを読む

ウェブサイトによっては、「content:// sms/inbox」から読むことができるようです。私は正確にどのように把握できませんでした。また、ほとんどの携帯電話でサポートされているかどうかはわかりません。私はギャラクシーS2を使用しています。

答えて

36

この方法を試してみてください。

StringBuilder smsBuilder = new StringBuilder(); 
     final String SMS_URI_INBOX = "content://sms/inbox"; 
     final String SMS_URI_ALL = "content://sms/"; 
     try { 
      Uri uri = Uri.parse(SMS_URI_INBOX); 
      String[] projection = new String[] { "_id", "address", "person", "body", "date", "type" }; 
      Cursor cur = getContentResolver().query(uri, projection, "address='123456789'", null, "date desc"); 
      if (cur.moveToFirst()) { 
       int index_Address = cur.getColumnIndex("address"); 
       int index_Person = cur.getColumnIndex("person"); 
       int index_Body = cur.getColumnIndex("body"); 
       int index_Date = cur.getColumnIndex("date"); 
       int index_Type = cur.getColumnIndex("type");   
       do { 
        String strAddress = cur.getString(index_Address); 
        int intPerson = cur.getInt(index_Person); 
        String strbody = cur.getString(index_Body); 
        long longDate = cur.getLong(index_Date); 
        int int_Type = cur.getInt(index_Type); 

        smsBuilder.append("[ "); 
        smsBuilder.append(strAddress + ", "); 
        smsBuilder.append(intPerson + ", "); 
        smsBuilder.append(strbody + ", "); 
        smsBuilder.append(longDate + ", "); 
        smsBuilder.append(int_Type); 
        smsBuilder.append(" ]\n\n"); 
       } while (cur.moveToNext()); 

       if (!cur.isClosed()) { 
        cur.close(); 
        cur = null; 
       } 
      } else { 
       smsBuilder.append("no result!"); 
      } // end if 
      } 
     } catch (SQLiteException ex) { 
      Log.d("SQLiteException", ex.getMessage()); 
     } 

のAndroidManifest.xml:

<uses-permission android:name="android.permission.READ_SMS" /> 
+0

ありがとうございました。魅力的な作品... – amity

+1

非常にうまく動作します。私は "IN"句で試してみても期待通りに動作します...しかし...アドレスフォーマットはどうですか? "348 5152182"または "348 5152 182"または "+393485152182"(国際プレフィックスを持つ同じアドレス)を検索した場合、 "sql where"ステートメントで、 "3485152182"失敗するでしょう。この種の問題を解決する上品な方法はありますか?ありがとう! – GiveEmTheBoot

+1

@GiveEmTheBoot:私はこれを行う一般的な方法はないと思う "348 5152 182"のようないくつかの文字列メソッドを使用することができますこの場合、最初にこの番号をトリミングして検索するか、 "+393485152182最初に"番号からサインをしてからそれを検索する –

1
public class SmsController extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
SmsMessage msgs[] = null; 
Bundle bundle = intent.getExtras(); 
try { 
    Object pdus[] = (Object[]) bundle.get("pdus"); 
    msgs = new SmsMessage[pdus.length]; 
    for (int n = 0; n < pdus.length; n++) { 
     byte[] byteData = (byte[]) pdus[n]; 
     msgs[n] = SmsMessage.createFromPdu(byteData); 
    } 
} catch (Exception e) { 

} 
for (int i = 0; i < msgs.length; i++) { 
    String message = msgs[i].getDisplayMessageBody(); 
    if (message != null && message.length() > 0) { 
     String from = msgs[i].getOriginatingAddress(); 
     if(FROM.contains("TM-MYAMEX")){ 
      String body = message ; 
      Date datetime = new Date() ; 
      } 
     } 
    } 
    } 
} 
} 

私は "TM-MYAMEX" の手段を何のか分からないが、ここで取得するためのコードですすべて。

Date = new Date() beacauseがBroadcastReceiverの下にある場合は、現在の時刻にメッセージが表示されます。

このヘルプが必要です。

+0

**からの今日のメッセージだけが必要です** TM-MYAMEX **は、このメッセージがAmerican Expressから受信されたことを意味します。私はちょうどあなたがこの 'cr.query(inboxUri、null、address = 'TM-MYAMEX'"、null、null);のようにクエリ中にこの値を渡すかどうかを知りたかったのです。誰もこれらの送信者からSMSを取得する方法を知っていますか? – yashhy

2
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     inbox = (Button) findViewById(R.id.inbox); 
     list = (ListView) findViewById(R.id.list); 
     arlist = new ArrayList<String>(); 
     inbox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Uri inboxUri = Uri.parse("content://sms/inbox"); 
       String[] reqCols = {"_id", "body", "address"}; 
       ContentResolver cr = getContentResolver(); 
       Cursor cursor = cr.query(inboxUri, reqCols, "address='+919456'", null, null); 
       adapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.msg_content_layout, cursor, 
         new String[]{"body", "address"}, new int[]{R.id.txt1, R.id.txt2}); 
       list.setAdapter(adapter); 
      } 
     }); 

    } 

ここでは、アドレスフィールドの値として番号+919456を追加しました。

これとは別に、あなたが顕現するREAD_SMS許可を追加する必要があります。

1

あなたがコード

String[] phoneNumber = new String[] { "+923329593103" }; 
Cursor cursor1 = getContentResolver().query(Uri.parse("content://sms/inbox"), new String[] { "_id", "thread_id", "address", "person", "date","body", "type" }, "address=?", phoneNumber, null); 
       StringBuffer msgData = new StringBuffer(); 
       if (cursor1.moveToFirst()) { 
        do { 


         for(int idx=0;idx<cursor1.getColumnCount();idx++) 
         { 
          msgData.append(" " + cursor1.getColumnName(idx) + ":" + cursor1.getString(idx)); 
         } 

        } while (cursor1.moveToNext()); 
       } else { 

        edtmessagebody.setText("no message from this contact"+phoneNumber); 
       } 
2

のいくつかの行でこれを行うことができますが、受信トレイからメッセージを読み取るための簡単な方法でこれを試します。

public class ReadMsg extends AppCompatActivity { 

ListView listView; 
private static final int PERMISSION_REQUEST_READ_CONTACTS = 100; 
ArrayList smsList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_read_msg); 
    listView = (ListView)findViewById(R.id.idList); 

    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS); 

    if (permissionCheck == PackageManager.PERMISSION_GRANTED){ 
     showContacts(); 
    }else{ 
     ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS},PERMISSION_REQUEST_READ_CONTACTS); 
    } 
} 

private void showContacts() { 
    Uri inboxURI = Uri.parse("content://sms/inbox"); 
    smsList = new ArrayList(); 
    ContentResolver cr = getContentResolver(); 


    Cursor c = cr.query(inboxURI,null,null,null,null); 
    while (c.moveToNext()){ 
     String Number = c.getString(c.getColumnIndexOrThrow("address")).toString(); 
     String Body= c.getString(c.getColumnIndexOrThrow("body")).toString(); 
     smsList.add("Number: "+ Number + "\n" + "Body: "+ Body); 
    } 
     c.close(); 
    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, smsList); 
    listView.setAdapter(adapter); 
} 

}

マニフェストにこの権限を追加します。

関連する問題