闪闪
闪闪
  • 发布:2015-01-26 21:47
  • 更新:2015-01-26 21:47
  • 阅读:30037

调用系统通讯录选择手机号 Android插件

分类:5+ SDK

plus.contacts加载全部联系人,只为选择一个联系人时,联系人较多情况下,速度很慢。搞了个插件来调用系统通讯录,只返回选择的一个联系人。

使用:

plus.nativecontact.pick(function(contact){//成功  
           alert(contact.numbers[0].value);//所选择联系人的第一个电话号码  
    }, function(status){//失败  

    });  
//contact为联系人json对象,形式:{"givenName":"张三","numbers":[{"value":"123"},{"value":"456"}]}

添加权限:

"nativecontact":{  
            "description": "系统通讯录"  
        }

plugin.js:

document.addEventListener("plusready",  function()  
{  
    var B = window.plus.bridge;  
    var nativecontact =   
    {  
        "pick":function(successCallback, errorCallback){  
            var success = typeof successCallback !== 'function' ? null : function(args) {  
                        successCallback(args);  
                    },  
                fail = typeof errorCallback !== 'function' ? null : function(code) {  
                        errorCallback(code);  
                    },  
                callbackID = B.callbackId(success, fail);  
            return B.exec("nativecontact", "pick", [callbackID]);  
        }  
    };  
    window.plus.nativecontact = nativecontact;  
}, true);

NativeContact.java:

import android.app.Activity;  
import android.content.Context;  
import android.content.Intent;  
import android.database.Cursor;  
import android.net.Uri;  
import android.provider.ContactsContract;  
import io.dcloud.DHInterface.AbsMgr;  
import io.dcloud.DHInterface.IApp;  
import io.dcloud.DHInterface.IFeature;  
import io.dcloud.DHInterface.ISysEventListener;  
import io.dcloud.DHInterface.ISysEventListener.SysEventType;  
import io.dcloud.DHInterface.IWebview;  
import io.dcloud.util.JSONUtil;  
import io.dcloud.util.JSUtil;  

public class NativeContact implements IFeature{  
    private final static int REQUESTCODE = 1;  

    @Override  
    public void dispose(String arg0) {  
        // TODO Auto-generated method stub  

    }  

    @Override  
    public String execute(final IWebview pWebview, final String action, final String[] pArgs) {  
        if("pick".equals(action))  
        {  
            final IApp _app = pWebview.obtainFrameView().obtainApp();  
            final String callBackId = pArgs[0];  
            _app.registerSysEventListener(new ISysEventListener(){  
                @Override  
                public boolean onExecute(SysEventType pEventType, Object pArgs) {  
                    Object[] _args = (Object[])pArgs;  
                    int requestCode = (Integer)_args[0];  
                    int resultCode = (Integer)_args[1];  
                    Intent data = (Intent)_args[2];  
                    if(pEventType == SysEventType.OnActivityResult){  
                        _app.unregisterSysEventListener(this, SysEventType.OnActivityResult);  
                        if (requestCode == REQUESTCODE) {  
                            if(resultCode == Activity.RESULT_OK){  
                                String phoneNumber = null;  
                                String resultString = "";  
                                Context context = pWebview.getContext();  
                                Uri contactData = data.getData();  
                                Cursor cursor = context.getContentResolver().query(contactData, null, null, null, null);  
                                cursor.moveToFirst();  
                                String givenName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));  
                                resultString += "{\"givenName\":\"" + givenName + "\",\"numbers\":[";  
                                String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));  
                                Cursor pCursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,   
                                        null,   
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,   
                                        null,   
                                        null);  
                                while (pCursor.moveToNext()) {  
                                    phoneNumber = pCursor.getString(pCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  
                                    resultString += "{\"value\":\"" + phoneNumber + "\"},";  
                                }  
                                resultString = resultString.substring(0, resultString.length()-1);  
                                resultString += "]}";  
                                cursor.close();  
                                pCursor.close();  
                                JSUtil.execCallback(pWebview, callBackId, JSONUtil.createJSONObject(resultString), JSUtil.OK, false);  
                            }  
                        }  
                    }  
                    return false;  
                }  

            }, SysEventType.OnActivityResult);  
            Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);  
            pWebview.getActivity().startActivityForResult(intent, REQUESTCODE);  
        }  
        return null;  
    }  

    @Override  
    public void init(AbsMgr arg0, String arg1) {  
        // TODO Auto-generated method stub  
    }  
}
10 关注 分享
Android_磊子 半杯可乐 DCloud_heavensoft outofMemory 踩着单车载着猪 Jerry_Yee 张释 moliu sunshine2651 飞apple55

要回复文章请先登录注册

passage2011

passage2011

能不能发个完整的工程文件参考下 谢谢,50800250@qq.com
2016-11-16 10:11
闪闪

闪闪 (作者)

回复 醒着星星 :
我也是认真一句一句看的文档,做了一个插件后就完全理解了。但是对于新手,如果缺乏某方面的知识点,可能就会不知所云。

现在不知道官方的动向了,期待放大招。

我几乎是在H5+发布后就开始接触的,官方的开发人员也给了很多的支持,有时候已经晚上10点多了,可以看到他们真的很拼,是在踏实做平台、做技术。希望更好的东西出来。
2016-08-16 16:22
醒着星星

醒着星星

关于插件的文档,我说下自己的感慨。

H5+的文档可谓全面翔实、且具备很高的条理性,图文并茂,讲解生动,让小白能很快上手。干货也有一些,让不同领域的老鸟也有心得。

仿佛昭示了世人“都来学习H5+吧,这很easy的,让你分分钟使用html5做移动开发,多好,多赞” 。
开始的开始我就是这样认为的(尽管我是一名android开发工程师)

但是! 当我看到插件开发的时候,觉得文风忽变,文档没有了之前耐心,也缺少了条理性。作者瞬间把学习者当成职场大牛对待了,插件的开发给人的感觉就是 “资料我已经给你们了,罗列在这里,你们看不懂怪我咯? ” 或者是 “啧啧啧 ,你们就踏实的用我H5+内置的插件吧,要什么自行车?”

我自己看了插件开发至少有3次才略略有点感悟,确切说第一次和第二次,我真的都没有坚持读完、读懂。我瞬间觉得自己是个白痴了,觉得自己并不适合做开发,“就我这智商,基本告别自行车了”

当我自己结合demo和文档,自己把plus/ native/ bridge这些东西都画在我的excel里
才知道他们的调用原理。自己的插件开发调用成功了。当时自己的第一个打算就是“我来以小白的视角来写插件开发,以帮助更多的初学者”(尽管我木耳已黑、已碳化)

声明:
我对H5+的开发人员表示感谢,每次提问都能及时的反馈。
以上评论只是自己的看法,没有想攻击任何人(团体)的意思。
如有冒犯,我深表歉意
2016-08-15 10:31
闪闪

闪闪 (作者)

回复 蔡邵鑫 :
类似这样,在发起跳转第三方登录前,注册回调,在回调中获取登录结果传回的数据。
final IApp _app = pWebview.obtainFrameView().obtainApp();
final String callBackId = pArgs[0];
_app.registerSysEventListener(new ISysEventListener(){
@Override
public boolean onExecute(SysEventType pEventType, Object pArgs) {
2016-07-27 09:37
蔡邵鑫

蔡邵鑫

在写第三方登录插件的时候,点击登陆按钮可以跳到第三方登录,登陆成功后我应该怎么取到登陆后的值,不知道怎么往下做了
2016-07-26 16:02
闪闪

闪闪 (作者)

回复 6***@qq.com :
原因可能在新建的activity这边,多打点的log看执行情况
2016-07-22 09:36
6***@qq.com

6***@qq.com

我新建的activity,跳转过去,再返回,回调不执行,在最开始的时候,就执行了,这是怎么回事啊,楼主,急急急!
2016-07-19 16:11
闪闪

闪闪 (作者)

回复 phoenix_ch :
这就是完整源码,看懂前要先看懂H5+插件开发的官方文档。
2015-11-16 10:28
phoenix_ch

phoenix_ch

求完整示例。
2015-11-13 17:29
phoenix_ch

phoenix_ch

有人能看懂这是在干什么吗?感觉这些文档写的都是一部分。求具体怎么弄一步一步的说明。
2015-11-13 17:29