coton_chen1
coton_chen1
  • 发布:2018-06-27 18:39
  • 更新:2023-12-11 07:56
  • 阅读:6224

facebook登录插件(android版)

分类:5+ SDK

贴出源码回报社区!

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

前提:

  1. 能在android stuido成功运行官方给出的android SDK集成和插件示例程序和离线打包
  2. 能在android stuido成功运行官方给出的集成示例facebook-android-sdk(https://github.com/facebook/facebook-android-sdk) 中的 FBLoginSample 示例程序
  3. 注册了facebook开发者平台,并完成了官方android集成步骤(https://developers.facebook.com/docs/facebook-login/android?locale=zh_CN)
  4. 下面的部分.facebook.plugin.的代码采用了官方示例代码,参考: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>
8 关注 分享
Trust DCloud_heavensoft jtshushu DCloud_UNI_GSQ OnlyFree何 9***@qq.com 蒋馨莹 2***@qq.com

要回复文章请先登录注册