Android NFC传输联系人VCF
2015-12-07 15:19
459 查看
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 开发、测试工具资源汇总
- 动态引用APK文件
- Android官方文档翻译 十二 3.Supporting Different Devices
- Android popupwindow 弹出的位置问题
- Android平台下cordova的menubutton事件
- android动画基础
- listview adapter 常用适配器
- android(34)(有序广播、无序广播、中断特定号码广播、监听SD卡状态、横竖屏切换)
- 【Android游戏开发之一】搭建开发环境以HelloWorld例程
- 解决Android5.0及以上启动Service时,java.lang.IllegalArgumentException: Service Intent must be explicit
- 美团Android资源混淆保护实践
- android实现多线程下载
- 一个牛逼哄哄的Android框架One,秒杀最火的Xutils
- Android使用Handler造成内存泄露的分析及解决方法
- 使用天天模拟器开发Android应用
- Android中SharedPreferences的总结
- Android 属性动画(Property Animation)
- Android SDK 在线更新镜像服务器资源
- android(33)(IP拨号器)
- datetimepicker一个不错的日历android特效