IllegalArgumentException访问Xamarin Forms App

时间:2017-09-09 13:33:07

标签: android xamarin.forms

我正在尝试访问Xamarin Forms应用中的用户联系人。我编写了特定于平台的实现,并使用DependencyService来调用它们,这似乎工作正常。但是,当我测试Android实现时​​,我收到错误,代码在以下代码中抛出IllegalArgumentException:

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

有人能看到导致错误的上述代码有什么问题吗?

2 个答案:

答案 0 :(得分:1)

  

java.Lang.IllegalArgumentException:列数据2无效

该列确实存在于您的数据库中,如果您尚未将该列添加到名为投影地图的内容中,则您将获得&#34;无效列&#34;你看到的错误。

在投影中,setInterval不是您要查询的ContactsContract.CommonDataKinds表的一部分。

  

访问Xamarin Forms应用程序中的用户联系人

以下是访问用户联系人的另一种解决方案:

Contacts

答案 1 :(得分: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();