Tag: android contentresolver

ContentProvider insert()总是在UI线程上运行?

我有一个应用程序需要从服务器提取数据,并将其插入SQLite数据库以响应用户input。 我认为这将是非常简单的 – 从服务器获取数据的代码是AsyncTask的一个相当简单的子类,它的工作原理与我预期的一样,不需要挂接UI线程。 我用一个简单的接口为它实现了callback函数,并将其封装在一个静态类中,所以我的代码如下所示: MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() { @Override public void onFolderContentsResponse(final List<FilesystemEntry> contents) { // do something with contents } } 一切还好。 即使服务器需要一个小时来检索数据,但UI仍然运行平稳,因为getFolderContents中的代码正在AsyncTask的doInBackground方法中运行(与UI分离)。 在getFolderContents方法的最后,调用onFolderContentsResponse并传递从服务器接收到的FilesystemEntry列表。 我只是说这一切,所以希望清楚,我的问题不在getFolderContents方法或任何我的networking代码,因为它不会发生在那里。 当我尝试通过onFolderContentsResponse方法内的ContentProvider的子类插入到数据库时出现问题; 用户界面总是挂起,而代码执行,导致我相信,尽pipe从AsyncTask的doInBackground方法调用,插入仍然在UI线程上运行。 以下是有问题的代码: MyServerCaller.getFolderContents(folderId, new OnFolderContentsResponseListener() { @Override public void onFolderContentsResponse(final List<FilesystemEntry> contents) { insertContentsIntoDB(contents); } } 和insertContentsIntoDB方法: void insertContentsIntoDB(final List<FilesystemEntry> contents) { for (FilesystemEntry entry : contents) […]

使用ContentProviderClient与ContentResolver来访问内容提供者

Android内容提供者的文档描述了使用从getContentResolver()获得的ContentResolver来访问内容。 但是也有一个ContentProviderClient ,它可以从getContentResolver().acquireContentProviderClient(authority) 。 似乎在ContentResolver提供了或多或less相同的方法来访问提供者的内容。 什么时候应该使用ContentProviderClient而不是直接使用ContentResolver ? 有什么好处?

使用applyBatch插入数以千计的联系人条目很慢

我正在开发一个应用程序,我需要插入大量的联系人条目。 目前约有600个联系人,共有6000个电话号码。 最大的联系人有1800个电话号码。 截至今天的状态是,我创build了一个自定义帐户来保存联系人,因此用户可以select在联系人视图中查看联系人。 但是联系人的插入是非常缓慢的。 我使用ContentResolver.applyBatch插入联系人。 我已经尝试了不同大小的ContentProviderOperation列表(100,200,400),但总的运行时间大约是。 一样。 插入所有的联系人和号码大约需要30分钟! 我发现在SQlite中缓慢插入的大多数问题都会导致事务处理。 但是因为我使用ContentResolver.applyBatch方法,所以我不能控制这个,而且我会假设ContentResolver为我处理事务pipe理。 所以,对于我的问题:我做错了什么,或者我能做些什么来加速? 安德斯 编辑: @jcwenger:哦,我明白了。 很好的解释! 那么我将不得不先插入到raw_contacts表中,然后插入名字和数字的数据表。 我将失去的是在applyBatch中使用的raw_id的反向引用。 所以我将不得不把新插入的raw_contacts行的所有id用作数据表中的外键?

列出Android中的所有相机图像

如何获得Android设备的所有相机图像列表? 它是否通过MediaStore? 怎么样?

将内容:// URI转换为Android 4.4中的实际path

我尝试了一个解决scheme(见下文),除了在Android 4.4中对startActivityForResult()的调用会产生一个标题为“Open from”的活动,其中包含“Recent”,“Images”,“Downloads”以及多个应用程序从中挑选。 当我select“Images”并尝试parsing返回的内容URI(使用下面的代码)时,对cursor.getString()的调用返回null。 如果我使用Gallery应用程序select完全相同的文件, cursor.getString()将返回一个文件path。 我只testing了API级别16和19.一切都如预期在16年。至19,去,我不得不select图库或其他应用程序或它不工作。 private String getRealPathFromURI(Context context, Uri contentUri) { Cursor cursor = null; try { String[] proj = { MediaStore.Images.Media.DATA }; cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(column_index); return path; } finally { if (cursor != null) { cursor.close(); } } […]

Android获取所有联系人列表(姓名,电子邮件,电话)大约需要一分钟约700个联系人

有什么办法可以缩短这个时间吗? 我正在用光标运行,并采取名称,电话号码和电子邮件 如果我从查询循环中删除电话号码查询,它会在3秒内结束 任何想法我怎么能改善这个查询? 也许我在查询中做错了什么? (很明显,我正在做asynchronous,但仍然…用户不能等待很长时间) 希望有人可以分享他的想法 这是我的代码 ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { AddressBookEntity adr = new AddressBookEntity(); String id = cur.getString(cur .getColumnIndex(ContactsContract.Contacts._ID)); String name = cur .getString(cur .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); adr.fullName = name; Cursor emailCur = cr .query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + […]

Android 4.4(KitKat)上的Android图库为Intent.ACTION_GET_CONTENT返回不同的URI

在KitKat之前(或在新的图库之前), Intent.ACTION_GET_CONTENT返回一个这样的URI 内容://媒体/外部/图像/媒体/ 3951。 使用ContentResolver并为MediaStore.Images.Media.DATA返回文件的URL。 在KitKat中,Gallery会返回一个URI(通过“Last”),如下所示: 内容://com.android.providers.media.documents/document/image:3951 我该如何处理?