Android: запрос SMS уникальных DisplayName (s) эффективно - PullRequest
1 голос
/ 10 февраля 2012

Я пытаюсь написать действие, в котором отображаются отображаемые имена контактов, эволюционировавших в SMS-разговорах.

К сожалению:

  1. База данных SMS не содержитDisplayName

    , поэтому я использовал функцию, которая использует адрес "номер телефона", чтобы получить DisplayName

  2. Я не знаю, как сделать запросуникальные адреса из базы данных SMS

    , поэтому я использовал отсортированный запрос, использовал цикл для поиска уникальных DisplayNames, а затем поместил их в массив

Если нет, то лучше ли запускать этот процесс в фоновом режиме?но как откроется действие, если список еще не подготовлен?!

Наконец, я использовал этот массив в ArrayAdapter для заполнения моего ListView (в значительной степени пытаясь имитировать нативное приложение Messaging)

Оказалось, что открытие заняло много времени (около 2-3 секунд, а у меня мало сообщений)

Есть ли способ решить какую-либо илиобе мои проблемы эффективно?


Вот мой код


public class MessagesPicker extends Activity {

    Cursor myCursor;
    ListView pickerListView;
    public static final String MessageAddress = address;
    public static final String MessageID = _id;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.picker);

        ContentResolver cr = getContentResolver();
        myCursor = cr.query(Uri.parse(contentsms), null, null, null, MessageAddress +  ASC); //getting sorted data to easy finding uniqueness

        /**setting up unique DisplayNames array**/
        int allCount = myCursor.getCount(), uniqueCount = 0;        
        String[] uniqueNames = new String[allCount];
        String temp1,temp2;
        myCursor.moveToFirst();
        temp1 = getContactDiplayNameByAddr();
        uniqueNames[uniqueCount++] = temp1;
        do {
            temp2 = getContactDiplayNameByAddr();
            if (temp1.compareTo(temp2) != 0){
                uniqueNames[uniqueCount++] = temp2;
                temp1 = temp2;
            }
        }while(myCursor.moveToNext());

        String [] valuesArray = new String[uniqueCount];    //filling the array
        for (int i = 0 ; i  uniqueCount ; i++)
            valuesArray[i] = uniqueNames[i];

        /**setting up the ListView**/
        ArrayAdapterString adapter = new ArrayAdapterString(this, android.R.layout.simple_list_item_multiple_choice, valuesArray);
        pickerListView = (ListView)findViewById(R.id.PickerLV); //linking the object to the interface
        pickerListView.setAdapter(adapter);                     //setting the adapter
        pickerListView.setItemsCanFocus(false);                 //allowing to check the checkbox
        pickerListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);    //allowing multiple choices

    }

    String getContactDiplayNameByAddr() { //this function returns DisplayName, or if not available, returns the address

        String Address = myCursor.getString(myCursor.getColumnIndex(address));
        Uri personUri = Uri.withAppendedPath( ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Address);  
        Cursor cur = getContentResolver().query(personUri,  
                                    new String[] {PhoneLookup.DISPLAY_NAME},  
                                    null, null, null );  
        if( cur.moveToFirst() ) {  
            String DisplayName = cur.getString(cur.getColumnIndex(PhoneLookup.DISPLAY_NAME));  
            cur.close();  
            return DisplayName;  
       }  
       return Address; 
    }
}
...