zoukankan      html  css  js  c++  java
  • Android NFC传输联系人VCF

    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/ 

  • 相关阅读:
    Quartz.net任务调度
    基于Task定时检测网络本地网络状况
    java基于NIO的分散读取文件,然后统一聚合后写入文件
    基于直接缓冲区和非直接缓冲区的javaIO文件操作
    java 读取xml
    WPF 通过线程使用ProcessBar
    NPOI自适应列宽
    C#序列化与反序列化以及深拷贝浅拷贝
    Springboot feign 传递request信息
    apereo cas 小记01--服务器搭建01
  • 原文地址:https://www.cnblogs.com/zhou-guobao/p/5026194.html
Copyright © 2011-2022 走看看