Android 联系人游标加载程序返回空结果

Android 联系人游标加载程序返回空结果,android,settings,contacts,android-permissions,android-cursorloader,Android,Settings,Contacts,Android Permissions,Android Cursorloader,我有一份申请,并得到了许可 <uses-permission android:name="android.permission.READ_CONTACTS" /> eDeviceRecordsLoader: public class eDeviceRecordsLoader implements LoaderCallbacks<Cursor> { public eDeviceRecordsLoader(Context _c

我有一份申请,并得到了许可

    <uses-permission android:name="android.permission.READ_CONTACTS" />
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,
    };
    }
公共类eDeviceRecordsLoader实现LoaderCallbacks
{
公共eDeviceRecordsLoader(上下文_上下文)
{
上下文=_上下文;
}
@凌驾
公共加载器onCreateLoader(int\u id,Bundle\u args)
{
loaderId=_id;
返回新的游标装入器(上下文,
Contacts contract.Contacts.CONTENT\u URI,
投影,
选择,
无效的
无效);
}
@凌驾
public void onLoadFinished(加载器\加载器,游标\数据)
{
如果(_loader.getId()!=loaderId){return;}
if(_data.moveToFirst())
{
eDeviceRecords记录=新的eDeviceRecords();
做
{
String currentContactLookupKey=_data.getString(_data.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
long currentContactId=_data.getLong(_data.getColumnIndex(contactsContacts.Contacts._ID));
记录.put(currentContactId,新的eDeviceRecord(currentContactId,currentContactLookupKey));
}
而(_data.moveToNext());
//另一件作品
}
}
受保护的静态最终字符串选择=“(“+ContactsContract.Contacts.HAS_PHONE_NUMBER+”=1“+”);
受保护的静态最终字符串[]投影=
{
联系人合同联系人。\u ID,
Contacts contract.Contacts.LOOKUP_键,
联系人contract.Contacts.started,
};
}
80%的手机工作正常,并且可以加载联系人。但有些手机具有附加的应用程序安全权限设置(API版本<23),可以锁定联系人和其他权限的应用程序访问(持续或通过pin/密码或需要用户批准)。在清单中授予权限,但应用程序没有访问权限,且游标始终为空


问题:我如何检查此附加权限并提醒用户授予这些权限?

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

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

你可以:

  • Put是应用程序首次启动时的一个启动屏幕,通知用户可能出现的pin限制
  • 制作一个带有可能需要别针警告的烤面包
  • 创建一个用户必须关闭的对话框,以确保用户交互,从而确认

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

    离题:为什么要在
    光标上迭代?为什么不使用
    SimpleCursorAdapter
    ?我会将所有联系人发送到其他处理-选中添加/删除联系人-然后显示您确定
    光标
    为空吗?已尝试
    DatabaseUtils#dumpCursor()
    ?如果没有空的,我没有在此处发布。您是否询问如何在运行时提示用户获得api 23的权限?谢谢您的回答。但在我的例子中,联系人是在应用程序的第一次启动时加载的(没有锁屏或其他东西)。只有一个权限(联系人)被拒绝。我无法以编程方式解决电话簿为空或我没有权限,应向用户显示警报。
        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,
        };
        }