我正在尝试以编程方式在Android应用程序中获取用户的个人资料信息。在Pixel手机上可以正常工作,但在三星手机上不会返回任何结果。例如:
String contactId = null;
// getting contacts ID
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));
}
在Pixel上,它返回手机所有者的联系人ID。在Galaxy上,光标为空。我认为这是因为三星正在使用某些专有版本的联系人,而该版本未通过标准Android API公开。谁能确认?三星设备有替代品吗?
答案 0 :(得分:1)
是的,在以下情况下,您肯定会得到空值:
您尚未在自己的帐户中创建用户个人资料 联系人会话。
如果您尚未将邮件帐户与 个人资料。
您可能会以SecurityException结尾,并避免我按照documentaion修改了代码
您肯定会收到警告cursor finalized without prior close(),如果您不打算再使用它,那么最好关闭游标。
不要忘记在清单子节中包括权限。
<?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.
}
}
}
如果您难以缩进我的代码 请通过此Google驱动器link。