1

我試圖讓從Android中的聯繫人列表中的用戶使用選秀權意向書如下面的代碼聯繫人的聯繫方式:Xamarin的Android,通過使用CursorLoader與選和精選ARGS取得聯繫的手機號碼

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();     
     } 
    } 

的問題是我想的是,用戶選擇檢索聯繫人的唯一信息,但我得到的是所有其他聯繫人數據被檢索,所以我特里d通過設置字符串selectionString =「id =?」來使用CursorLoader的selection和selectionargs參數;和selectionArgs爲string [] selectionStringArgs = new string [] {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的結果,我無法找到一個適用於Android的Xamarin在互聯網上的東西,請幫助。

謝謝,

回答

1

最後,我發現該溶液中,我用下面的字符串中的cursorloader方法的選擇參數:

串selectionString = ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + 「=」 + ID;

現在只有選定的聯繫人號碼被檢索。

我希望這會幫助別人。

+0

你把這段代碼放在哪裏? – JotaPardo

+0

我把這個後,在第一個'IF' bloque賦值變量'ID'驗證cursor.movefirst()...並且我得到錯誤:無法綁定參數在索引1,因爲索引超出範圍。該語句有0個參數。 – JotaPardo

0

在@TMSL的其他信息,我添加代碼AFER此BLOQUE

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的定義中使用的參數,在null轉換selectionStringArgs

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

我發現從xamarin this文檔引導

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

所以,在從@TMSAL代碼中使用不能使用像 「CONTACT_ID = 2700」 的值的變量selectionStringArgs,因爲CursorLoader的參數SelectionArgs不是過濾器,但不是「在選擇中要替換的參數」

我希望這也能幫助其他人。

相關問題