贴出源码回报社区!
下面贴出关键代码,稍后完善更多细节步骤。个人android开发经验不多,如果有更好的集成方式,请大家分享!
前提:
- 能在android stuido成功运行官方给出的android SDK集成和插件示例程序和离线打包
- 能在android stuido成功运行官方给出的集成示例facebook-android-sdk(https://github.com/facebook/facebook-android-sdk) 中的 FBLoginSample 示例程序
- 注册了facebook开发者平台,并完成了官方android集成步骤(https://developers.facebook.com/docs/facebook-login/android?locale=zh_CN)
- 下面的部分.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>
6 个评论
要回复文章请先登录或注册
II优选
kert
h***@163.com
h***@163.com
coton_chen1 (作者)
jtshushu