2015-02-04 1 views
0

Я хочу работать как приложение для обмена сообщениями по умолчанию, и для этого мне приходится самостоятельно обрабатывать входящие и исходящие SMS. Когда вы вставляете SMS в БД, вы должны указать THREAD_ID. При просмотре через Telephony класс я нашел эту функциюПолучение THREAD_ID с использованием Telephony.Threads класс больше не работает

/** 
    * This is a single-recipient version of {@code getOrCreateThreadId}. 
    * It's convenient for use with SMS messages. 
    * @param context the context object to use. 
    * @param recipient the recipient to send to. 
    * @hide 
    */ 
    public static long getOrCreateThreadId(Context context, String recipient) { 
     Set<String> recipients = new HashSet<String>(); 

     recipients.add(recipient); 
     return getOrCreateThreadId(context, recipients); 
    } 

    /** 
    * Given the recipients list and subject of an unsaved message, 
    * return its thread ID. If the message starts a new thread, 
    * allocate a new thread ID. Otherwise, use the appropriate 
    * existing thread ID. 
    * 
    * <p>Find the thread ID of the same set of recipients (in any order, 
    * without any additions). If one is found, return it. Otherwise, 
    * return a unique thread ID.</p> 
    * @hide 
    */ 
    public static long getOrCreateThreadId(
      Context context, Set<String> recipients) { 
     Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon(); 
     ... 
     ... 

Теперь функция скрыта от @hide (я думаю). Я больше не могу получить к нему доступ. Я могу воспроизвести функциональность в своем коде, но хотел знать правильный способ получить THREAD_ID.

ответ

0

я использовал класс Темы для получения потоков идентификаторов получателей

 import java.util.HashSet; 
    import java.util.Set; 
    import java.util.regex.Matcher; 
    import java.util.regex.Pattern; 

    import android.content.Context; 
    import android.database.Cursor; 
    import android.net.Uri; 
    import android.provider.BaseColumns; 
    import android.text.TextUtils; 
    import android.util.Log; 
    import android.util.Patterns; 

    public final class Threads { 
    private static final String[] ID_PROJECTION = { BaseColumns._ID }; 
    private static final String STANDARD_ENCODING = "UTF-8"; 
    private static final Uri THREAD_ID_CONTENT_URI = Uri 
      .parse("content://mms-sms/threadID"); 
    public static final Uri CONTENT_URI = Uri.withAppendedPath(
      Uri.parse("content://mms-sms/"), "conversations"); 
    public static final Uri OBSOLETE_THREADS_URI = Uri.withAppendedPath(
      CONTENT_URI, "obsolete"); 
    public static final Pattern NAME_ADDR_EMAIL_PATTERN = Pattern 
      .compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*"); 

    public static final int COMMON_THREAD = 0; 
    public static final int BROADCAST_THREAD = 1; 

    // No one should construct an instance of this class. 
    private Threads() { 
    } 

    /** 
    * This is a single-recipient version of getOrCreateThreadId. It's 
    * convenient for use with SMS messages. 
    */ 
    public static long getOrCreateThreadId(Context context, String recipient) { 
     Set<String> recipients = new HashSet<String>(); 

     recipients.add(recipient); 
     return getOrCreateThreadId(context, recipients); 
    } 

    /** 
    * Given the recipients list and subject of an unsaved message, return its 
    * thread ID. If the message starts a new thread, allocate a new thread ID. 
    * Otherwise, use the appropriate existing thread ID. 
    * 
    * Find the thread ID of the same set of recipients (in any order, without 
    * any additions). If one is found, return it. Otherwise, return a unique 
    * thread ID. 
    */ 
    public static long getOrCreateThreadId(Context context, 
      Set<String> recipients) { 
     Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon(); 

     for (String recipient : recipients) { 
      if (isEmailAddress(recipient)) { 
       recipient = extractAddrSpec(recipient); 
      } 

      uriBuilder.appendQueryParameter("recipient", recipient); 
     } 

     Uri uri = uriBuilder.build(); 
     // if (DEBUG) Log.v(TAG, "getOrCreateThreadId uri: " + uri); 

     Cursor cursor = context.getContentResolver().query(uri, ID_PROJECTION, 
       null, null, null); 

     if (cursor != null) { 
      try { 
       if (cursor.moveToFirst()) { 
        return cursor.getLong(0); 
       } else { 
        return -1; 
       } 
      } catch (Exception e) { 
       return -1; 
      } finally { 
       cursor.close(); 
      } 
     } else { 
      return -1; 
     } 

    } 

    public static String extractAddrSpec(String address) { 
     Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address); 

     if (match.matches()) { 
      return match.group(2); 
     } 
     return address; 
    } 

    /** 
    * Returns true if the address is an email address 
    * 
    * @param address 
    *   the input address to be tested 
    * @return true if address is an email address 
    */ 
    public static boolean isEmailAddress(String address) { 
     if (TextUtils.isEmpty(address)) { 
      return false; 
     } 

     String s = extractAddrSpec(address); 
     Matcher match = Patterns.EMAIL_ADDRESS.matcher(s); 
     return match.matches(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^