android - 联系人 CursorLoader 返回空结果

标签 android settings contacts android-permissions android-cursorloader

我有具有 list 权限的应用程序

    <uses-permission android:name="android.permission.READ_CONTACTS" />

我的 Activity 尝试加载联系人:

    eDeviceRecordsLoader contactsLoader = new eDeviceRecordsLoader(this);
    loaderActivity.getLoaderManager().initLoader(R.id.ab_control_device_records_loader, null, contactsLoader);

eDeviceRecordsLoader:

    public class eDeviceRecordsLoader implements LoaderCallbacks<Cursor>
    {
            public eDeviceRecordsLoader(Context _context)
            {
                    context = _context;
            }
            @Override
            public Loader<Cursor> onCreateLoader(int _id, Bundle _args)
            {
                    loaderId = _id;
                    return new CursorLoader(context,
                            ContactsContract.Contacts.CONTENT_URI,
                            PROJECTION,
                            SELECTION,
                            null,
                            null);
            }
            @Override
            public void onLoadFinished(Loader<Cursor> _loader, Cursor _data)
            {
                    if(_loader.getId() != loaderId) { return; }
                    if(_data.moveToFirst())
                    {
                            eDeviceRecords records  = new eDeviceRecords();
                            do
                            {
                                    String  currentContactLookupKey = _data.getString(_data.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                                    long    currentContactId        = _data.getLong(_data.getColumnIndex(ContactsContract.Contacts._ID));

                                    records.put(currentContactId, new eDeviceRecord(currentContactId, currentContactLookupKey));
                            }
                            while(_data.moveToNext());
                            //another work
                    }
            }
    protected static final String   SELECTION   = "(" + ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1" + ")"; 
    protected static final String[] PROJECTION  = 
    {
        ContactsContract.Contacts._ID,
        ContactsContract.Contacts.LOOKUP_KEY,
        ContactsContract.Contacts.STARRED,
    };
    }

80% 的手机可以正常工作并加载联系人。但是有些手机有额外的应用程序安全设置权限(版本 API < 23)并且可以锁定应用程序访问权限(持续或通过密码/密码或需要用户批准)联系人和其他权限。 list 中已授予权限,但应用程序无权访问且光标始终为空。

问题:我如何检查这个额外的权限并提醒用户授予他们?

最佳答案

不知道此时设备发生了什么,我建议听取评论的建议并确保代码中没有缺陷,在此之后;您可以放入某种锁屏监听器并像这样处理您的应用程序,因此会显示一条消息,如果您在屏幕锁定时无法发送 toast ,则在锁定时登录并在此之前显示警告,或者您可以在第一次使用该应用程序时或每次启动该应用程序时发出警告(对用户来说很烦人)。

在决定如何提醒用户时,这将取决于您希望这样做的积极程度。

你可以:

  1. Put 是应用程序首次启动时的初始屏幕,通知用户可能会出现的 pin 限制。
  2. 创建一个 toast,并警告可能需要 pin。
  3. 创建一个对话框,用户必须关闭该对话框以确保用户交互,从而获得确认。

恐怕这不是您正在寻找的理想解决方案。

关于android - 联系人 CursorLoader 返回空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34454700/

相关文章:

java - 如何在没有 gcloud 的情况下用 Java 为 Google AutoML Vision API 生成访问 token ?

iphone - 如何强制更新应用程序设置包?

visual-studio-2010 - 将一个项目的 Visual Studio 设置复制到另一个项目

qt - 有效使用 QSettings

ios - requestAccessForEntityType 不提示用户

android - 如何启动 Android 的电子邮件应用程序 (com.android.email)?

Android - Assertj Android - 运行错误

ios - 避免 CNContactPickerViewController 显示电子邮件

android - 如何检测webView中的按键事件?

Android edittext - 选择联系人的电话号码(自动完成)