Facebook的SSO不是Android平台 [英] Facebook SSO not working in android

查看:182
本文介绍了Facebook的SSO不是Android平台的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的code到Facebook在我的应用程序登录。我需要与Facebook SSO做到这一点。我有正确的APP_ID。

 包com.fb.sso;进口java.io.FileNotFoundException;
进口java.io.IOException异常;
进口java.net.MalformedURLException;进口com.facebook.android.AsyncFacebookRunner;
进口com.facebook.android.AsyncFacebookRunner.RequestListener;
进口com.facebook.android.DialogError;
进口com.facebook.android.Facebook;
进口com.facebook.android.Facebook.DialogListener;
进口com.facebook.android.FacebookError;
进口com.facebook.android.Util;进口android.app.Activity;
进口android.content.Intent;
进口android.content.Shared preferences;
进口android.os.Bundle;
进口android.os.Handler;
进口android.util.Log;
进口android.view.Menu;
进口android.view.MenuInflater;
进口android.view.MenuItem;
进口android.widget.TextView;公共类FBSSOActivity延伸活动{
    / **当第一次创建活动调用。 * /
    公共静态最后弦乐APP_ID =my_app_id;    私有静态最后的String [] = PERMISSIONS新的String [] {
            publish_stream,read_stream,offline_access};
    私人TextView的多行文字;
    私人处理程序mHandler =新的处理程序();    私人facebook mFacebook;
    私人AsyncFacebookRunner mAsyncRunner;
    字节[]生;
    私人共享preferences米preFS;    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        如果(APP_ID == NULL){
            Util.showAlert(这一点,警告,
                    Facebook的一个应用ID必须设置...);
        }        //初始化内容视图
        的setContentView(R.layout.main);        //初始化会话的Facebook
        mFacebook =新的Facebook(APP_ID);
        mAsyncRunner =新AsyncFacebookRunner(mFacebook);        米preFS = GET preferences(MODE_PRIVATE);
        字符串的access_token = M prefs.getString(的access_token,NULL);
        长到期= M prefs.getLong(access_expires,0);
        如果(ACCESS_TOKEN!= NULL){
            mFacebook.setAccessToken(的access_token);
        }
        如果(到期!= 0){
            mFacebook.setAccessExpires(到期);
        }    }    公共无效的onActivityResult(INT申请code,INT结果code,意图数据){
        super.onActivityResult(要求code,结果code,数据);
        Log.d(FB示例应用程序,的onActivityResult():+请求code);
        mFacebook.authorizeCallback(要求code,结果code,数据);
    }    私有类LogoutRequestListener实现RequestListener {        @覆盖
        公共无效的onComplete(字符串响应,对象的状态){
            // TODO自动生成方法存根Log.v(说到这儿>方式>,sucess);
            //只有原始所有者线程可以触摸的看法
            FBSSOActivity.this.runOnUiThread(新的Runnable(){
                公共无效的run(){
                    mText.setText(感谢您使用FB示例应用程序再见......);                }
            });            在自己的线程调度//
            mHandler.post(新的Runnable(){
                公共无效的run(){
                }
            });        }        @覆盖
        公共无效onIOException(IOException异常即对象的状态){
            // TODO自动生成方法存根        }        @覆盖
        公共无效onFileNotFoundException(FileNotFoundException异常E,
                对象的状态){
            // TODO自动生成方法存根        }        @覆盖
        公共无效onMalformedURLException(MalformedURLException的E,
                对象的状态){
            // TODO自动生成方法存根        }        @覆盖
        公共无效onFacebookError(FacebookError即对象的状态){
            // TODO自动生成方法存根
            Log.v(脸谱错误,FB错误);
        }
            }
    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单){
        MenuInflater吹气= getMenuInflater();
        inflater.inflate(R.menu.main_menu,菜单);
        返回true;
    }
    @覆盖
    prepareOptionsMenu(菜单菜单)上公共布尔{        菜单项loginItem = menu.findItem(R.id.login);        如果(mFacebook.isSessionValid()){
            loginItem.setTitle(注销);
        }其他{
            loginItem.setTitle(登录);
        }
        loginItem.setEnabled(真);
        返回super.on prepareOptionsMenu(菜单);
    }
    @覆盖
    公共布尔onOptionsItemSelected(菜单项项){
        开关(item.getItemId()){        //登录/注销切换
        案例R.id.login:            如果(!mFacebook.isSessionValid()){                mFacebook.authorize(这一点,新DialogListener(){                    @覆盖
                    公共无效的onComplete(束值){
                        // TODO自动生成方法存根                        Log.v(输入,无ERRRRRRRRRRRR);
                        共享preferences.Editor编辑= M prefs.edit();
                        editor.putString(的access_token
                                mFacebook.getAccessToken());
                        editor.putLong(access_expires
                                mFacebook.getAccessExpires());
                        editor.commit();
                        意图I =新意图(FBSSOActivity.this,second.class);
                        startActivity(ⅰ);                    }                    @覆盖
                    公共无效onFacebookError(FacebookError E){
                        // TODO自动生成方法存根                    }                    @覆盖
                    公共无效onerror的(DialogError E){
                        // TODO自动生成方法存根                    }                    @覆盖
                    公共无效onCancel(){
                        // TODO自动生成方法存根                    }                });
            }其他{                mFacebook.setAccessToken(NULL);
                mFacebook.setAccessExpires(0);                AsyncFacebookRunner asyncRunner =新AsyncFacebookRunner(mFacebook);
                 asyncRunner.logout(this.getBaseContext(),新LogoutRequestListener());
            }            打破;
        默认:
            返回false;        }
        返回true;
    }    }

我登录到我的设备pinstalled的Facebook应用程序$ P $。而我只拿到了这个画面。

在我的logcat出现此行。

  09-28 15:18:24.652:E / ActivityThread(1201):无法找到com.facebook.katana.provider.AttributionIdProvider供应商信息

如果我从pinstalled Facebook应用我的$ P $注销,我的应用程序会提示我登录,要求凭据。彼时也,空屏幕appears.But在preinstalled Facebook的应用程序,我可以看到我的更新。(我得到登录)。

更新:

现在,我只检查应用程序。我没有它发布到市场。我参照这个网站 HTTP拿到了钥匙//sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/ 。我把它添加到应用程序,像这样。

更新2:
 现在,我得到这些行logcat的:

  12月9日至29日:00:12.552:I / ActivityManager(73):启动活动:意向{CMP = com.facebook.katana / .ProxyAuth(有临时演员)}
09-29 12:00:13.022的:I / ActivityManager(73):显示活动com.facebook.katana / .ProxyAuth:436毫秒(总共436毫秒)
12月9日至29日:00:15.032:W / InputManagerService(73):对非重点客户com.android.internal.view.IInputMethodClient$Stub$Proxy@434b2e88开始输入(UID = 10031 PID = 2233)
12月9日至29日:00:15.032:W / IInputConnectionWrapper(2233):showStatusIcon上的非活动InputConnection


解决方案

这可能发生由于以下原因:


  1. 您没有连接互联网

  2. 您还没有给出上网(的Manifest.xml)权限

  3. 您没有使用正确的hashkey为应用程序

  4. 您没有提供正确的应用程序ID

I used the following code to Login through Facebook in my app. I need to do this with Facebook SSO. I have the correct app_id.

package com.fb.sso;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;

import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.AsyncFacebookRunner.RequestListener;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;
import com.facebook.android.Util;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;

public class FBSSOActivity extends Activity {
    /** Called when the activity is first created. */


    public static final String APP_ID = "my_app_id";

    private static final String[] PERMISSIONS = new String[] {
            "publish_stream", "read_stream", "offline_access" };
    private TextView mText;
    private Handler mHandler = new Handler();

    private Facebook mFacebook;
    private AsyncFacebookRunner mAsyncRunner;
    byte[] raw;
    private SharedPreferences mPrefs;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        if (APP_ID == null) {
            Util.showAlert(this, "Warning",
                    "Facebook Applicaton ID must be set...");
        }

        // Initialize the content view
        setContentView(R.layout.main);

        // Initialize the Facebook session
        mFacebook = new Facebook(APP_ID);
        mAsyncRunner = new AsyncFacebookRunner(mFacebook);

        mPrefs = getPreferences(MODE_PRIVATE);
        String access_token = mPrefs.getString("access_token", null);
        long expires = mPrefs.getLong("access_expires", 0);
        if (access_token != null) {
            mFacebook.setAccessToken(access_token);
        }
        if (expires != 0) {
            mFacebook.setAccessExpires(expires);
        }

    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d("FB Sample App", "onActivityResult(): " + requestCode);
        mFacebook.authorizeCallback(requestCode, resultCode, data);
    }



    private class LogoutRequestListener implements RequestListener {

        @Override
        public void onComplete(String response, Object state) {
            // TODO Auto-generated method stub

Log.v("comes here>>.","sucess");
            // Only the original owner thread can touch its views
            FBSSOActivity.this.runOnUiThread(new Runnable() {
                public void run() {
                    mText.setText("Thanks for using FB Sample App. Bye bye...");

                }
            });

            // Dispatch on its own thread
            mHandler.post(new Runnable() {
                public void run() {
                }
            });

        }

        @Override
        public void onIOException(IOException e, Object state) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onFileNotFoundException(FileNotFoundException e,
                Object state) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onMalformedURLException(MalformedURLException e,
                Object state) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onFacebookError(FacebookError e, Object state) {
            // TODO Auto-generated method stub
            Log.v("facebook error","fb error");
        }
            }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_menu, menu);
        return true;
    }


    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        MenuItem loginItem = menu.findItem(R.id.login);

        if (mFacebook.isSessionValid()) {
            loginItem.setTitle("Logout");


        } else {
            loginItem.setTitle("Login");


        }
        loginItem.setEnabled(true);
        return super.onPrepareOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

        // Login/logout toggle
        case R.id.login:

            if (!mFacebook.isSessionValid()) {

                mFacebook.authorize(this, new DialogListener() {

                    @Override
                    public void onComplete(Bundle values) {
                        // TODO Auto-generated method stub

                        Log.v("Entered ", "No ERRRRRRRRRRRR");
                        SharedPreferences.Editor editor = mPrefs.edit();
                        editor.putString("access_token",
                                mFacebook.getAccessToken());
                        editor.putLong("access_expires",
                                mFacebook.getAccessExpires());
                        editor.commit();
                        Intent i=new Intent(FBSSOActivity.this,second.class);
                        startActivity(i);

                    }

                    @Override
                    public void onFacebookError(FacebookError e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onError(DialogError e) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onCancel() {
                        // TODO Auto-generated method stub

                    }

                });
            }else{

                mFacebook.setAccessToken(null);
                mFacebook.setAccessExpires(0);

                AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFacebook);
                 asyncRunner.logout(this.getBaseContext(), new  LogoutRequestListener());
            }

            break;


        default:
            return false;

        }
        return true;
    }

    }

I logged in to preinstalled Facebook app in my device. And I got this screen only.

And in my Logcat this line appears.

09-28 15:18:24.652: E/ActivityThread(1201): Failed to find provider info for com.facebook.katana.provider.AttributionIdProvider

If I logged out from my preinstalled Facebook app, my application prompts me to login, asking the credentials. That time also, the empty screen appears.But in the preinstalled Facebook app, I can see my updates.( I get Logged in).

Update:

Right now I'm checking the app only. I have not published it to market. I got the key by referring this site http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/. And I added it to the app, like this.

Update 2: Now I got these lines in logcat:

09-29 12:00:12.552: I/ActivityManager(73): Starting activity: Intent { cmp=com.facebook.katana/.ProxyAuth (has extras) }
09-29 12:00:13.022: I/ActivityManager(73): Displayed activity com.facebook.katana/.ProxyAuth: 436 ms (total 436 ms)
09-29 12:00:15.032: W/InputManagerService(73): Starting input on non-focused client com.android.internal.view.IInputMethodClient$Stub$Proxy@434b2e88 (uid=10031 pid=2233)
09-29 12:00:15.032: W/IInputConnectionWrapper(2233): showStatusIcon on inactive InputConnection

解决方案

This can happen due to the following reasons:

  1. You are not connected to internet
  2. You have not given permission for internet access ( Manifest.xml)
  3. You have not used a correct hashkey for the app
  4. You did not provide a correct App Id

这篇关于Facebook的SSO不是Android平台的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆