SmsObserver
sınıf bir giden SMS mesajı için atanan iplik kimliğini almak için alıcının adresi ve ileti gövdesinin karşı SMS tabloda content://sms/
Uri
ve çekler değişiklikleri kendini kaydettirir bir ContentObserver
olduğunu. Sınıf, gönderim sınıfınızın belirlendiğinde iş parçacığı kimliğini almak için gerçekleştirmesi gereken bir arabirim sunar; bu, zaman uyumsuz olarak gerçekleşir.
public class SmsObserver extends ContentObserver {
private static final Handler handler = new Handler();
private static final Uri uri = Uri.parse("content://sms/");
private final Context context;
private final ContentResolver resolver;
private final String address;
private final String body;
public interface OnSmsSentListener {
public void onSmsSent(int threadId);
}
public SmsObserver(Context context, String address, String body) {
super(handler);
if (context instanceof OnSmsSentListener) {
this.context = context;
this.resolver = context.getContentResolver();
this.address = address;
this.body = body;
}
else {
throw new IllegalArgumentException(
"Context must implement OnSmsSentListener interface");
}
}
public void start() {
if (resolver != null) {
resolver.registerContentObserver(uri, true, this);
}
else {
throw new IllegalStateException(
"Current SmsObserver instance is invalid");
}
}
@Override
public void onChange(boolean selfChange, Uri uri) {
Cursor cursor = null;
try {
cursor = resolver.query(uri, null, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
final int type = cursor.getInt(
cursor.getColumnIndex(Telephony.Sms.TYPE));
if(type == Telephony.Sms.Sent.MESSAGE_TYPE_SENT) {
final String address = cursor.getString(
cursor.getColumnIndex(Telephony.Sms.ADDRESS));
final String body = cursor.getString(
cursor.getColumnIndex(Telephony.Sms.BODY));
final int threadId = cursor.getInt(
cursor.getColumnIndex(Telephony.Sms.THREAD_ID));
if (PhoneNumberUtils.compare(address, this.address) &&
body.equals(this.body)) {
((OnSmsSentListener) context).onSmsSent(threadId);
resolver.unregisterContentObserver(this);
}
}
}
}
finally {
if (cursor != null) {
cursor.close();
}
}
}
}
Bunun bir örneği mesaj gönderilmeden önce başlamış olması gerekir, ve iplik numarası gönderme sınıfının arayüzü yöntemi uygulamaya geçilecek. Örneğin, bir Button
tıklayarak üzerine bir Activity
gönderirken eğer:
public class MainActivity extends Activity
implements SmsObserver.OnSmsSentListener {
...
public void onClick(View v) {
String address = "+1 234 567 8900";
String body = "HI Greg! ";
new SmsObserver(this, address, body).start();
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(address, null, body, null, null);
}
@Override
public void onSmsSent(int threadId) {
// Here's the thread ID.
}
}
siz de READ_SMS
izni gerekir unutmayın.
Lollipop'tan başlayarak olası bir alternatif kullanılabilir. Gönderilen iletinin URI'si, sendTextMessage()
yönteminde dördüncü bağımsız değişken olarak iletilen PendingIntent
numaralı Intent
numaralı String
ekine eklenecektir. Ekstra, "uri"
anahtarına sahip olacak ve Uri
olarak ayrıştırılabilir, daha sonra yukarıda gösterildiği gibi iş parçacığı kimliğini almak için ContentResolver
sorgusunda kullanılabilir.
Örneğin, sonuç için bir BroadcastReceiver
kullanılıyorsa, sendTextMessage()
çağrı şöyle olurdu:
Intent sentIntent = ...
PendingIntent sentPi = PendingIntent.getBroadcast(context, 0, sentIntent, 0);
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(address, null, body, sentPi, null);
Ve Receiver ekstra alınırken şöyle olacaktır:
public class SmsResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
String uriString = data.getStringExtra("uri");
Uri uri = Uri.parse(uriString);
// Query as shown above in the ContentObserver
...
}
}
Evet, bunu gerçekten yapamazsın. "Telefon numarası tam olarak mümkün değil" mesajı gönderirken nasıl bir mesaj göndermeyi planladığınızdan emin değilim, ancak bir seçenek göndermeden önce bir 'ContentObserver 'öğesini' content: // sms '' Uri' üzerine koymaktır. İleti hangi iş parçacığı atanır. –
Mesajın hangi thread kimliğine atandığını görmek için bir demo koduyla bir cevap yazabilir misiniz? –
telefon numarası, kodun üzerinde bulunduğu telefonun numarasıdır. –