Android:无法获取电子邮件的详细信息

标签 android return-value android-cursoradapter

我创建了一个 ContactManager.java 用于显示来自电话的所有联系人详细信息,而 SingleListContact 用于显示被单击的联系人之一。到目前为止,我能够获得联系人姓名但不能获得联系人电子邮件,有哪位大神可以帮助我吗?

我的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);

        }



    }

还有 SingleListContact.java

package com.example.android.contactmanager;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;

public class SingleListContact extends Activity {

    static int ContactPhone;
    static String ContactID, ContactName, ContactEmail, ContactAddress;
    //@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.single_list_contact_view);

        EditText txtContact = (EditText) findViewById(R.id.editText1);
        txtContact.setText(ContactName);
//        txtContact.setText(ContactEmail);

        Log.e("ContactEmail: " , ContactEmail);

//        EditText txtContact2 = (EditText) findViewById(R.id.editText2);
//        txtContact2.setText(ContactPhone);

        EditText txtContact3 = (EditText) findViewById(R.id.editText3);
        txtContact3.setText(ContactEmail);

// 
//     
//        EditText txtContact4 = (EditText) findViewById(R.id.editText4);
//        txtContact4.setText(ContactAddress);


        ImageView myImg= (ImageView) findViewById(R.id.imageView1);
        myImg.setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View view)
            {
             //Launch Intent or whatever you want here
                 Log.e("GeoTag Button", "Clicked!");
//                                                      
                    double latitude = 13.042206;
                    double longitude = 80.17000;


                    Uri uri = Uri.parse("geo:" + latitude  + "," + longitude +"?z=10");
                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                    startActivity(intent);                       
            }
         });

    }

    static void PutDetails (String id, String name, String email)
    {
        ContactID = id;
        ContactName = name;
        //ContactPhone = phone;
        ContactEmail = email;
//      ContactAddress = address;   
    }



}

日志:

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)

最佳答案

您无法从 Cursor 检索电子邮件 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);
}

现在您可以在 ListView 的 onItemClick 方法中获取电子邮件 ID

关于Android:无法获取电子邮件的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14035485/

相关文章:

c# - 调用带返回值的存储过程

android - 从 CursorAdapter 事件调用 ListFragment 中的自定义监听器

android - 在 sqlite 数据库更改时自动刷新 ListView - Android 聊天应用程序

java - Android AudioRecord 强制另一个流到 MIC 音频源

java - (Android 应用程序)尝试将 AlertDialog .setIcon() 设置为从 URL 下载的图像

android - GridView.setItemChecked(位置, 值)

android - 非法状态异常 : database already closed (using ViewPager)

java - 如何从响应中检索数据? - 改造2

java - 如何从线程返回值

python - python 获取函数的返回值并将其更改为 int