特定の送信者からのSMSをすべて読み取るにはどうすればよいですか?例えば。 「TM-MYAMEX」から電話に送信されたすべてのSMSの日付、時刻、a)本体をスキャンしたいと思います。
一部のWebサイトは、これが「content:// sms/inbox」から読み取れることを示しているようです。正確な方法がわかりませんでした。また、ほとんどの電話でサポートされているかどうかもわかりません。 Galaxy S2を使用しています。
この方法を試してください:
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" />
あなたは数行のコードでこれを行うことができます
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);
}
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権限を追加する必要があります。
これをお試しください。受信トレイからメッセージを読むための簡単な方法です。
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);
}
}
この権限をマニフェストに追加します。
<uses-permission Android:name="Android.permission.READ_SMS"></uses-permission>
_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」の意味がわかりませんが、すべてのSMS
を取得するコードを次に示します。
Date = new Date()
beacauseの下でBroadcastReceiver
thenすると、メッセージが現在の時刻で表示されます。
この助けを願っています。