是的,在以下情况下你肯定会得到空值:
您尚未在您的
联系人会话尚未。
如果您尚未将您的邮件帐户与
个人资料。
您最终可能会得到SecurityException 并避免我按照documentaion 修改了代码
你肯定会收到警告说cursor finalized without prior close(),如果你不打算使用urther,最好关闭游标。
不要忘记在清单子部分中包含权限。
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com
/apk/res/android"
package="com.example.ganesh.contacts">
<uses-permission
android:name="android.permission.READ_CONTACTS"
/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>
活动代码:
public class MainActivity extends
AppCompatActivity implements
View.OnClickListener {
String contactId = null;
Button button;
TextView textView;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=findViewById(R.id.button);
textView=findViewById(R.id.textView);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
onReadContacts();
}
private void onReadContacts() {
// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// Should we show an explanation?
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_CONTACTS)) {
// Show an explanation to the user *asynchronously* -- don't block
// this thread waiting for the user's response! After the user
// sees the explanation, try again to request the permission.
} else {
// No explanation needed; request the permission
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_CONTACTS},
101);
// 101 is an
// app-defined int constant. The callback method gets the
// result of the request.
}
} else {
// Permission has already been granted
Cursor c = getApplication().getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null);
c.moveToFirst();
textView.setText(c.getString(c.getColumnIndex("display_name")));
Cursor cursorID = getContentResolver().query(ContactsContract.Profile.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactId = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
Toast.makeText(this,contactId,Toast.LENGTH_LONG).show();
}
c.close();
cursorID.close();
}
}
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 101
: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Cursor c = getApplication().getContentResolver().query(ContactsContract.Profile.CONTENT_URI, null, null, null, null);
c.moveToFirst();
textView.setText(c.getString(c.getColumnIndex("display_name")));
Cursor cursorID = getContentResolver().query(ContactsContract.Profile.CONTENT_URI,
new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactId = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
Toast.makeText(this,contactId,Toast.LENGTH_LONG).show();
}
c.close();
cursorID.close();
// permission was granted, yay! Do the
// contacts-related task you need to do.
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
// other 'case' lines to check for other
// permissions this app might request.
}
}
}
如果您发现我的代码缩进有困难
请通过这个谷歌驱动器link。