I am trying to programmatically obtain the user's profile information in an Android application. This works fine on a Pixel phone but doesn't return any results on a Samsung phone. For example:
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)); }
On the Pixel this returns the contact id of the phone's owner. On the Galaxy the cursor is empty. I'm assuming this is because Samsung is using some proprietary version of contacts that is not exposed through the standard Android API. Can anyone confirm? Is there an alternative for Samsung devices?
1 Answers
Answers 1
Yep you will certainly end up with null values in the following cases:
You haven't created the user profile in your contacts session yet.
If you haven't linked your mail account with the profile.
You might end up with SecurityException and to avoid that i have modified the code as per the documentaion
You will surely receive a warning saying cursor finalized without prior close(), it is a best practice to close the cursors if you are not going to use urther.
don't forget to include permissions in manifest child section.
MANIFEST FILE:
<?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>
ACTIVITY CODE:
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. } } }
if you find difficulty in the indentation of my code please go through this google drive link.
0 comments:
Post a Comment