2016-03-19 21 views
0

"10001" şeklinde özelleştirilmiş bir iş parçacığı kimliğine sahip bir SMS oluşturmak istiyorum. Bunu nasıl yapabilirim ? Nedeni, bir SMS silme işlevini uygulama ihtiyacım olduğu ve belirli bir SMS iş parçacığını silmenin tek yolunun, iş parçacığı kimliği VEYA telefon numarası aracılığıyla olması ve telefon numarası alma işleminin bu noktada tam olarak mümkün olmaması, dolayısıyla özel bir iş parçacığı kimliği tanımlanması gerektiğidir. SMS göndermede.SmsManager ile sms, Android'de özelleştirilmiş thread kimliği ile nasıl gönderilir?

SmsManager smsManager = SmsManager.getDefault(); 
    smsManager.sendTextMessage("+1 203 514 6584", null, "HI Greg! ", null, null); 

Şimdiden teşekkürler yardımın için:

Ben şimdiye kadar aşağıda normal SMS çalışma kodu almak için sadece başardı!

+0

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. –

+0

Mesajın hangi thread kimliğine atandığını görmek için bir demo koduyla bir cevap yazabilir misiniz? –

+0

telefon numarası, kodun üzerinde bulunduğu telefonun numarasıdır. –

cevap

2

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 
     ... 
    } 
} 
İlgili konular