1

Я пытаюсь получить контактную информацию о контакте, что выбирает пользователь из списка контактов в Android с помощью Intent как следующий код:Xamarin Android, получить контактный номер мобильного телефона с помощью CursorLoader с отбором и выбором арг

Intent Intent = new Intent(Intent.ActionPick, ContactsContract.Contacts.ContentUri);    
     Intent.SetType(ContactsContract.Contacts.ContentType); 
     StartActivityForResult(Intent, 3); 

Теперь на намерение результатов я запускаю следующий код, чтобы получить конкретную контактную информацию:

public override void OnActivityResult(int requestCode, int resultCode, Intent data) 
    {   
     if (requestCode == 3 && resultCode == -1 && data != null) //result code -1 means OK 0 Means cancelled Result.Ok 
     { 
      var ContactData = data.Data; 
      string ID = ""; 
      string name = ""; 
      string address = ""; 
      byte[] picture = new byte[0]; 
      List<string> numbers = new List<string>(); 
      List<string> emails = new List<string>(); 
      string mobile = ""; 
      string email = ""; 
      string selectionString = "id = ?"; 



      string[] columnsNames = new string[] { 
       ContactsContract.Contacts.InterfaceConsts.Id, 
       ContactsContract.Contacts.InterfaceConsts.DisplayName, 
       ContactsContract.Contacts.InterfaceConsts.PhotoUri 
      }; 

      var loader = new CursorLoader(Statics.mainActivity, ContactData, null, null, null, null);     
      var cursor = (ICursor)loader.LoadInBackground(); 


      if (cursor.MoveToFirst()) 
      { 
       ID = cursor.GetString(cursor.GetColumnIndex(columnsNames[0])); 
       name = cursor.GetString(cursor.GetColumnIndex(columnsNames[1])); 
       picture = cursor.GetBlob(cursor.GetColumnIndex(columnsNames[2]));     
      } 

      //Store Contact ID 
      string[] selectionStringArgs = new string[] { ID }; 

      //Phone Numbers 
      string[] columnsNames2 = new string[] { 
       ContactsContract.CommonDataKinds.Phone.Number     
      }; 

      var loader2 = new CursorLoader(Statics.mainActivity, ContactsContract.CommonDataKinds.Phone.ContentUri, columnsNames2, selectionString, selectionStringArgs, null); 
      var cursor2 = (ICursor)loader2.LoadInBackground(); 

      while (cursor2.MoveToNext()) 
      { 
       numbers.Add(cursor2.GetString(cursor2.GetColumnIndex(columnsNames2[0]))); 
      } 

      //Email Address 
      string[] columnsNames3 = new string[] { 
       ContactsContract.CommonDataKinds.Email.Address 
      }; 


      var loader3 = new CursorLoader(Statics.mainActivity, ContactsContract.CommonDataKinds.Email.ContentUri, columnsNames3, selectionString, selectionStringArgs, null); 
      var cursor3 = (ICursor)loader3.LoadInBackground(); 

      while (cursor3.MoveToNext()) 
      { 
       emails.Add(cursor3.GetString(cursor3.GetColumnIndex(columnsNames3[0]))); 
      } 



      int TempRecepitntID = 0; 
      EmployeesViewModel tempRecipent = new EmployeesViewModel(); 
      TempRecepitntID = Statics.mainActivity.currentViewModel.SelectedChat.ReceiverEmployee; 

      foreach (EmployeesViewModel evm in Statics.mainActivity.currentViewModel.Employees) 
      { 
       if (evm.ID == TempRecepitntID) 
        tempRecipent = evm; 
      } 

      new Android.Support.V7.App.AlertDialog.Builder(Statics.mainActivity) 
        .SetPositiveButton("Yes", (sender1, args) => 
        { 
         Statics.mainActivity.currentViewModel.AddMessage(picture, tempRecipent, Statics.mainActivity.currentViewModel.SelectedChat.ID, "contact", 0, "", name, numbers[0], mobile, email, address); 
        }) 
        .SetNegativeButton("No", (sender1, args) => 
        { 
         // cancel 
        }) 
        .SetMessage("Are you shure you want to send?") 
        .SetTitle("System Message") 
        .Show();     
     } 
    } 

проблема заключается в том, я хочу, чтобы получить только информацию о контакте, которые пользователь выбрал, но то, что я получаю все другие данные контактов извлекаются, поэтому я trie d использовать параметры выбора и selectionargs CursorLoader, установив строку selectionString = "id =?"; и selectionArgs в строку [] selectionStringArgs = новая строка [] {ID}; значение ID извлекается из следующего кода:

  if (cursor.MoveToFirst()) 
      { 
       ID = cursor.GetString(cursor.GetColumnIndex(columnsNames[0])); 
       name = cursor.GetString(cursor.GetColumnIndex(columnsNames[1])); 
       picture = cursor.GetBlob(cursor.GetColumnIndex(columnsNames[2]));     
      } 

      //Store Contact ID 
      string[] selectionStringArgs = new string[] { ID }; 

      //Phone Numbers 
      string[] columnsNames2 = new string[] { 
       ContactsContract.CommonDataKinds.Phone.Number     
      }; 

Но теперь она возвращает 0 результатов, я не мог найти что-нибудь в Интернете, которая относится к Xamarin андроида, пожалуйста, помогите.

Благодаря,

ответ

1

Наконец я нашел решение, я использовал следующую строку в параметре выбора метода cursorloader:

строка selectionString = ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + "=" + ID;

и теперь извлекаются только выбранные контактные номера.

Надеюсь, это поможет кому-то еще.

+0

Где вы размещаете этот код? – JotaPardo

+0

Я положил это после присваивания переменной 'ID' в первом' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '', который проверяет cursor.movefirst() ... и я получаю ошибку: не удается связать аргумент с индексом 1, потому что индекс вне диапазона. Оператор имеет 0 параметров. – JotaPardo

0

В дополнительной информации @TMSL, добавить код АВЭС этого Блоке

if (cursor.MoveToFirst()) 
        { 
         ID = cursor.GetString(cursor.GetColumnIndex(columnsNames[0])); 
         name = cursor.GetString(cursor.GetColumnIndex(columnsNames[1])); 
         picture = cursor.GetBlob(cursor.GetColumnIndex(columnsNames[2])); 

        } 

Здесь

  selectionString = ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + "=" + ID; 

Затем я изменил параметры, используемые в определении переменной Loader2, преобразование selectionStringArgs в null ,

var loader2 = new CursorLoader(this.Activity, ContactsContract.CommonDataKinds.Phone.ContentUri, columnsNames2, selectionString, null,null); 
        var cursor2 = (ICursor)loader2.LoadInBackground(); 

Я нашел this документация от Xamarin руководства

  • Uri – The fully qualified name of the ContentProvider.
  • Projection – Specification of which columns to select for the cursor.
  • Selection – Similar to a SQL WHERE clause.
  • SelectionArgs – Parameters to be substituted in the Selection.
  • SortOrder – Columns to sort by.

Таким образом, переменная selectionStringArgs используется в коде из @TMSAL не может использовать значение, как «contact_id = 2700», так как параметр CursorLoaderSelectionArgs не является фильтром, но не «Параметры, подлежащие замещению в выборе»

Я надеюсь, что это тоже поможет кому-то еще.

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

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