Facebook的SSO不是Android平台 [英] Facebook SSO not working in 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
这可能发生由于以下原因:
- 您没有连接互联网
- 您还没有给出上网(的Manifest.xml)权限
- 您没有使用正确的hashkey为应用程序
- 您没有提供正确的应用程序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:
- You are not connected to internet
- You have not given permission for internet access ( Manifest.xml)
- You have not used a correct hashkey for the app
- You did not provide a correct App Id
这篇关于Facebook的SSO不是Android平台的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!