Android 登录失败时phonegap cordova facebook插件JSON错误
我只是想测试一下这是否有效,但我却不幸地失败了。在这件事上花费了超过48小时,肯定需要帮助 我有一个非常简单的设置。我使用的是爱奥尼亚/安格拉斯。对于那些不熟悉这些的人,我不认为这是相关的,但我将其包括在内,以便您了解我的设置(以及Android 登录失败时phonegap cordova facebook插件JSON错误,android,facebook,angularjs,cordova,ionic-framework,Android,Facebook,Angularjs,Cordova,Ionic Framework,我只是想测试一下这是否有效,但我却不幸地失败了。在这件事上花费了超过48小时,肯定需要帮助 我有一个非常简单的设置。我使用的是爱奥尼亚/安格拉斯。对于那些不熟悉这些的人,我不认为这是相关的,但我将其包括在内,以便您了解我的设置(以及$scope变量的奇怪语法…) 基本上,您在下面看到的是一个登录方法,当被调用时,它会执行facebookConnectPlugin.login。我对参数(权限、successCallback、failCallback)进行了排序,我认为与文档中显示的顺序相反,这些参
$scope
变量的奇怪语法…)
基本上,您在下面看到的是一个登录方法,当被调用时,它会执行facebookConnectPlugin.login
。我对参数(权限、successCallback、failCallback
)进行了排序,我认为与文档中显示的顺序相反,这些参数的顺序是正确的
MysuccessCallback
函数只是发出成功登录的警报,并发出accessToken。我的failCallback
函数只会发出登录失败的警报并给出响应
当我在android设备上运行代码并单击login时,它无法登录,响应变量只是一个表示JSON Error的字符串。没有其他信息。我完全迷路了,希望有人能告诉我问题是什么
我一步一步地遵循android指南,没有出现任何错误,因此我认为我应该能够使用该插件。有人知道为什么它不起作用吗???我能做些什么来解决这个问题
function loginctrl($scope){
$scope.login = function(){
facebookConnectPlugin.login('public_profile,email,user_friends',
function(response){
alert("success!"+response.status);
if (response.status=="connected"){
console.log(response.authResponse.userID+" "+response.authResponse.accessToken);
}
},function(response){
console.error("I'm an error" + response);
alert("failed!"+response);
});
}
}
EDIT:错误JSON错误
似乎源于未能执行插件的login
操作。具体而言:
login: function (permissions, s, f) {
cordova.exec(s, f, "FacebookConnectPlugin", "login", permissions);
},
而cordova.exec
函数执行以下命令。注意第一行,它说抛出JSONException
。当插件抛出JSONException时,它会发回一个错误,称为JSON错误。因此,下面的插件在某处有一个错误…仍在调查,以找出它是什么
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if (action.equals("login")) {
Log.d(TAG, "login FB");
// Get the permissions
String[] arrayPermissions = new String[args.length()];
for (int i = 0; i < args.length(); i++) {
arrayPermissions[i] = args.getString(i);
}
List<String> permissions = null;
if (arrayPermissions.length > 0) {
permissions = Arrays.asList(arrayPermissions);
}
// Get the currently active session
Session session = Session.getActiveSession();
// Set a pending callback to cordova
loginContext = callbackContext;
PluginResult pr = new PluginResult(PluginResult.Status.NO_RESULT);
pr.setKeepCallback(true);
loginContext.sendPluginResult(pr);
// Check if the active session is open
if (session != null && session.isOpened()) {
// Reauthorize flow
boolean publishPermissions = false;
boolean readPermissions = false;
// Figure out if this will be a read or publish reauthorize
if (permissions == null) {
// No permissions, read
readPermissions = true;
}
// Loop through the permissions to see what
// is being requested
for (String permission : arrayPermissions) {
if (isPublishPermission(permission)) {
publishPermissions = true;
} else {
readPermissions = true;
}
// Break if we have a mixed bag, as this is an error
if (publishPermissions && readPermissions) {
break;
}
}
if (publishPermissions && readPermissions) {
callbackContext.error("Cannot ask for both read and publish permissions.");
} else {
// Set up the new permissions request
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(cordova.getActivity(), permissions);
// Set up the activity result callback to this class
cordova.setActivityResultCallback(this);
// Check for write permissions, the default is read (empty)
if (publishPermissions) {
// Request new publish permissions
session.requestNewPublishPermissions(newPermissionsRequest);
} else {
// Request new read permissions
session.requestNewReadPermissions(newPermissionsRequest);
}
}
} else {
// Initial login, build a new session open request.
// - Create a new session and set the application ID
session = new Session.Builder(cordova.getActivity()).setApplicationId(applicationId).build();
Session.setActiveSession(session);
// - Create the request
Session.OpenRequest openRequest = new Session.OpenRequest(cordova.getActivity());
// - Set the permissions
openRequest.setPermissions(permissions);
// - Set the status change call back
openRequest.setCallback(new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(state, exception);
}
});
// Can only ask for read permissions initially
session.openForRead(openRequest);
}
return true;
// Other statements below to handle when the execute is not 'login'
public boolean execute(字符串操作、JSONArray参数、CallbackContext CallbackContext)抛出JSONException{
if(action.equals(“登录”)){
Log.d(标记“登录FB”);
//获取权限
String[]arrayPermissions=新字符串[args.length()];
对于(int i=0;i0){
权限=Arrays.asList(arrayPermissions);
}
//获取当前活动的会话
Session=Session.getActiveSession();
//将挂起的回调设置为cordova
loginContext=callbackContext;
PluginResult pr=新的PluginResult(PluginResult.Status.NO_结果);
pr.setKeepCallback(真);
loginContext.sendPluginResult(pr);
//检查活动会话是否已打开
if(session!=null&&session.isOpened()){
//重新授权流
布尔publishPermissions=false;
布尔readPermissions=false;
//弄清楚这是一个读取还是发布的重新授权
if(权限==null){
//没有权限,请阅读
readPermissions=true;
}
//循环查看权限以查看所需内容
//正在请求
for(字符串权限:arrayPermissions){
if(发布许可(许可)){
publishPermissions=true;
}否则{
readPermissions=true;
}
//如果我们有一个混合的包,则中断,因为这是一个错误
if(publishPermissions&&readPermissions){
打破
}
}
if(publishPermissions&&readPermissions){
callbackContext.error(“无法同时请求读取和发布权限”);
}否则{
//设置新的权限请求
Session.NewPermissionsRequest NewPermissionsRequest=newsession.NewPermissionsRequest(cordova.getActivity(),permissions);
//设置对此类的“活动结果”回调
cordova.setActivityResultCallback(此);
//检查写入权限,默认为读取(空)
如果(发布权限){
//请求新的发布权限
session.requestNewPublishPermissions(newPermissionsRequest);
}否则{
//请求新的读取权限
session.requestNewReadPermissions(newPermissionsRequest);
}
}
}否则{
//初始登录,生成一个新的会话打开请求。
//-创建新会话并设置应用程序ID
session=new session.Builder(cordova.getActivity()).setApplicationId(applicationId.build();
Session.setActiveSession(Session);
//-创建请求
Session.OpenRequest OpenRequest=新建Session.OpenRequest(cordova.getActivity());
//-设置权限
设置权限(permissions);
//-设置状态更改回拨
openRequest.setCallback(新会话.StatusCallback(){
@凌驾
公共无效调用(会话、会话状态、异常){
onSessionStateChange(状态、异常);
}
});
//最初只能请求读取权限
openForRead(openRequest);
}
返回true;
//当execute不是“login”时要处理的其他语句
我是个笨蛋
我的问题是,我的权限是一个字符串,如'public\u profile,email,user\u friends'
。正确的类型是一个数组,如['public\u profile','email','user\u friends']
,而我是一个noob