您的位置:首页 > 移动开发

Android webview实现QQ一键登录授权

2015-07-23 16:49 1346 查看

Android webview实现QQ一键登录授权

最近公司要求的新需求,要实现webview中的的QQ登录,大脑没经过就习惯的百度,奈何找了两天的资料也没发现个完整的demo,只能自己写,好吧,还要去学JS,醉了。

public class MainActivity extends Activity {
    private static final String LOG_TAG = "WebViewDemo";
    private String url = "https://graph.qq.com/user/get_user_info";
    private String SCOPE = "https://graph.qq.com/user/get_user_info,get_user_profile,add_share,add_topic,list_album,upload_pic,add_album";//授权范围
    private WebView mWebView;

    private Handler mHandler = new Handler();
    private Activity thisActivity;
    /**
    *qq登录
    */ 

    private Tencent mTencent;
    public static QQAuth mQQAuth;
    public static String mAppid;
    //测试用的ID,可改成你的ID
    private String APP_ID = "222222";
    /**
     * 返回授权信息
     */
    private String code;
    private String openid;
    private String access_token;

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_main);

    // 启用一个新线程用于回调登录信息用
    final Context context = MainActivity.this;
    final Context ctxContext = context.getApplicationContext();
    mAppid = APP_ID; // 绑定ID
    mQQAuth = QQAuth.createInstance(mAppid, ctxContext);
    mTencent = Tencent.createInstance(mAppid, MainActivity.this);

        mWebView = (WebView) findViewById(R.id.webview);
        WebViewClient wvClient = new WebViewClient();
        mWebView.setWebViewClient(wvClient);
        mWebView.setWebChromeClient(new WebChromeClient() {
            public boolean onJsAlert(WebView view, String url, String message,
                    JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }
        });

        WebSettings webSettings = mWebView.getSettings();
        webSettings.setSaveFormData(false);
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDefaultTextEncodingName("utf-8");
        webSettings.setSupportZoom(true);

        /**添加自定义的JavaJS函数接口,注意
         * AndroidJSInterface 必须和JS写的一样
         */
        AndroidJSInterface ajsi = new AndroidJSInterface(this);
        mWebView.addJavascriptInterface(ajsi, ajsi.getInterface());

        mWebView.loadUrl("file:///android_asset/login.html");

         // 初始化activity
         //此步将直接绑定Main,不写将调不了SDK
        thisActivity=this;
    }

    final class AndroidJSInterface {
        private Context mContext;
        public AndroidJSInterface(Context context){
            mContext = context;
        }

         // 该方法名称是JS自定义的interface后面的方法
         //必须加上这句注释
        @JavascriptInterface
        public void Login() {
            //这是要调用qqsdk的方法
            if (!mTencent.isSessionValid()) {
                IUiListener listener = new IUiListener() {
                    //授权失败的回调
                    @Override
                    public void onError(UiError arg0) {
                        Toast.makeText(MainActivity.this, "授权失败", 1000).show();
                        Message msg = new Message();
                        msg.arg1 = 2;
                        mHandler.sendMessage(msg);
                    }

                    /** 取消授权的回调 */
                    @Override
                    public void onCancel() {
                        Toast.makeText(MainActivity.this, "取消授权", 1000).show();
                        Message msg = new Message();
                        msg.arg1 = 3;
                        mHandler.sendMessage(msg);
                    }

                    /** 授权成功的回调 */
                    @Override
                    public void onComplete(Object arg0) {
                        Toast.makeText(MainActivity.this, "授权成功", 1000).show();
                        Message msg = new Message();
                        msg.arg1 = 1;
                        msg.obj = arg0;
                        mHandler.sendMessage(msg);

                    }
                };
                int res=mTencent.login(thisActivity, SCOPE, listener);

            }else {
                //登出
                mTencent.logout(thisActivity);
            }

        }

    /**
         *  授权完成后回传给后台
         */
        @SuppressLint("HandlerLeak")
        Handler mHandler = new Handler() {
             public void handleMessage(Message msg) {
                switch (msg.arg1) {
                case 1: { // 成功
                    final JSONObject jsobjStr = (JSONObject) msg.obj;
                    try {
                        //返回数据给后台
                        code = jsobjStr.optString("succcess").toString();
                        openid = jsobjStr.optString("openid").toString();
                        access_token = jsobjStr.optString("access_token").toString();
                        System.out.println(jsobjStr);
                    //调用json方法, 调用js并传参
                        final JSONObject json = new JSONObject();
                        json.put("openid", openid);
                        json.put("accesstoken", access_token);
                         mHandler.post(new Runnable() {
                                    public void run() {
                                  mWebView.loadUrl("javascript:wave("+ json+")");
                                        }
                                });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            //没有做失败的操作
            };
                };
            }
       };
                /**
         * 根据一个网络连接(String)获取bitmap图像
        */
        public Bitmap getbitmap(String imageUri) {
            Log.v(LOG_TAG, "getbitmap:" + imageUri);
            // 显示网络上的图片
            Bitmap bitmap = null;
            try {
                URL myFileUrl = new URL(imageUri);
                HttpURLConnection conn = (HttpURLConnection) myFileUrl
                        .openConnection();
                conn.setDoInput(true);
                conn.connect();
                InputStream is = conn.getInputStream();
                bitmap = BitmapFactory.decodeStream(is);
                is.close();

                Log.v(LOG_TAG, "image download finished." + imageUri);
            } catch (IOException e) {
                e.printStackTrace();
                Log.v(LOG_TAG, "getbitmap bmp fail---");
                return null;
            }
            return bitmap;
        } 

          /**
         * 根据js按钮接口执行按钮监听操作
         * 该名称必须和JS的window.(android_js_interface)一致
         */
        @JavascriptInterface
        public String getInterface(){
            return "android_js_interface";
        }
    }


最后要记得添加权限

<uses-permission android:name="android.permission.INTERNET" />


- **

JS的代码:

function init() 

            {} 

        function wave(jsobjStr) { 

            document.getElementById("output").innerHTML="返回值:"+jsobjStr; 

            alert("像服务器传入数据"); 

        } 

        function OnClick() 

        { 

            window.android_js_interface.Login(); 

        } 

    <input type="submit" value="QQ登录" onclick="window.android_js_interface.Login();"/>


资源我已上传,不过好像审核要时间,不明白的可加我QQ:943511917
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: