卸载掉模拟器中的联系人,再用eclipse运行源码中的联系人到模拟器时出现异常,我没有修改源码中的代码,就仅仅说去掉了AndroidManifest.xml中的android:sharedUserId="android.uid.shared"这句,和加上了<uses-permission android:name="android.permission.GET_ACCOUNTS" />这句权限,因为不这么改,应用根本就运行不起来,现在的问题是应用能运行了,但是查询不到联系人(数据库中有数据,用友录能读出来),收藏中查询联系人也没错,没有弹出异常对话框,只是log中打印了异常,具体log如下:
04-02 08:26:28.577: ERROR/DatabaseUtils(619): Writing exception to parcel
04-02 08:26:28.577: ERROR/DatabaseUtils(619): java.lang.UnsupportedOperationException: Only CrossProcessCursor cursors are supported across process for now
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     at android.database.CursorToBulkCursorAdaptor.<init>(CursorToBulkCursorAdaptor.java:97)
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     at android.content.ContentProvider$Transport.bulkQuery(ContentProvider.java:155)
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:111)
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     at android.os.Binder.execTransact(Binder.java:288)
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     at dalvik.system.NativeStart.run(Native Method)
04-02 08:26:28.577: ERROR/DatabaseUtils(619): Caused by: java.lang.ClassCastException: com.android.providers.contacts.ContactsProvider2$3
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     at android.database.CursorToBulkCursorAdaptor.<init>(CursorToBulkCursorAdaptor.java:81)
04-02 08:26:28.577: ERROR/DatabaseUtils(619):     ... 4 more
哪位大侠解决过的帮忙一下,万分感谢

解决方案 »

  1.   

    Caused by: java.lang.ClassCastException: com.android.providers.contacts.ContactsProvider2$3
      

  2.   


    大哥我也知道那句,那都写了啊,指向ContactsProvider,可我没改动ContactsProvider,而且关键是这个问题怎么解决啊,不是问的已经log里都写出来了的原因
      

  3.   

    provider将cursor跨进程传递时将会强制向下转换为CrossProcessCursor类型
    如果你的代码写的是 return db.query(...)就可能引起此问题
    试试看
            SQLiteQueryBuilder sqlBuilder = new SQLiteQueryBuilder();
            sqlBuilder.setTables(//表名);
            Cursor cursor = sqlBuilder.query(...);
            return cursor;
      

  4.   

    我在网上也查到说说这个cursor转型的问题,你也是指调用到后台ContactsProvider时出错的吗?我没有更改provider源码,不会源码就有错吧,这跟权限之类的有没有关系呢?
    默认的查询全部联系人调用的是  mQueryHandler.startQuery(QUERY_TOKEN, null, uri, projection, getContactSelection(),null,getSortOrder(projection));
    其中uri通过getUriToQuery()方法得到,推出uri=buildSectionIndexerUri(Contacts.CONTENT_URI);
    我把uri改成uri=Contacts.CONTENT_URI;就可以查询出联系人
    我看2.1的联系人源码时,默认查询全部联系人也就是MODE_DEFAULT时uri就是Contacts.CONTENT_URI
    我改2.1源码联系人时都没出现过这种问题
      

  5.   

    uri=buildSectionIndexerUri(Contacts.CONTENT_URI);
    buildSectionIndexerUri()方法里返回的是uri.buildUpon().appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
    不懂这句的意思,不知道加一个这样到查询参数(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true")的真正意图,不加会怎样。2.1源码时uri直接就是Contacts.CONTENT_URI,谁也在2.2源码上修改过联系人啊
      

  6.   

    问题已解决,不过也谢谢你,要是下载的源码是都有问题,那我就太衰了,有可能是2.2以后版本加强了权限到管理,2.3也有这种问题,以前我做1.5和2.1时没有,现在的解决办法是不能直接从eclipse运行到模拟器,改为在ubuntu下编译,然后将编译好的apk push到/system/app下,这样就没有直接运行到模拟器上那样的问题了
      

  7.   

    我也遇到了类似的问题,uri.buildUpon().appendQueryParameter(ContactCounts.ADDRESS_BOOK_INDEX_EXTRAS, "true").build();
    LZ知道是什么意思么?
      

  8.   

    LZ,我现在遇到和你一样的问题,你既然解决啦。也有经验啦。一起交流下吧 QQ;516124730