我有代码来阅读联系方式和阅读生日.但是,如何按即将到来的生日顺序获取联系人列表?
对于标识的单个联系人id,我会得到如下详细信息和生日:
Cursor c = null;
try {
Uri uri = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, id);
c = ctx.getContentResolver().query(uri, null, null, null, null);
if (c != null) {
if (c.moveToFirst()) {
DatabaseUtils.cursorRowToContentValues(c, data);
}
}
c.close();
// read birthday
c = ctx.getContentResolver()
.query(
Data.CONTENT_URI,
new String[] { Event.DATA },
Data.CONTACT_ID + "=" + id + " AND "
+ Data.MIMETYPE + "= '"
+ Event.CONTENT_ITEM_TYPE + "' AND "
+ Event.TYPE + "=" + Event.TYPE_BIRTHDAY,
null, Data.DISPLAY_NAME);
if (c != …Run Code Online (Sandbox Code Playgroud) 我可以从收件箱中读取消息: -
Uri uriSMSURI = Uri.parse("content://sms/inbox");
Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null);
Run Code Online (Sandbox Code Playgroud)
我从这里访问日期: -
date = cur.getString(cur.getColumnIndexOrThrow("date"));
Run Code Online (Sandbox Code Playgroud)
但现在问题是它从收件箱中提供当前时间而不是消息时间.对不起编辑错误,任何想法将不胜感激.提前致谢!
我是andriod domain的新手,正处于学习阶段.我收到了几个问题:
我们每个应用程序都有单个ContentResolver对象吗?它是单身对象吗?谁管理这个对象生命周期?如果它是单例,它如何处理查询ContentProvider的多个请求?
据我所知,在SyncService中定义的一个SyncAdapter仅限于接收一个要处理的ContentProvider权限.
但是,与此同时,它可以访问ContentResolver,它允许在其他ContentProviders上运行查询.如果需要开发人员为SyncAdapter提供单一内容权限,我无法理解这个特定的设计概念,尽管如此,她仍然能够在她有权访问的任何ContentProvider上做任何她想做的事情.我的问题是:忽略onPerformSync的参数有什么后果:字符串权限和ContentProviderClient提供程序以及纯ContentResolver?
我的应用程序(实际上是它的SyncService)的想法很简单:查询日历服务器(在我的情况下为OwnCloud)不仅可以获取事件(与com.android.calendar同步),还可以获取VTODOS,然后可以在各种任务管理应用程序之间分配,我可以获取源代码和/或ContentProviderContract.我还想到了我自己的"Hub"ContentProvider,它具有基本的VTODO/Task结构,并且是与服务器相比唯一的一个.它应该能够与任务管理应用程序的不同内容提供程序同步2路,然后它与服务器同步.
我已阅读使用ContentProviderClient和ContentResolver访问内容提供商,我想我理解其中的区别.我现在感到困惑的是为什么Android SDK中有如此强烈的建议在单个SyncAdapter中使用单个ContentProvider但你可以使用ContentResolver来绕过这个限制.
我花了一整天的时间来搞清楚这一点并在此问题上搜索了数百个SO/Google资源(其中一些是多次).我还看到了有关使用一个SyncAdapter来同步多个ContentProviders的问题,但没有一个答案与使用ContentResolver的建议相近.
android android-contentresolver android-contentprovider android-syncadapter
我正在为企业环境制作一个应用程序框架,它涉及来自设备内存的两个或多个应用程序之间的数据共享.这些数据需要存储在设备上,并且只能由少数应用程序访问(可以通过用于安装它们的证书来识别).此外,它需要以安全的方式存储,以便其他第三方应用程序无法访问.哪种方法是实现此功能的最佳方式?
我已经阅读了有关ContentProviders和ContentResolvers的内容,根据我的理解,这只会促进此过程.数据的实际存储更重要.我还研究了Android 的Keychain API,它似乎最接近我需要实现的目标.
有没有办法将ContentProviders和ContentResolvers与Keychain API 集成?这是正确的方法吗?如果没有,实现同样的最佳方法是什么?此外,我还没有找到好的代码示例来完全理解Keychain API的功能.请帮忙!
编辑:
我也看过Keystore API.这内部使用Keychain API并在应用程序之间共享数据,应使用Keychain.虽然我无法找到有关如何使用Keychain API的相同或详细文档或API指南的代码示例.我正在寻找一个与iOS Keychain相当的android .
Android 5中也引入了称为托管配置文件的东西.这是实现我想做的正确方法吗?
android keychain android-contentresolver android-contentprovider android-security
我有一个光标检索应用程序上有街道地址的所有联系人.然后将此光标传递到适配器.到现在为止还挺好.除了我还得到一堆只有州/国家信息的低价值联系人(主要来自Skype).是否有一种简单的方法来修改URI以跳过这些?
public Cursor getDirectoryList (CharSequence constraint) {
String[] selectionArguments = { "%"+constraint.toString()+"%" };
String selection = ContactsContract.CommonDataKinds.StructuredPostal.DISPLAY_NAME + " like ?";
Uri uri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
String sortOrder = ContactsContract.CommonDataKinds.StructuredPostal.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
Cursor cr = getContentResolver().query(uri, null, selection, selectionArguments, sortOrder);
return cr;
}
Run Code Online (Sandbox Code Playgroud) android android-contentresolver street-address simplecursoradapter
赏金奖励 - 奖金将奖励给从填充Telephony.Sms.Inbox.PERSON值到相关Contact仅使用ContractsContact表格的答案.
我正在申请中以标准方式阅读短信:
final String[] projection = {Telephony.Sms.Inbox.BODY,
Telephony.Sms.Inbox.ADDRESS,
Telephony.Sms.Inbox.READ,
Telephony.Sms.Inbox.DATE,
Telephony.Sms.Inbox.PERSON};
final Cursor cursor = ctx.getContentResolver().query(Telephony.Sms.Inbox.CONTENT_URI,
projection, null, null, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);
Run Code Online (Sandbox Code Playgroud)
填充时,从索引返回Telephony.Sms.Inbox.PERSON的id与弃用的id相关,Contacts.People._ID可用于通过以下方式查询更多联系人信息:
final String[] projection = {Contacts.People.DISPLAY_NAME};
final String[] selectionArgs = {contactId};
final Cursor cursor = ctx.getContentResolver().query(Contacts.People.CONTENT_URI,
projection, Contacts.People._ID + " = ?", selectionArgs, null);
Run Code Online (Sandbox Code Playgroud)
为什么相对较新的Telephony API使用弃用表而不是ContactsContract?
Telephony.Sms.Inbox.PERSON文档说明:
类型:INTEGER(对内容中的项目的引用://联系人/人)
我试过(但并不奇怪吗?)在任何ContactsContractid字段中找到id的映射都没有成功,所以我不得不使用弃用的API来解决我需要快速执行的查询.
这样的查询包括搜索特定联系人的消息,我只有这个名字.联系人可能有多个号码,这些号码的格式可能不正确,无法匹配Telephony.Sms.Inbox.ADDRESS条目......
从数字到联系人时,使用和ContactsContract.PhoneLookup的解决方法不是世界末日,但我仍然觉得我必须在这里遗漏一些东西 …
我有一个应用程序,用户可以通过选择一个文件或将选定目录中的所有文件添加到ListView. 添加单个文件时,一切都很好,但是对于目录,我得到了Unsupported Uri. 问题与权限无关:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dibo.testapp, PID: 12226
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65579, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/tree/raw:/storage/emulated/0/Download/2006 A Good Year flg=0xc3 }} to activity {com.example.dibo.testapp/com.example.dibo.testapp.MainActivity}: java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2F2006%20A%20Good%20Year
at android.app.ActivityThread.deliverResults(ActivityThread.java:4360)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4402)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:49)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2F2006%20A%20Good%20Year
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
at android.content.ContentResolver.query(ContentResolver.java:802)
at android.content.ContentResolver.query(ContentResolver.java:752)
at …Run Code Online (Sandbox Code Playgroud) 在API级别Q中不推荐使用MediaStore.MediaColumns.DATA常量。
应用程序可能没有文件系统权限来直接访问此路径。应用程序不应尝试直接打开此路径,而应使用ContentResolver#openFileDescriptor(Uri,String)获得访问权限。对于定位到Build.VERSION_CODES.Q或更高版本的应用,此值始终为NULL。
崩溃:找不到 java.lang.IllegalArgumentException 卷 external_primary
从媒体商店查询曲目时,我在某些 Android 10 设备(其中大部分来自小米米 A2 Lite、摩托罗拉、HMD Global Nokia)中遇到此崩溃。
Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
我应该为 Android 10 设备传递不同的 URI 吗?(但是它在大多数设备中都可以正常工作)
堆栈跟踪 :
Caused by java.lang.IllegalArgumentException: Volume external_primary not found
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderProxy.java:423)
at android.content.ContentResolver.query(ContentResolver.java:946)
at android.content.ContentResolver.query(ContentResolver.java:881)
at android.content.ContentResolver.query(ContentResolver.java:837)
at com.example.musicplayer.CursorFactory.getAllSongsCursor(CursorFactory.java:164)
Run Code Online (Sandbox Code Playgroud)
编辑:根据报告的这个问题,怀疑这可能是那些使用 Android 10 操作系统的设备中的 sdcard 问题。
android mediastore android-contentresolver android-sdcard android-10.0