html5+ & mui框架facebook登录插件(android版)

 

贴出源码回报社区!

下面贴出关键代码,稍后完善更多细节步骤。个人android开发经验不多,如果有更好的集成方式,请大家分享!

前提:
1. 能在android stuido成功运行官方给出的android SDK集成和插件示例程序和离线打包
2. 能在android stuido成功运行官方给出的集成示例facebook-android-sdk(https://github.com/facebook/facebook-android-sdk) 中的 FBLoginSample 示例程序
3. 注册了facebook开发者平台,并完成了官方android集成步骤
4. 下面的部分.facebook.的代码均采用了官方示例代码,参考:https://github.com/facebook/facebook-android-sdk/tree/master/samples/FBLoginSample

源代码目录结构

1.js层代码调用插件login.js

var App ={

    loginWithFacebook: function()
    {
        Common.showLoading();

        setTimeout(function(){
            if(App.timeout)
            {
                Common.hideLoading();
                mui.toast(Common.messages.LOGIN_TIMEOUT,{ duration:'short', type:'div' });
            }
        }, 5000);

        if(Common.debug)
        {
            setTimeout(function(){
                App.facebookAuthSuccessCallBack('{"picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/platform-lookaside.fbsbx.com\/platform\/profilepic\/?asid=1791872767573170&height=50&width=50&ext=1529946538&hash=AeT-c8Gg8kljhvAC","width":50}},"name":"Nick Name","id":"1791872767544170","email":"your@email.com","permissions":{"data":[{"permission":"user_birthday","status":"granted"},{"permission":"user_hometown","status":"granted"},{"permission":"user_location","status":"granted"},{"permission":"user_posts","status":"granted"},{"permission":"user_gender","status":"granted"},{"permission":"user_link","status":"granted"},{"permission":"user_age_range","status":"granted"},{"permission":"email","status":"granted"},{"permission":"public_profile","status":"granted"}]},"age_range":{"min":21},"link":"","gender":"male","birthday":"01\/01\/1991","location":{"id":"106324046073002","name":"Shanghai, China"}}');
                //App.facebookAuthCancelCallBack();
                //App.facebookAuthErrorCallBack("auth fail!");
            }, 2000);

        }else
        {
            //plus.facebookplug.logOut();
            plus.facebookplug.logIn();
        }

    },

    // 这个回调函数会在 cn.your.app.SDK_WebApp.java 原生类中调用, 参考类中的excuteJSCode()方法
    facebookAuthSuccessCallBack: function(data)
    {
        App.timeout = false;

        if(data != null)
        {
         // data example:  '{"picture":{"data":{"height":50,"is_silhouette":false,"url":"https:\/\/platform-lookaside.fbsbx.com\/platform\/profilepic\/?asid=1791872767573170&height=50&width=50&ext=1529946538&hash=AeT-c8Gg8kljhvAC","width":50}},"name":"Nick Name","id":"1791872767544170","email":"your@email.com","permissions":{"data":[{"permission":"user_birthday","status":"granted"},{"permission":"user_hometown","status":"granted"},{"permission":"user_location","status":"granted"},{"permission":"user_posts","status":"granted"},{"permission":"user_gender","status":"granted"},{"permission":"user_link","status":"granted"},{"permission":"user_age_range","status":"granted"},{"permission":"email","status":"granted"},{"permission":"public_profile","status":"granted"}]},"age_range":{"min":21},"link":"","gender":"male","birthday":"01\/01\/1991","location":{"id":"106324046073002","name":"Shanghai, China"}}'
            try{
                var facebookUser = JSON.parse(data);
                facebookUser.unionid = facebookUser.id;
                mui.toast(Common.messages.LOGIN_SUCCESS,{ duration:'short', type:'div' });
                App.checkUserIsExist(facebookUser, "facebook");
            }catch(err)
            {
                Common.hideLoading();
                mui.toast(Common.messages.LOGIN_FAIL,{ duration:'long', type:'div' });
                Common.log("====login.js, facebookAuthSuccessCallBack(), decode facebook user JSON string fail!");
            }
        }else
        {
            Common.hideLoading();
            App.facebookAuthErrorCallBack();
        }
    },

    // 这个回调函数会在 cn.your.app.SDK_WebApp.java 原生类中调用, 参考类中的excuteJSCode()方法
    facebookAuthCancelCallBack: function()
    {
        App.timeout = false;
        Common.hideLoading();

        mui.toast(Common.messages.LOGIN_CANCEL,{ duration:'long', type:'div' });
    },

    // 这个回调函数会在 cn.your.app.SDK_WebApp.java 原生类中调用, 参考类中的excuteJSCode()方法
    facebookAuthErrorCallBack: function(error)
    {
        App.timeout = false;
        Common.hideLoading();

        mui.toast(Common.messages.LOGIN_FAIL,{ duration:'long', type:'div' });
    }

};



if(window.plus){
    App.init();
}else{ 
    document.addEventListener( "plusready", App.init, false );
}

2. js层代码插件facebookplug.js

document.addEventListener( "plusready",  function()
{
    var facebookplug =
    {
        logIn : function ()
        {
            window.plus.bridge.exec('facebookplug', "logIn", []);
        },
        logOut : function ()
        {
            window.plus.bridge.exec('facebookplug', "logOut", []);
        },
    };

    window.plus.facebookplug = facebookplug;
}, true );

3. 原生层FacebookLoginPlugin.java

package cn.your.app.plugin.facebook;

import cn.your.app.SDK_WebApp;
import cn.your.app.plugin.facebook.callbacks.GetUserCallback;
import cn.your.app.plugin.facebook.requests.UserRequest;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil;

import org.json.JSONArray;

import android.content.Context;
import android.os.Bundle;

import com.facebook.AccessToken;
import com.facebook.login.LoginManager;

import java.util.Arrays;


public class FacebookLoginPlugin extends StandardFeature
{

    public void onStart(Context pContext, Bundle pSavedInstanceState, String[] pRuntimeArgs) {

        /**
         * 如果需要在应用启动时进行初始化,可以继承这个方法,并在properties.xml文件的service节点添加扩展插件的注册即可触发onStart方法
         * */
    }

    public void logIn(IWebview pWebview, JSONArray array)
    {
        if (AccessToken.getCurrentAccessToken() == null) {

            /*
             * 获取用户属性的权限,参考官方文档:https://developers.facebook.com/docs/facebook-login/permissions/
             * 有2中属性,一种是默认公开的(Default fields),参考: https://developers.facebook.com/docs/facebook-login/permissions/#reference-default_fields
             * 另一种是需要在应用控制面板提交审查才可以获取的字段(Read Permissions)
             */
            // 只获取公开的属性
            //LoginManager.getInstance().logInWithReadPermissions(pWebview.getActivity(), Arrays.asList("public_profile"));

            // 获取更多属性(应用处于开发阶段时,不需要提交审查即可获取所有字段权限)
            LoginManager.getInstance().logInWithReadPermissions(pWebview.getActivity(),Arrays.asList("email", "user_age_range", "user_birthday", "user_gender", "user_hometown", "user_link", "user_location"));

        } else {

            UserRequest.makeUserRequest(new GetUserCallback((SDK_WebApp)pWebview.getActivity()).getCallback());
        }

    }

    public void logOut(IWebview pWebview, JSONArray array)
    {
        LoginManager.getInstance().logOut();
    }




}

4. 原生层SDK_WebApp.java (在官方给出的android SDK集成代码基础上增加如下代码)

package cn.your.app;

import io.dcloud.EntryProxy;
import io.dcloud.RInformation;
import io.dcloud.common.DHInterface.IApp;
import io.dcloud.common.DHInterface.IApp.IAppStatusListener;
import io.dcloud.common.DHInterface.ICore;
import io.dcloud.common.DHInterface.ICore.ICoreStatusListener;
import io.dcloud.common.DHInterface.IOnCreateSplashView;
import io.dcloud.common.DHInterface.ISysEventListener.SysEventType;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.IWebviewStateListener;
import io.dcloud.common.util.BaseInfo;
import io.dcloud.common.util.ImageLoaderUtil;
import io.dcloud.feature.internal.sdk.SDK;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.Toast;



import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;

import cn.your.app.plugin.facebook.callbacks.GetUserCallback;
import cn.your.app.plugin.facebook.entities.FacebookUser;
import cn.your.app.plugin.facebook.requests.UserRequest;
import java.util.ArrayList;

/**
 * 本demo为以WebApp方式集成5+ sdk, 
 *
 */
public class SDK_WebApp extends Activity implements GetUserCallback.IGetUserResponse {

    boolean doHardAcc = true;
    EntryProxy mEntryProxy = null;
    CallbackManager callbackManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        if (mEntryProxy == null) {
            FrameLayout f = new FrameLayout(this);
            // 创建5+内核运行事件监听
            WebappModeListener wm = new WebappModeListener(this, f);
            // 初始化5+内核
            mEntryProxy = EntryProxy.init(this, wm);
            // 启动5+内核
            mEntryProxy.onCreate(this, savedInstanceState, SDK.IntegratedMode.WEBAPP, null);
            setContentView(f);
        }

        // 注册Facebook授权登录回调方法
        registerFacebookAuthCallback();
    }



    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mEntryProxy.onActivityExecute(this, SysEventType.onActivityResult, new Object[] { requestCode, resultCode, data });

        // facebook授权成功通知
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }

    /** ================Facebook Login START============== **/
    protected void registerFacebookAuthCallback()
    {
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                UserRequest.makeUserRequest(new GetUserCallback(SDK_WebApp.this).getCallback());
            }

            @Override
            public void onCancel() {
                excuteJSCode("App.facebookAuthCancelCallBack()");
            }

            @Override
            public void onError(FacebookException error) {
                excuteJSCode("App.facebookAuthErrorCallBack('" + error.getMessage() + "')");
            }
        });
    }

    @Override
    public void onCompleted(FacebookUser user) {

        excuteJSCode("App.facebookAuthSuccessCallBack('" + user.getName() + "')");
    }

    @Override
    public void onGotFacebookUserData(String user)
    {
        excuteJSCode("App.facebookAuthSuccessCallBack('" + user + "')");
    }

    // 调用login.html内的JS函数, 参考引用的 /js/login.js 文件
    protected void excuteJSCode(String jsCode)
    {
        ArrayList<IWebview> ss = SDK.obtainAllIWebview();
        for (IWebview iWebview : ss) {
            if (iWebview.getOriginalUrl().equals("login.html")) {
                iWebview.evalJS(jsCode);
                break;
            }
        }
    }

    /** ================Facebook Login END============== **/

}


}

5. 配置文件/app/src/main/res/values/strings.xml

<resources>
    <string name="app_name">应用名</string>
    <string name="facebook_app_id">193445774573048</string>
    <string name="fb_login_protocol_scheme">fb121135774573048</string>
</resources>

6. 配置文件/app/src/main/assets/data/dcloud_properties.xm(在原基础上新增的部分)

<properties>
    <features>
        <feature
            name="facebookloginplugin"
            value="cn.shaketowin.app.plugin.facebook.FacebookLoginPlugin" />
    </features> 

    <services>
        <!--<service name="facebookloginplugin" value="cn.shaketowin.app.plugin.facebook.FacebookLoginPlugin"/>-->
    </services>
</properties>

7. 配置文件/app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="cn.shaketowin.app">

    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />


    <!-- facebook login begin -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- facebook login end -->



    <application
        android:name="io.dcloud.application.DCloudApplication"
        android:allowBackup="true"
        android:allowClearUserData="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true">

        <!-- facebook login begin -->
        <meta-data android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>

        <activity android:name="com.facebook.FacebookActivity"
            android:configChanges=
                "keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name" />
        <activity
            android:name="com.facebook.CustomTabActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="@string/fb_login_protocol_scheme" />
            </intent-filter>
        </activity>
        <!-- facebook login end -->



        <activity
            android:name="cn.shaketowin.app.ActivityEntry"
            android:configChanges="orientation|keyboardHidden"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="user"
            android:windowSoftInputMode="adjustResize">
                <!--<intent-filter>-->
                    <!--<action android:name="android.intent.action.MAIN" />-->
                    <!--<category android:name="android.intent.category.LAUNCHER" />-->
                <!--</intent-filter>-->
        </activity>
        <activity
            android:name="cn.shaketowin.app.SDK_WebApp"
            android:configChanges="orientation|keyboardHidden|screenSize|keyboard|navigation|mcc|mnc|fontScale"
            android:screenOrientation="user"
            android:theme="@style/DCloudTheme"> <!-- 离线配置沉浸式  SDK_WebApp  作为apk入口时  必须设置 SDK_WebApp   的主题为android:theme="@style/DCloudTheme" -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

 

转载于:https://my.oschina.net/cotonchen/blog/1836631

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值