本文介绍了facebook 与 android studio 中最新的 Facebook Sdk 集成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在将 facebook 集成到 android 中.我用谷歌搜索并研究它.但是我不知道为什么当我的手机中已经有 Facebook 应用程序时它不起作用.当我的手机中没有 facebook 应用程序时,它正在打开 facebook 的登录页面.
I am working on facebook integration in android. I googled and working on it. But i don't know why it is not working when i already have facebook app in my mobile.It is opening login page of facebook when i don't have facebook app in my mobile.
我的代码:
MainActivity:
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Base64;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.provider.Settings;
import android.util.Log;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.common.Scopes;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.common.api.Scope;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;
import org.json.JSONException;
import org.json.JSONObject;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.Set;
public class MainActivity extends ActionBarActivity {
Button fb_login;
public static CallbackManager callbackmanager;
//Signup signup_task = null;
private boolean fb_signincllicked = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FacebookSdk.sdkInitialize(getApplicationContext());
fb_login = (Button) findViewById(R.id.fb_login);
fb_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
onFblogin(true);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void onFblogin(boolean fb_btn) {
fb_signincllicked = fb_btn;
callbackmanager = CallbackManager.Factory.create();
// Set permissions
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email"));
LoginManager.getInstance().registerCallback(callbackmanager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.v("TAG_JSONOBJECT2", "" + "jsonObject");
final Set<String> deniedPermissions = loginResult.getRecentlyDeniedPermissions();
GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject json, GraphResponse response) {
if (response.getError() != null) {
} else {
try {
if (deniedPermissions.contains("email")) {
LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("email"));
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("full_name", json.getString("name"));
jsonObject.put("device_id", Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID));
jsonObject.put("fb_id", json.getString("id"));
jsonObject.put("signuptype", "1");
/* signup_task = new Signup(MainActivity.this);
if (signup_task.getStatus() != AsyncTask.Status.RUNNING) {
signup_task.execute(jsonObject.toString());
signup_task.signupcompleted = MainActivity.this;
}*/
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}).executeAsync();
}
@Override
public void onCancel() {
Log.v("TAG_JSONOBJECTCANCEL", "" + "jsonObject");
Log.d("Cancel", "On cancel");
}
@Override
public void onError(FacebookException error) {
Log.d("Error", error.toString());
}
});
}
}
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.al.name">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/fb_appid" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.al.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.facebook.FacebookActivity"
android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
</application>
</manifest>
构建gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
repositories {
mavenCentral()
}
defaultConfig {
applicationId "com.al.name"
minSdkVersion 10
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.google.android.gms:play-services:7.3.0'
compile 'com.facebook.android:facebook-android-sdk:4.5.0'
}
哈希键生成代码:
try {
PackageInfo info = getPackageManager().getPackageInfo(
"package name",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
推荐答案
我正在使用 Facebook 帮助程序类进行登录.
I am using Facebook helper class for login.
FacebookHelper.java
FacebookHelper.java
public class FacebookHelper {
private static final String TAG = "FbHelper";
private Activity activity;
private StatusCallback statusCallback = new SessionStatusCallback();
public FacebookHelper(){
}
public FacebookHelper(Activity activity){
this.activity = activity;
}
public FacebookHelper(Activity activity, Bundle savedInstanceState){
this.activity = activity;
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if (session == null || session.getState().isClosed()) {
if (savedInstanceState != null) {
session = Session.restoreSession(activity, null,
statusCallback, savedInstanceState);
}
//if (session == null) {
session = new Session(activity);
//}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(activity)
.setCallback(statusCallback));
}
}
}
public Session.StatusCallback getStatusCallback() {
return statusCallback;
}
public void loginToFacebook() {
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(activity)
.setPermissions(Arrays.asList("email"/*,"user_birthday"*/,"user_location"))
.setCallback(statusCallback));
} else {
Session.openActiveSession(activity, true, statusCallback);
}
}
public void logoutFromFacebook() {
Session session = Session.getActiveSession();
if (session != null) {
session.closeAndClearTokenInformation();
}
}
public boolean isLoggedInFromFb() {
Session session = Session.getActiveSession();
if (session != null && session.isOpened()) {
return true;
} else {
return false;
}
}
public void appRequest(final Activity activity, final String id){
Session.openActiveSession(activity, true, new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Bundle params = new Bundle();
params.putString("to", id);
params.putString("message", "EGrocery Invite");
WebDialog requestsDialog = (
new WebDialog.RequestsDialogBuilder(activity,
Session.getActiveSession(),
params))
.setOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(Bundle values,
FacebookException error) {
// TODO Auto-generated method stub
if (error != null) {
if (error instanceof FacebookOperationCanceledException) {
//Toast.makeText(activity, R.string.txt_invitation_cancel,
// Toast.LENGTH_SHORT).show();
} else {
// Toast.makeText(activity, R.string.txt_invitation_cancel,
// Toast.LENGTH_SHORT).show();
}
} else {
final String requestId = values.getString("request");
if (requestId != null) {
Toast.makeText(activity, "Invited Successfully",
Toast.LENGTH_SHORT).show();
} else {
// Toast.makeText(activity, R.string.txt_invitation_cancel,
// Toast.LENGTH_SHORT).show();
}
}
}
})
.build();
requestsDialog.show();
// BELOW 3 LINES ADDED BY SHAHZEB KHOWAJA.
/*if(!requestsDialog.isShowing()) {
requestsDialog.show();
}*/
}
}
});
}
public void postOnWall(final Activity activity, final String name, final String caption, final String description,
final String link, final String picture) {
Session.openActiveSession(activity, true, new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
// TODO Auto-generated method stub
if (session.isOpened()) {
Bundle params = new Bundle();
params.putString("name", name);
params.putString("caption", caption); //"DrawWithFriends"
params.putString("description", description); //pa.getUserProfile().getFullName() + " has shared the word " + challengeQuestions.get(current_num_question).getQuestion().getWord() + " with you in prepsta"
params.putString("link", link);
params.putString("picture", picture);
WebDialog feedDialog = (
new WebDialog.FeedDialogBuilder(activity,
Session.getActiveSession(),
params))
.setOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(Bundle values,
FacebookException error) {
if (error == null) {
// When the story is posted, echo the success
// and the post Id.
final String postId = values.getString("post_id");
if (postId != null) {
/*Toast.makeText(ChallengeModeActivity.this,
"Posted story, id: "+postId,
Toast.LENGTH_SHORT).show();*/
Toast.makeText(activity, "Posted successfully",
Toast.LENGTH_SHORT).show();
} else {
// User clicked the Cancel button
//Toast.makeText(activity, R.string.txt_post_cancel,
// Toast.LENGTH_SHORT).show();
}
} else if (error instanceof FacebookOperationCanceledException) {
// User clicked the "x" button
//Toast.makeText(activity, R.string.txt_post_cancel,
// Toast.LENGTH_SHORT).show();
} else {
// Generic, ex: network error
//Toast.makeText(activity, R.string.txt_post_cancel,
// Toast.LENGTH_SHORT).show();
}
}
})
.build();
feedDialog.show();
}
}
});
}
public void getFacebookFriends(final Activity activity) {
Session.openActiveSession(activity, true, new StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Utils.Log(Constants.LOG_I, TAG, "Facebook Session Opened");
Request friendRequest = Request.newMyFriendsRequest(session, new Request.GraphUserListCallback() {
@SuppressWarnings("unchecked")
@Override
public void onCompleted(List<GraphUser> users, Response response) {
// TODO Auto-generated method stub
if (response.getError() != null) {
Utils.Log(Constants.LOG_I,
TAG, String.format("Error making request: %s", response.getError()));
} else {
Utils.Log(Constants.LOG_D, Constants.TAG, "fb friends: " + response.toString());
((IFbCallback<List<GraphUser>, Response>)activity).onFbRequestComplete(users, response);
}
}
});
/*Bundle params = new Bundle();
params.putString("fields", "id,name,picture");
friendRequest.setParameters(params);*/
friendRequest.executeAsync();
}
}
});
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if(session.isOpened()){
Utils.Log(Constants.LOG_I, TAG, "Facebook Session Opened");
Request.newMeRequest(session, new Request.GraphUserCallback() {
@SuppressWarnings("unchecked")
@Override
public void onCompleted(GraphUser user, Response response) {
// TODO Auto-generated method stub
if (response.getError() != null) {
Utils.Log(Constants.LOG_I,
TAG, String.format("Error making request: %s", response.getError()));
} else {
((IFbCallback<GraphUser, Response>)activity).onFbRequestComplete(user, response);
}
}
}).executeAsync();
}
}
}
}
MainActivity.java
MainActivity.java
public class LoginActivity extends Activity implements OnClickListener, IFbCallback<GraphUser, Response>{
private FacebookHelper fbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
fbHelper = new FacebookHelper(this, savedInstanceState);
initControls();
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Session.getActiveSession().addCallback(fbHelper.getStatusCallback());
//googleHelper.getGoogleApiClient().connect();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
Session.getActiveSession().removeCallback(fbHelper.getStatusCallback());
}
private void initControls() {
Button fbSignInBtn = (Button) findViewById(R.id.login_fb_sign_in_btn);
//listener
fbSignInBtn.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_fb_sign_in_btn:
fbHelper.loginToFacebook();
break;
}
}
@Override
public void onFbRequestComplete(GraphUser graphUser, Response response) {
Utils.Log(Constants.LOG_E, Constants.TAG, response.toString());
// store values locally
String uid = graphUser.getId();
String first_name = graphUser.getFirstName();
String last_name = graphUser.getLastName();
String email = "";
if (response.toString().contains("email")) {
email = graphUser.getProperty("email").toString();
}
Log.e("MainActivity", "id: " + uid);
Log.e("MainActivity", "first name: " + first_name);
Log.e("MainActivity", "last name: " + last_name);
Log.e("MainActivity", "email: " + email);
}
}
创建和实现接口
public interface IFbCallback<G, R> {
public void onFbRequestComplete(G graphUser, R response);
}
添加 build.gradle 文件
Add build.gradle file
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "23.0.0 rc3"
defaultConfig {
applicationId "com.dvmfashion"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.facebook.android:facebook-android-sdk:3.19.0'
}
这篇关于facebook 与 android studio 中最新的 Facebook Sdk 集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!