【问题标题】:Action_INSERT always returns result code 0 (ZERO) on Droid-XAction_INSERT 在 Droid-X 上总是返回结果代码 0(零)
【发布时间】:2011-07-22 13:45:41
【问题描述】:

我的代码如下

权限

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

而调用者Activity代码是

Intent addNewContact = new Intent(Intent.ACTION_INSERT);
addNewContact.setType(ContactsContract.Contacts.CONTENT_TYPE);  
startActivityForResult(addNewContact, ADD_NEW_CONTACT); // ADD_NEW_CONTACT = 2 for my specific purpose

而调用者Activity的onActivityResult为

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        Log.i("OnActivityResult Test ", "Request code  : " + requestCode
                + "   " + " ResultCode   : " + resultCode);
        switch(requestCode) {           

            case 2: 
                  if (resultCode == Activity.RESULT_OK) {
                // code to Update my list view
                  }

        }
    }

我的列表视图在模拟器和设备(我检查过三星 galuxy)上也得到了更新,而不是 Droid-X,所以如果我使用的是 Droid-X,结果不会反映在列表中。

当我阅读 Droid-X 的 Log cat msg 时,我看到 resultCode 始终为 0(零),即使我正在添加新联系人。

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以扩展调用者Activity 并在finishes 时显式调用setResult,也许?

    【讨论】:

    • @Sagar Hatekar 我无法以这种方式满足我的需求。你能解释一下吗?
    【解决方案2】:

    我知道 Droid-X motoblur 的问题在于(根据 moto 的网站)模糊联系人 API 基于 Android 1.x 中的旧联系人 API,而不是新的 2.x ContactsContract API。 HTC 也可能这样做。

    参考:

    1. Created contacts not showing up on HTC Evo

    2. New contacts created using ContactsContract do not appear in Contacts app

    在您的情况下,当您添加新联系人时,您没有得到结果代码为 -1。所以更好的方法不要在 onActivityResult 中执行任何任务(如果您在添加联系人时执行)。扩展ContentObserver 类,该类将接收内容更改的回调,然后您就可以完成您的任务了。

    参考: 1.How to implement an Android ContentObserver

    这是一个示例

    public class Test extends Activity {
    
        private NewContentObserver contentObserver = null;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout._layout);  
    
            //do another task
    
            //Adding listener when new contact will be added in device. 
            contentObserver = new NewContentObserver();
            this.getApplicationContext().getContentResolver().registerContentObserver (ContactsContract.Contacts.CONTENT_URI, true, contentObserver);        
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // unregister the provider 
    
            this.getApplicationContext().getContentResolver().unregisterContentObserver(contentObserver);
        }
    
    //Get newest contact
        private Uri getNewestContactUri() { 
            String[] projection = new String[] {ContactsContract.Contacts._ID}; 
            String orderBy = ContactsContract.Contacts._ID + " DESC"; 
            Cursor cursor = TagsActivity.this.getContentResolver().query( 
                    ContactsContract.Contacts.CONTENT_URI, projection, null, null, orderBy); 
            int idIdx = -1; 
            try { 
                    idIdx = cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID); 
            } catch (Exception e) { 
                    e.printStackTrace(); 
                    idIdx = -1; 
            } 
            if (idIdx != -1) { 
                    int id = -1; 
                    if (cursor.moveToFirst()) { 
                            id = cursor.getInt(idIdx); 
                    } 
                    if (id != -1) { 
                            return Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, 
                                            Integer.toString(id)); 
                    } 
            } 
            return null; 
        } 
    
        private class NewContentObserver extends ContentObserver {
    
            public NewContentObserver() {
                super(null);
            }
    
            @Override
            public void onChange(boolean selfChange) {
                super.onChange(selfChange);
    
                Uri contactData = getNewestContactUri();
            Cursor cursor = managedQuery(contactData, null, null, null, null);
            if (cursor.moveToFirst()) {
            long newId = cursor.getLong(cursor.getColumnIndexOrThrow(Contacts._ID));
            String newDisplayName = cursor.getString(cursor.getColumnIndexOrThrow(Contacts.DISPLAY_NAME));
            Log.i("Test", "New contact Added.  ID of newly added contact is : " + newId + " Name is : " + newDisplayName);
            runOnUiThread(addNewContactToList);
            }
            }
    
            @Override
            public boolean deliverSelfNotifications() {
                return true;
            }
        }
    
       //Since we cant update our UI from a thread this Runnable takes care of that! 
        private Runnable addNewContactToList = new Runnable() {
            public void run() {
                //add logic to update your list view
            }
        };
    }
    

    希望这会有所帮助。

    更新Contacts 2.x API 适用于运行 Gingerbread (Android 2.3) 或更高版本的 MOTOBLUR 手机。我的 Droid X 正在运行 Moto 的新 Gingerbread,我很高兴它现在可以运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多