Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在异步任务中获取电话联系人?_Java_Android_Mobile Development - Fatal编程技术网

Java 如何在异步任务中获取电话联系人?

Java 如何在异步任务中获取电话联系人?,java,android,mobile-development,Java,Android,Mobile Development,我试着联系我发现需要一些时间来等待。所以,我尝试在异步任务中通过将联系人写入app db来实现这一点。以下是我失败的尝试: public class GetUpdateContactsTask extends AsyncTask<Void, Contact, Void> { private static final String TAG = "lifeCycle"; private Context mContext; public GetUpdateContactsTask (C

我试着联系我发现需要一些时间来等待。所以,我尝试在异步任务中通过将联系人写入app db来实现这一点。以下是我失败的尝试:

public class GetUpdateContactsTask extends AsyncTask<Void, Contact, Void> {

private static final String TAG = "lifeCycle";
private Context mContext;

public GetUpdateContactsTask (Context context){
    mContext = context;
}
public interface OnFinishListener{
    void onFinish();
}

public OnFinishListener finishListener;

public void setFinishListener(OnFinishListener finishListener){
    this.finishListener = finishListener;
}

@Override
protected void onPreExecute() {
}


@Override
protected Void doInBackground(Void... params) {
    ContentResolver cr = mContext.getContentResolver();
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if (cur.getCount() > 0) { // here is an NullPointerException error
        while (cur.moveToNext()) {
            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            if (cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);
                while (pCur.moveToNext()) {
                    String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    Contact contact = new Contact();
                    contact.setName(name);
                    contact.setPhoneNumber(phoneNo);
                    publishProgress(contact);
                }
                pCur.close();
            }
        }
    }
    return null;
}

@Override
protected void onProgressUpdate(Contact... values) {
    Contact contact = values[0];
    String name = contact.getName();
    String phoneNumber = contact.getPhoneNumber();
    if (!phoneNumber.equals("not valid")){
        Log.e(TAG, name + ": " + phoneNumber);
        if(!DataHelper.getInstance().isContactIsset(values[0])){
            DataHelper.getInstance().saveContact(values[0]);
            Log.e(TAG, "contact saved");
        } else {
            Log.e(TAG, "contact is isset");
        }
    }
}

@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    finishListener.onFinish();
}
公共类GetUpdateContactsTask扩展异步任务{
私有静态最终字符串标记=“生命周期”;
私有上下文;
公共GetUpdateContactsTask(上下文){
mContext=上下文;
}
公共接口侦听器{
void onFinish();
}
公共侦听器finishListener;
public void setFinishListener(OnFinishListener finishListener){
this.finishListener=finishListener;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的Void doInBackground(Void…参数){
ContentResolver cr=mContext.getContentResolver();
Cursor cur=cr.query(ContactsContract.Contacts.CONTENT_URI,null,null,null);
如果(cur.getCount()>0){//这是一个NullPointerException错误
while(cur.moveToNext()){
字符串id=cur.getString(cur.getColumnIndex(ContactsContract.Contacts._id));
字符串名称=cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_name));
如果(cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_电话号码))>0{
游标pCur=cr.query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,
ContactsContract.CommonDataTypes.Phone.CONTACT_ID+“=?”,新字符串[]{ID},null);
while(pCur.moveToNext()){
String phoneNo=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
触点=新触点();
contact.setName(name);
联系人。设置电话号码(电话号码);
出版进度(联系);
}
pCur.close();
}
}
}
返回null;
}
@凌驾
受保护的void onProgressUpdate(联系人…值){
触点触点=值[0];
字符串名称=contact.getName();
字符串phoneNumber=contact.getPhoneNumber();
如果(!phoneNumber.equals(“无效”)){
Log.e(标签,名称+”:“+电话号码);
如果(!DataHelper.getInstance().IsContactAsset(值[0])){
DataHelper.getInstance().saveContact(值[0]);
Log.e(标记“联系人已保存”);
}否则{
Log.e(标签“联系人已设置”);
}
}
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
finishListener.onFinish();
}
}


这不是工作。游标上存在nullpointerexception错误。如果您帮助更正我的版本,这将是一件好事,但如果您展示更好的解决方案,这将是一件好事。谢谢

您正在从
doInBackground
方法返回
null
,并在
onProgressUpdate
中获得结果,它用于更新进度状态

return contact;
然后在
onPostExecute
方法中获得结果,如下所示

@Override
        protected void onPostExecute(Contact values) {
            super.onPostExecute(values);

          Contact contact = values[0];
          String name = contact.getName();
          ...............
          ...............

        }
有问题的原始海报张贴错误

问题出在联想安全应用程序中。它会阻止对联系人的访问。所以我把我的申请加入白名单,问题就解决了


可能是重复的,我的代码从那里。我试着在异步任务中实现它……只需将框架与
CursorLoader