contentResolver.query()适用于模拟器,但不适用于实际设备

时间:2017-07-21 12:48:05

标签: android android-contacts android-contentresolver

我的应用程序“调用”设备的应用程序,允许用户插入新的联系人。 联系人保存在设备上后,我想“查询”该联系人的Uri。

我的代码适用于模拟器(Android 4,5,6,7)但不适用于我的华为P8,我无法理解为什么。

首先,我在活动和Manifest.xml中请求权限:

ActivityCompat.requestPermissions(this, new String [] {Manifest.permission.WRITE_CONTACTS, 
                                                       Manifest.permission.READ_CONTACTS}, 
                                 101);

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />

这是我的应用的代码

1)我“呼叫”设备管理联系人的应用程序

Intent intent = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
intent.putExtra("finishActivityOnSaveCompleted", true); 
startActivityForResult(intent, ADD_FRIEND_CODE);

2)保存新联系人后,我的应用程序返回到前台并调用onActivityResult()方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  switch (requestCode){
          case ADD_FRIEND_CODE:
          if(resultCode == RESULT_OK){               
                /*I get the URI of the contact. This works both
                on emulator and real device*/
                Uri lastContactUri = data.getData();      

                ContentResolver contentResolver = getContentResolver();
                Cursor cursor =  contentResolver.query(lastContactUri, null, null, null, null);    

                /*On emulator the cursor is full, on real device is empty*/                  
                if (cursor.moveToFirst()) {                    
                    cursor.moveToPrevious();
                    while (cursor.moveToNext()) {                        
                        String name = "";
                        if (cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME) > -1) {
                            name  = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        }
                    Toast.makeText(this, name , Toast.LENGTH_SHORT).show();
                    }
                } 
                cursor.close();                   
                break;
        }
    }

有没有人理解为什么我的代码可以在许多模拟器上运行,而不是在我的真实设备上运行。

0 个答案:

没有答案