Android 安卓:Can';我得不到电子邮件的详细信息

Android 安卓:Can';我得不到电子邮件的详细信息,android,return-value,android-cursoradapter,Android,Return Value,Android Cursoradapter,我创建了一个ContactManager.java,用于显示电话中的所有联系人详细信息,SingleListContact用于显示一个单击的联系人。到现在为止,我可以得到联系人的名字,但没有联系电子邮件,任何大师可以帮我吗 My ContactManager.java /* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, V

我创建了一个ContactManager.java,用于显示电话中的所有联系人详细信息,SingleListContact用于显示一个单击的联系人。到现在为止,我可以得到联系人的名字,但没有联系电子邮件,任何大师可以帮我吗

My ContactManager.java

    /*
     * Copyright (C) 2009 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    package com.example.android.contactmanager;

    import android.app.Activity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.ListView;
    import android.widget.SimpleCursorAdapter;

    public final class ContactManager extends Activity implements OnItemClickListener
    {

        public static final String TAG = "ContactManager";

        private Button mAddAccountButton;
        private ListView mContactList;
        private boolean mShowInvisible;
        //public BooleanObservable ShowInvisible = new BooleanObservable(false);
        private CheckBox mShowInvisibleControl;

        /**
         * Called when the activity is first created. Responsible for initializing the UI.
         */

        @Override
        public void onCreate(Bundle savedInstanceState)
        {


            Log.v(TAG, "Activity State: onCreate()");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.contact_manager);

            // Obtain handles to UI objects
            mAddAccountButton = (Button) findViewById(R.id.addContactButton);
            mContactList = (ListView) findViewById(R.id.contactList);
            mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible);

            // Initialise class properties
            mShowInvisible = false;
            mShowInvisibleControl.setChecked(mShowInvisible);

            // Register handler for UI elements
            mAddAccountButton.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    Log.d(TAG, "mAddAccountButton clicked");
                    launchContactAdder();
                }
            });
            mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
                {
                    Log.d(TAG, "mShowInvisibleControl changed: " + isChecked);
                    mShowInvisible = isChecked;
                    populateContactList();
                }
            });

            mContactList = (ListView) findViewById(R.id.contactList);
            mContactList.setOnItemClickListener(this);

            // Populate the contact list
            populateContactList();
        }

        /**
         * Populate the contact list based on account currently selected in the account spinner.
         */
        private void populateContactList() {
            // Build adapter with contact entries
            Cursor cursor = getContacts();
            String[] fields = new String[] {
                    ContactsContract.Data.DISPLAY_NAME,

            };


            SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor,
                    fields, new int[] {R.id.contactEntryText});
            mContactList.setAdapter(adapter);
        }

        /**
         * Obtains the contact list for the currently selected account.
         *
         * @return A cursor for for accessing the contact list.
         */
        private Cursor getContacts()
        {
            // Run query
            Uri uri = ContactsContract.Contacts.CONTENT_URI;
            //Log.i("Uri ContactsContract.Contacts.CONTENT_URI" + ContactsContract.Contacts.CONTENT_URI, null, null);

            String[] projection = new String[]
                    {
                    ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.DISPLAY_NAME,
                   ContactsContract.CommonDataKinds.Email.DATA,
    //                ContactsContract.CommonDataKinds.StructuredPostal.DATA1
                    //ContactsContract.CommonDataKinds.Phone.DATA
                    };
            String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + (mShowInvisible ? "0" : "1") + "'";
            //String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + (mShowInvisible.get() ? "0" : "1") + "'";
            String[] selectionArgs = null;
            String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

            return this.managedQuery(uri, projection, selection, selectionArgs, sortOrder);
        }


        /**
         * Launches the ContactAdder activity to add a new contact to the selected account.
         */
        protected void launchContactAdder()
        {
            Intent i = new Intent(this, ContactAdder.class);
            startActivity(i);
        }

        public void onItemClick(AdapterView<?> l, View v, int position, long id) {
            Log.i("TAG", "You clicked item " + id + " at position " + position);
            // Here you start the intent to show the contact details
         // selected item
            //String contactDetails = (String)(mContactList.getItemAtPosition(position));
            //Uri contactDetails = ContactsContract.Contacts.CONTENT_URI;

            Cursor cursor = getContacts();

            cursor.moveToPosition(position);
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

    //        Log.i("Address", "Testing" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)));
            // Launching new Activity on selecting single List Item
            Intent i = new Intent(getApplicationContext(), SingleListContact.class);
    //        SingleListContact.PutDetails(ContactsContract.Contacts._ID, name, address, position, null, null);
            SingleListContact.PutDetails(ContactsContract.Contacts._ID, name, email);

            Log.i("Show Contact Clicked: ",  name + "Email: " + cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            // sending data to new activity
            //i.putExtra("Contact Person", contactDetails);
            startActivity(i);

        }



    }
日志:

12-05 05:00:31.289: E/AndroidRuntime(642): FATAL EXCEPTION: main
12-05 05:00:31.289: E/AndroidRuntime(642): java.lang.NullPointerException
12-05 05:00:31.289: E/AndroidRuntime(642):  at com.example.android.contactmanager.ContactManager.onItemClick(ContactManager.java:148)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.widget.AdapterView.performItemClick(AdapterView.java:284)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.widget.ListView.performItemClick(ListView.java:3513)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.os.Handler.handleCallback(Handler.java:587)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.os.Looper.loop(Looper.java:123)
12-05 05:00:31.289: E/AndroidRuntime(642):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-05 05:00:31.289: E/AndroidRuntime(642):  at java.lang.reflect.Method.invokeNative(Native Method)
12-05 05:00:31.289: E/AndroidRuntime(642):  at java.lang.reflect.Method.invoke(Method.java:507)
12-05 05:00:31.289: E/AndroidRuntime(642):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-05 05:00:31.289: E/AndroidRuntime(642):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-05 05:00:31.289: E/AndroidRuntime(642):  at dalvik.system.NativeStart.main(Native Method)

您无法从游标检索电子邮件id,因为当前您没有从contentprovider查询电子邮件列,所以请将代码更改为:

private Cursor getContacts()
{
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;

    String[] projection = new String[]
            {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.Email.DATA //<< query email data here

            };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP 
                + " = '" + (mShowInvisible ? "0" : "1") + "'";

    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
                                     + " COLLATE LOCALIZED ASC";

    return this.managedQuery(uri, projection, 
                      selection, selectionArgs, sortOrder);
}
private Cursor getContacts()
{
//运行查询
Uri=Contacts contract.Contacts.CONTENT\u Uri;
字符串[]投影=新字符串[]
{
联系人合同联系人。\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,

Contacts contract.Contacts.Email.DATA/您无法从游标检索电子邮件id,因为当前您没有从contentprovider查询电子邮件列,所以将代码更改为:

private Cursor getContacts()
{
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;

    String[] projection = new String[]
            {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.Email.DATA //<< query email data here

            };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP 
                + " = '" + (mShowInvisible ? "0" : "1") + "'";

    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME 
                                     + " COLLATE LOCALIZED ASC";

    return this.managedQuery(uri, projection, 
                      selection, selectionArgs, sortOrder);
}
private Cursor getContacts()
{
//运行查询
Uri=Contacts contract.Contacts.CONTENT\u Uri;
字符串[]投影=新字符串[]
{
联系人合同联系人。\u ID,
Contacts contract.Contacts.DISPLAY\u NAME,

Contacts contract.Contacts.Email.DATA//你的意思是:Contacts contract.commondatatypes.Email.DATA吗?@SeanTan:是的,直到游标中不存在Email列,才可能获取它。这就是我发现奇怪的地方,在添加Contacts contract.commondatatypes.Email.DATA之后,它仍然存在crash@SeanTan:好的,发布新日志,我看到您添加了r方法检索电子邮件。只需注释emailid方法并重试it@SeanTan:我想你们并没有理解我的意思。问题很清楚,若游标中不存在列,那个么我们如何获取该列的值。所以我们首先需要从ContentProvider到游标查询电子邮件列,然后从游标检索它。你们的意思是:contacts contract.CommonDataKinds.Email.DATA?@SeanTan:是的,直到Cursor中不存在Email列,才可能获取它。在添加Contacts contract.CommonDataKinds.Email.DATA之后,我发现它仍然很奇怪crash@SeanTan:好的,发布新日志,我看到您添加了另一种检索电子邮件的方法。请评论emailid方法,然后重试it@SeanTan:我想你们并没有理解我。问题很清楚,若游标中不存在一列,那个么我们如何获取该列的值。所以我们首先需要从ContentProvider到游标查询电子邮件列,然后从游标检索它