• 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/ 

  • 相关阅读:
    jumperserver3.0的安装部署
    zookeeper3.4.6配置实现自动清理日志
    因为修改linux selinux修改错误产生的问题及解决办法
    修改linux系统编码
    linux如何连接移动硬盘
    调整linux系统时区
    关于公司夫妻档的事情
    hive将数据导致本地磁盘
    shell如何向python传递参数,shell如何接受python的返回值
    关于日志API接口中流量的使用。
  • 原文地址:https://www.cnblogs.com/zhou-guobao/p/5026194.html
Copyright © 2020-2023  润新知