我可以获取联系方式
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())
{
String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Toast.makeText(getApplicationContext(), name, Toast.LENGTH_LONG).show();
Log.d(name, phoneNumber);
}
我想知道的是我应该在哪里写这段代码?
我已经在MainActivity(onCreate)函数中编写了它,但这导致每次打开应用程序时都会获取联系人,这会使应用程序加载速度变慢。
我只想获取联系方式的安装时间(以便一次性活动),之后我只需要新添加的联系方式,而不是获取整个联系方式。
添加新联系人时,System Broadcaster会向所有拥有" android.permission.READ_CONTACTS"权限的应用程序广播新添加的联系人详细信息。然后我的应用程序中的监听器获取此数据。
我是android的新手,因此无法使用正确的术语。
答案 0 :(得分:1)
你必须使用AsyncTask在单独的线程中运行它,如下所示:
public class ContactLoader extends AsyncTask<Void, Void, Cursor> {
Context context;
public ContactLoader(Context context){
this.context= context;
}
@Override
protected Cursor doInBackground(Void... voids) {
return context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
}
@Override
protected void onPostExecute(Cursor phones) {
while (phones.moveToNext()) {
String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Toast.makeText(context, name, Toast.LENGTH_LONG).show();
Log.d(name, phoneNumber);
}
}}
并在您的活动中使用它
new ContactLoader(getApplicationContext()).execute();