Reputation: 2306
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.
my code:
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());
}
});
}
}
manifest file:
<?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>
build 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'
}
hash key generation code:
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) {
}
Upvotes: 1
Views: 737
Reputation: 2306
It is working.
LoginActivity:
public static CallbackManager callbackmanager;
Button fb_login;
private boolean fb_signincllicked = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_login);
//write this method in facebook button onclick:
}
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) {
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) {
// handle error
} else {
try {
if (deniedPermissions.contains("email")) {
LoginManager.getInstance().logInWithReadPermissions(Login_Activity.this, Arrays.asList("email"));
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("full_name", json.getString("name"));
Toast.makeText(getApplicationContext(),json.get("id").toString() +json.getString("name"), Toast.LENGTH_LONG).show();
jsonObject.put("device_id", Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID));
jsonObject.put("fb_id", json.getString("id"));
jsonObject.put("signuptype", "1");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}).executeAsync();
}
@Override
public void onCancel() {
Log.d("Cancel", "On cancel");
}
@Override
public void onError(FacebookException error) {
Log.d("Error", error.toString());
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (fb_signincllicked) {
callbackmanager.onActivityResult(requestCode, resultCode, data);
}
}
Add Dependence:
dependencies {
compile 'com.facebook.android:facebook-android-sdk:4.5.0'
}
strings.xml:
add your fb id in your strings file. Don't add directly in your manifest file. It gives you error.
<string name="fb_appid">xxxxxxxx</string>
Manifest_fie:
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/fb_appid" />
<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" />
To Get Hash-Key:
try {
PackageInfo info = getPackageManager().getPackageInfo(
"your 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 (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
add your package name above.
run this code in debug mode then you will get developement key hash in log and run this code in release mode you will get release hashkey.Add both these keys, package name and class name in developer site.
Upvotes: 1
Reputation: 6967
I am using Facebook helper class for login.
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
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);
}
}
Create and Implement interface
public interface IFbCallback<G, R> {
public void onFbRequestComplete(G graphUser, R response);
}
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'
}
Upvotes: 2
Reputation: 6967
I can see you are generating wrong hash key for Facebook. You must use your package name which is "com.al.name" instead of Facebook "com.facebook.samples.loginhowto".
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.al.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) {
}
Upvotes: 1