Comment puis-je lire tous les SMS d'un expéditeur particulier? Par exemple. Je souhaite scanner a) le corps et b) la date/heure de tous les SMS provenant de 'TM-MYAMEX' vers le téléphone.
Certains sites Web semblent indiquer que cela peut être lu à partir de "contenu: // sms/boîte de réception". Je ne pouvais pas comprendre exactement comment. Je ne sais pas non plus s'il est pris en charge sur la plupart des téléphones. J'utilise un Galaxy S2.
essayez de cette façon:
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" />
vous pouvez le faire en quelques lignes de code
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);
}
});
}
Ici, j'ai ajouté le numéro +919456 comme valeur du champ d'adresse.
En dehors de cela, vous devez ajouter l'autorisation READ_SMS pour manifester:
essayez ceci, c'est un moyen facile de lire les messages de la boîte de réception.
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);
}
}
Ajoutez cette autorisation dans les manifestes.
<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() ;
}
}
}
}
}
}
Je ne sais pas ce que signifie "TM-MYAMEX" mais voici le code pour obtenir tous les SMS
.
Date = new Date()
parce que son sous un BroadcastReceiver
alors le tme vous obtenez le message son l'heure actuelle.
J'espère que cette aide.