import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcEvent;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Profile;
import android.util.Log; import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream; /**
* This class implements sharing the currently displayed
* contact to another device using NFC. NFC sharing is only
* enabled when the activity is in the foreground and resumed.
* When an NFC link is established, {@link #createMessage}
* will be called to create the data to be sent over the link,
* which is a vCard in this case.
*/
public class NfcHandler implements NfcAdapter.CreateNdefMessageCallback { private static final String TAG = "ContactNfcHandler";
private static final String PROFILE_LOOKUP_KEY = "profile";
private final Context mContext;
private final Uri mContactUri; /* Register NFC handler. This should be called in activities' onCreate(), or similar methods */
public static void register(Activity activity, Uri contactUri) {
NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity.getApplicationContext());
if (adapter == null) {
return; // NFC not available on this device
}
adapter.setNdefPushMessageCallback(new NfcHandler(activity, contactUri), activity);
} public NfcHandler(Context context, Uri contactUri) {
mContext = context;
mContactUri = contactUri;
} @Override
public NdefMessage createNdefMessage(NfcEvent event) {
ContentResolver resolver = mContext.getContentResolver();
if (mContactUri != null) {
final String lookupKey = Uri.encode(mContactUri.getPathSegments().get(2));
final Uri shareUri;
// TODO find out where to get this constant from, or find another way
// of determining this.
if (lookupKey.equals(PROFILE_LOOKUP_KEY)) {
shareUri = Profile.CONTENT_VCARD_URI.buildUpon().
appendQueryParameter(Contacts.QUERY_PARAMETER_VCARD_NO_PHOTO, "true").
build();
} else {
shareUri = Contacts.CONTENT_VCARD_URI.buildUpon().
appendPath(lookupKey).
appendQueryParameter(Contacts.QUERY_PARAMETER_VCARD_NO_PHOTO, "true").
build();
}
ByteArrayOutputStream ndefBytes = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int r;
try {
InputStream vcardInputStream = resolver.openInputStream(shareUri);
while ((r = vcardInputStream.read(buffer)) > 0) {
ndefBytes.write(buffer, 0, r);
} NdefRecord record = NdefRecord.createMime("text/x-vcard", ndefBytes.toByteArray());
return new NdefMessage(record);
} catch (IOException e) {
Log.e(TAG, "IOException creating vcard.");
return null;
}
} else {
Log.w(TAG, "No contact URI to share.");
return null;
}
}
}

activity那边调用的代码:

NfcHandler.register(this, mLookupUri);

 上面两段代码,来自Android源码里面的Contacts

  work_space/packages/apps/Contacts/ 

Android NFC传输联系人VCF的更多相关文章

  1. Android NFC标签 开发深度解析 触碰的艺术

    有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式.废话到此为止,下面开始正文. NFC(Near Field Communication,近场通信)是一种数据传输 ...

  2. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

  3. 【转】Android NFC学习笔记

    一:NFC的tag分发系统 如果想让android设备感应到NFC标签,你要保证两点 1:屏幕没有锁住 2:NFC功能已经在设置中打开 当系统检测到一个NFC标签的时候,他会自动去寻找最合适的acti ...

  4. Android NFC开发概述

    NFC手机相比普通手机来说,有以下3个附加功能:  1.可以当成POS机来用,也就是“读取”模式   2.可以当成一张卡来刷,也就是NFC技术最核心的移动支付功能  3.可以像蓝牙.Wi-Fi一样做点 ...

  5. Android NFC开发(二)——Android世界里的NFC所具备的条件以及使用方法

    Android NFC开发(二)--Android世界里的NFC所具备的条件以及使用方法 NFC的应用比较广泛,而且知识面也是比较广的,所以就多啰嗦了几句,我还还是得跟着官方文档:http://dev ...

  6. Android NFC开发(一)——初探NFC,了解当前前沿技术

    Android NFC开发(一)--初探NFC,了解当前前沿技术 官方文档:http://developer.android.com/guide/topics/connectivity/nfc/ind ...

  7. android nfc中Ndef格式的读写

    1. 在onCreate()中获取NfcAdapter对象: NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 2.在onNewI ...

  8. android nfc中MifareClassic格式的读写

    Android支持的数据格式 数据格式的Intent filter AndroidManifest.xml文件中,要像向下列示例那样,在<activity>元素内的<meta-dat ...

  9. android之读取联系人信息

    联系人信息被存放在一个contacts2.db的数据库中 主要的两张表 读取联系人 读取联系人需要知道联系人内容提供者的地址,以及对应的操作对象.一般情况下操作对象是的命名方式和表明是一致的. 布局文 ...

随机推荐

  1. windows 2008 远程端口3389修改小记

    修改远程端口使服务器更加安全,win2008上大致与win2003的配置差不多,有些细微的差别,在此小记一下. 简要步骤: 1.打开远程连接功能(默认都是已经打开的) :开始>计算机>属性 ...

  2. 加特殊符号星号斜杠反斜杠/* \ */ !important等让css实现兼容各个浏览器的技巧的代码

       在编写css样式表的时候常常会碰到一写浏览器兼容的问题,象是不同内核的浏览器显示就不一定相同,不同版本的的浏览器也会产生上下兼容的问题,如何解决这些问题成了我们苦恼的问题,如果你对css hac ...

  3. tasklet和工作队列

    tasklet机制和工作队列 http://blog.chinaunix.net/uid-28236237-id-3450753.html tasklet原理 http://www.kuqin.com ...

  4. STL之vector(向量)

    C++编程语言中有一种叫做Vector的应用方法,它的作用在实际编程中是非常重要的,这里详细介绍一下C++ Vector的相关应用技巧及基本内容: Construct vector #include ...

  5. shell 脚本中$$,$#,$?分别代表什么意思?

    $0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个.$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID号)$! 执行上 ...

  6. Objective-C 程序设计第四版

    1,@class  XYPoint; 写在.h文件里,告诉编译器有这类,然后用的时候,其实是在.m文件引入的. 例如.#import “XYPoint.h”  然后在.m文件里就能用XYPoint.h ...

  7. C和C++安全编码读书笔记1

    (1)type safety Another characteristic of C that is worth mentioning is the lack of type safety. Type ...

  8. 浙江大学PAT上机题解析之2-11. 两个有序链表序列的合并

    已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3. 输入格式说明: 输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列) ...

  9. poj 2833 The Average(堆)

    题目链接:http://poj.org/problem?id=2833 思路分析:由于数据量较大,超出存储范围,使用不能使用数组存储数据在进行排序.考虑维护一个最大堆与最小堆,依次读取数据, 记录数据 ...

  10. Eddy's爱好(dfs+容斥)

    Eddy's爱好 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...