2017-09-09 3 views
1

Xamarinフォームアプリケーションでユーザーの連絡先にアクセスしようとしています。私はプラットフォーム固有の実装を書いており、DependencyServiceを使用して呼び出されました。これは正常に動作しているようです。しかし、私はAndroidの実装をテストするとき、私は、コードは次のコードではIllegalArgumentExceptionをスローされ、エラーになっています:IllegalArgumentException Xamarinフォームアプリケーションで連絡先にアクセスする

var uri = ContactsContract.Contacts.ContentUri; 
string[] projection = { ContactsContract.Contacts.InterfaceConsts.Id, 
    ContactsContract.CommonDataKinds.StructuredName.GivenName, 
    ContactsContract.CommonDataKinds.StructuredName.FamilyName, 
    ContactsContract.CommonDataKinds.Phone.Number, 
    ContactsContract.CommonDataKinds.Email.Address}; 
var phoneLoader = new CursorLoader(Android.App.Application.Context, uri, projection, null, null, null); 
var cursor = (Android.Database.ICursor)phoneLoader.LoadInBackground(); 

私も経由してカーソルを取得しようとしました:

var cursor = Forms.Context.ApplicationContext.ContentResolver.Query(uri, projection, null, null, null); 

私も次のことを試してみた:

var phoneLoader = new CursorLoader(Android.App.Application.Context); 
      phoneLoader.SetProjection(projection); 
      phoneLoader.Uri = ContactsContract.Contacts.ContentUri; 
      var cursor = (Android.Database.ICursor)phoneLoader.LoadInBackground(); 

が、それは正確に同じエラーがスローされます:

09-09 14:27:22.163 I/MonoDroid(10022): UNHANDLED EXCEPTION: 
09-09 14:27:22.222 I/MonoDroid(10022): Java.Lang.IllegalArgumentException: Invalid column data2 
09-09 14:27:22.223 I/MonoDroid(10022): at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
09-09 14:27:22.223 I/MonoDroid(10022): at Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method) [0x00068] in <6cd960837cc24c26bab2a0a29b597627>:0 
09-09 14:27:22.223 I/MonoDroid(10022): at Android.Runtime.JNIEnv.CallObjectMethod (System.IntPtr jobject, System.IntPtr jmethod) [0x0000e] in <06064416b46d4ffbb3484c957929a39f>:0 
09-09 14:27:22.223 I/MonoDroid(10022): at Android.Content.CursorLoader.LoadInBackground() [0x00043] in <06064416b46d4ffbb3484c957929a39f>:0 

そして、その次の行に:

cursor = (Android.Database.ICursor)phoneLoader.LoadInBackground(); 

誰もがエラーの原因となっている上記のコードで間違っているものを見ることができますか?

答えて

1

java.Lang.IllegalArgumentException: Invalid column data2

使用するように変更してみてください表示されている「無効な列」エラーが表示されます。

投影すると、ContactsContract.CommonDataKindsは照会しているContactsテーブルの一部ではありません。ここで

access the users Contacts in a Xamarin Forms app

は、ユーザーの連絡先にアクセスするための別の解決策です:

//Get all the names of the contacts and their phone number 
ContentResolver cr = ContentResolver; 
ICursor cur = cr.Query(ContactsContract.Contacts.ContentUri,null, null, null, null); 
if (cur.Count > 0) 
{ 
    while (cur.MoveToNext()) 
    { 
     String id = cur.GetString(cur.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id)); 
     String name = cur.GetString(cur.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.DisplayName)); 

     if (cur.GetInt(cur.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.HasPhoneNumber)) > 0) 
     { 
      ICursor pCur = cr.Query(ContactsContract.CommonDataKinds.Phone.ContentUri, 
      null, 
      ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + " = ?", 
      new String[] { id }, 
      null); 
      while (pCur.MoveToNext()) 
      { 
       String phoneNo = pCur.GetString(pCur.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number)); 
       System.Diagnostics.Debug.WriteLine("Name: " + name + ", Phone No: " + phoneNo); 
      } 
      pCur.Close(); 
     } 
    } 
} 
0

は、URIを使用して、投影マップと呼ばれる事に列を追加していない場合、列は、データベースに存在しないContactsContract.CommonDataKinds.Phone.ContentUri

var uri = ContactsContract.CommonDataKinds.Phone.ContentUri; 
string[] projection = { 
       ContactsContract.Contacts.InterfaceConsts.Id, 
       ContactsContract.CommonDataKinds.StructuredName.GivenName, 
       ContactsContract.CommonDataKinds.StructuredName.FamilyName, 
       ContactsContract.CommonDataKinds.Phone.Number, 
       ContactsContract.CommonDataKinds.Email.Address 
      }; 
var loader = new CursorLoader(Android.App.Application.Context, uri, projection, null, null, null); 
var cursor = loader.LoadInBackground(); 
関連する問題