Android 登录失败时phonegap cordova facebook插件JSON错误

Android 登录失败时phonegap cordova facebook插件JSON错误,android,facebook,angularjs,cordova,ionic-framework,Android,Facebook,Angularjs,Cordova,Ionic Framework,我只是想测试一下这是否有效,但我却不幸地失败了。在这件事上花费了超过48小时,肯定需要帮助 我有一个非常简单的设置。我使用的是爱奥尼亚/安格拉斯。对于那些不熟悉这些的人,我不认为这是相关的,但我将其包括在内,以便您了解我的设置(以及$scope变量的奇怪语法…) 基本上,您在下面看到的是一个登录方法,当被调用时,它会执行facebookConnectPlugin.login。我对参数(权限、successCallback、failCallback)进行了排序,我认为与文档中显示的顺序相反,这些参

我只是想测试一下这是否有效,但我却不幸地失败了。在这件事上花费了超过48小时,肯定需要帮助

我有一个非常简单的设置。我使用的是爱奥尼亚/安格拉斯。对于那些不熟悉这些的人,我不认为这是相关的,但我将其包括在内,以便您了解我的设置(以及
$scope
变量的奇怪语法…)

基本上,您在下面看到的是一个登录方法,当被调用时,它会执行
facebookConnectPlugin.login
。我对参数
(权限、successCallback、failCallback
)进行了排序,我认为与文档中显示的顺序相反,这些参数的顺序是正确的

My
successCallback
函数只是发出成功登录的警报,并发出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