Android如何导出VCard

记录一下最近的东西,但是有一点,Android导出来的VCard只能是V2.1的不能与V3.0的互相导入。

这里记录一段代码。

获取联系人,提取lookupKey

	public static List<PhoneContact> getPhoneContact(Context context) {
        List<PhoneContact> list = new ArrayList<PhoneContact>();
        ContentResolver resolver = context.getContentResolver();
        Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI,
                null, null,
                null, null);
        if (cursor == null || !cursor.moveToFirst()) {
        	if (cursor != null) {
                cursor.close();
            }
            return list;
        }
        while (!cursor.isAfterLast()) {
            PhoneContact contact = new PhoneContact();
            contact._id = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
            contact.lookupKey = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.LOOKUP_KEY));
            contact.displayName = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME));
            int phoneCount = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
            if (phoneCount > 0) {
                list.add(contact);
            }
            cursor.moveToNext();
        }
        if (cursor != null) {
            cursor.close();
        }
        return list;
    }

从lookupKey获取VCard

    public static String getVCard(Context context, String lookupKey) {
        String vCard = "";
        Uri uri = Uri.withAppendedPath(
                ContactsContract.Contacts.CONTENT_VCARD_URI,
                lookupKey);
        AssetFileDescriptor fd;
        try {
            fd = context.getContentResolver()
                    .openAssetFileDescriptor(uri, "r");
            FileInputStream fis = fd.createInputStream();
            byte[] b = new byte[(int) fd.getDeclaredLength()];
            fis.read(b);
            vCard = new String(b);
            Log.i("GuoQi", vCard);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return vCard;
    }
最后是导入通讯录

public static void importContactByVCard(Context context,String filePath){
        Uri uri = Uri.parse("file://"+filePath);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(uri, "text/x-vcard");
        //android系统版本不同,所以系统中的activity也会不同。
        try{
            intent.setComponent(
                    new ComponentName("com.android.contacts","com.android.contacts.vcard.ImportVCardActivity"));
            context.startActivity(intent);
        }catch(Exception e){
            try{
                intent.setComponent(
                        new ComponentName("com.android.contacts","com.android.contacts.ImportVCardActivity"));
                context.startActivity(intent);
            }catch(Exception e1){
                try{
                    intent.setComponent(
                            new ComponentName("com.android.contacts","com.android.contacts.common.vcard.ImportVCardActivity"));
                    context.startActivity(intent);
                }catch(Exception e2){
                    intent.setComponent(null);
                    context.startActivity(intent);
                }

            }
        }
    }

<think>好的,我现在需要回答用户关于Python中缺失值表示方式的问题。用户提到想知道关键字和方法,包括None和pandas的NaN等。首先,我得回忆一下Python中的缺失值处理,特别是不同库之间的差异。 首先,Python内置的None,这是最常见的空值表示。它是一个单例对象,用于表示没有值。然后,在NumPy和Pandas中,NaN(Not a Number)被用来表示缺失的数值数据。NaN属于浮点数类型,所以当数组中有NaN时,整个数组会被提升为float类型。这点需要解释清楚。 接下来,用户提到pandas的NaN,我记得Pandas主要使用NaN,但后来引入了pd.NA,特别是在处理可空数据类型时,比如Integer和Boolean类型。pd.NA的行为可能与NaN略有不同,尤其是在某些操作中,比如逻辑运算。不过,检测这些缺失值的方法,比如pd.isna(),可以统一处理None、NaN和pd.NA,这点需要强调。 还有,用户可能容易混淆不同库中的表示方式,比如None是Python自带的,而NaN来自NumPy。Pandas的缺失值处理基于NumPy,但也扩展了自己的类型,比如pd.NA。需要将这些层次分清楚。 然后,根据提供的引用,用户给出的引用中提到了不同情况下的缺失值,比如在列表中的None、np.nan和pd.NA。同时,检测这些值的方法,如pd.isna(),可以统一检测。填充方法如fillna(),这也是需要提到的。 需要注意的是,用户可能想知道具体怎么使用这些缺失值,以及在什么情况下选择哪种表示方式。例如,在Pandas中处理数值数据时用NaN,而在处理对象类型时可能用None,但实际情况可能更复杂,因为Pandas会自动转换某些类型。 可能还需要提到其他形式的缺失值,比如空字符串'',但严格来说这不是标准的缺失值表示,但在数据清洗时可能会遇到。不过根据引用,用户提到的包括['nan', '', 'None', None, np.nan],所以需要说明这些的不同,但指出在Pandas中通常用NaN/NaT等。 最后,总结一下Python中的主要缺失值表示方式:None、NaN(NumPy/Pandas)、pd.NA,以及它们的检测方法和处理方式。确保覆盖到各个点,并引用提供的资料来支持回答。</think>### Python中缺失值的表示方式 在Python中,缺失值的表示方式根据使用场景和库的不同有所差异,主要分为以下几种: --- #### 1. **Python原生:`None`** - **类型与特性** `None`是Python内置的单例对象,表示“无”或“空值”,属于`NoneType`类型。它适用于所有数据类型,但**无法直接用于数值计算**(如加减乘除会报错)。 - **示例** ```python a = None print(type(a)) # <class 'NoneType'> ``` --- #### 2. **NumPy/Pandas:`NaN`** - **类型与特性** `NaN`(Not a Number)来自NumPy库,表示**浮点数类型的缺失值**。在Pandas中,`NaN`是默认的缺失值表示方式,会强制将包含`NaN`的列转换为浮点型[^2]。 - **语法变体** `NaN`、`NAN`、`nan`三者等价,均表示缺失值。 - **示例** ```python import numpy as np import pandas as pd arr = np.array([1, np.nan, 3]) print(arr.dtype) # float64 ``` --- #### 3. **Pandas扩展:`pd.NA`** - **类型与特性** `pd.NA`是Pandas 1.0引入的缺失值标识,专门用于**可空数据类型**(如`Int64`、`boolean`)。与`NaN`不同,`pd.NA`在逻辑运算中会传播缺失状态(类似SQL的NULL)[^3]。 - **示例** ```python s = pd.Series([1, pd.NA, 3], dtype="Int64") print(s + 1) # 输出:2, <NA>, 4 ``` --- #### 4. **其他表示形式** - **字符串空值** 空字符串`''`常用于文本数据,但需手动处理。 - **时间缺失值** 在Pandas中,时间类型的缺失值用`NaT`(Not a Time)表示。 --- ### 检测与处理方法 1. **检测缺失值** 使用`pd.isna()`或`pd.isnull()`统一检测所有类型的缺失值(包括`None`、`NaN`、`pd.NA`): ```python values = [2, 'H', None, np.nan, pd.NA] print([pd.isna(x) for x in values]) # [False, False, True, True, True] ``` 2. **填充缺失值** 使用`fillna()`方法填充: ```python df = pd.DataFrame({'A': [1, np.nan, 3]}) df.fillna(0) # 用0填充 ``` 3. **删除缺失值** 使用`dropna()`删除包含缺失值的行/列: ```python df.dropna() ``` --- ### 核心区别总结 | 类型 | 适用场景 | 数据类型 | 特点 | |---------|--------------------|--------------|-------------------------------| | `None` | 通用空值 | NoneType | 不参与数值运算 | | `NaN` | 数值型数据缺失 | float | 强制列转为浮点型 | | `pd.NA` | 可空数据类型 | Int64, bool | 支持类型化缺失值,传播逻辑运算 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值