2015-03-14 3 views
0

Я разрабатываю приложение, в котором одна из его функций позволяет пользователю вводить номер телефона или выбирать один из контактов телефона.StartActivityForResult для нескольких кнопок доступа к одному действию и получения разных данных по выбору?

Активность имеет 3 EditTexts вместе с 3 Buttons каждого на стороне, а кнопки открыть Контакты Activity и возвращает выбранный телефонный номер и устанавливает EditText соответствующим образом.

Я попытался установить отдельно cursors для каждого button. Я также пробовал использовать разные переменные intent.

Моя проблема: Когда пользователь выбирает контакт для получения данных, курсор возвращает другое число. Либо он возвращает контакт рядом с ним, либо ранее выбранный контакт.

OnClick метод для 3 кнопки с startActivityForResult.

//The intent 
i = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 

public void onClick(View v) { 

     switch (v.getId()){ 

     case (R.id.button1): 
     startActivityForResult(i, 0); 
     break; 

     //I know it's an ImageView 
     case (R.id.imageView1): 

     startActivityForResult(i, 1); 
     break; 

     case (R.id.imageView2): 

     startActivityForResult(i, 2); 
     break; 

     } 
    } 

OnActivityResult

public void onActivityResult(int requestCode, int resultCode, Intent intent) { 


    super.onActivityResult(requestCode, resultCode, intent); 

    switch (requestCode){ 

    case (0) : 
      if (resultCode == Activity.RESULT_OK) { 
       Cursor c = getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); 
        c.moveToFirst(); 
        contact1 = c.getString(c.getColumnIndex(Phone.NUMBER)); 
        et.setText(contact1); 

       } 
      break; 

    case (1) : 
      if (resultCode == Activity.RESULT_OK) { 
       Cursor c1 = getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); 
        c1.moveToFirst(); 
        contact2 = c1.getString(c1.getColumnIndex(Phone.NUMBER)); 
        et2.setText(contact2); 


       } 
      break; 
    case (2) : 
     if (resultCode == Activity.RESULT_OK) { 
      Cursor c2 = getContentResolver().query(Phone.CONTENT_URI, null, null, null, null); 
       c2.moveToFirst(); 
       contact3 = c2.getString(c2.getColumnIndex(Phone.NUMBER)); 
       et3.setText(contact3); 

      } 
     break; 
      } 

     } 

ответ

3

изменение Phone.CONTENT_URI в intent.getData();

Uri contactData = intent.getData(); 
Cursor c = getContentResolver().query(contactData, null, null, null, null); 

то, что вы делаете неправильно запрашивает каждый раз, точно такой же запрос без учета intent результата ... так конечно, вы получите одинаковый результат каждый раз

Кроме того, потому что вы хотите, чтобы получить номер телефона добавить projection значение:

String[] projection = {Phone.NUMBER}; 
getContentResolver().query(contactData, projection, null, null, null); 

, чтобы лучше понять, пожалуйста, прочитайте how to get contact phone number

+0

Хм, теперь я получаю IllegalStateException (не удалось прочитать строку 0) для курсоры. Что это значит? – Neaco

+0

это означает, что указатель столбца неверен ... запустите 'c1.getColumnNames()' и напечатайте для себя все возвращаемые столбцы, используйте один из них ... – royB