Saturday, 14 December 2013

Facebook Integration in Android

Do you know How to integrate facebook into your android application?
First download the facebook sdk from above link and import into your workspace

Create your application and follow these:


manifest.xml
---------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="you package name"
    android:versionCode="1"
    android:versionName="1.0">
   
    <application android:icon="@drawable/icon" android:label="@string/app_name">
   
        <activity android:name=".TestConnect"
                  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=".TestPost"
                  android:label="@string/app_name">
             <intent-filter>
                <action android:name="android.intent.action.VIEW"/>       
            </intent-filter>
        </activity>
     
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-sdk android:minSdkVersion="8" />
  
</manifest>


res/layout/main.xml
----------------------
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp">

      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="13sp"
        android:textColor="#fff"
        android:text="This example shows how to connect to Facebook, display authorization dialog and save user's token and username"/>
       
    <CheckBox
        android:id="@+id/cb_facebook"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:text="  Facebook (Not connected) "
        android:textSize="14sp"
        android:textStyle="bold"
        android:textColor="#ccc"
        android:clickable="true"
        android:focusable="true"
        android:button="@drawable/btn_check_facebook"/>
   
    <Button
        android:id="@+id/button1"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=" Test Post" />

</LinearLayout>

res/layout/post.xml
---------------------
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:textSize="13sp"
        android:textColor="#fff"
        android:text="This example shows how to post Facebook status"/>
       
    <EditText
        android:id="@+id/revieew"
        android:layout_marginTop="15dp"
        android:layout_width="250dp"
        android:layout_height="100dp"
        android:hint="Write your review"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:textSize="13sp"
        android:textColor="#fff"
        android:text="Also share to:"/>
       
    <CheckBox
        android:id="@+id/cb_facebook"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="5dp"
        android:text="  Facebook"
        android:textSize="14sp"
        android:clickable="true"
        android:focusable="true"
        android:button="@drawable/btn_check_facebook"/>

    <Button
        android:id="@+id/button1"
        android:layout_marginTop="15dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="    Submit    "/>
</LinearLayout>

TestConnection.java
----------------------
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DownloadManager.Request;
import android.app.ProgressDialog;

import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Color;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

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

public class TestConnect extends Activity {
    private Facebook mFacebook;
    private CheckBox mFacebookBtn;
    private ProgressDialog mProgress;
   
    private static final String[] PERMISSIONS = new String[] {"publish_stream", "read_stream", "offline_access"};
   
    private static final String APP_ID = "your facebook app id from fecebook developers";
    protected static final String TOKEN = null;
    private BaseAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        setContentView(R.layout.main);
        generateFBKeyHash();
        mFacebookBtn    = (CheckBox) findViewById(R.id.cb_facebook);
       
        mProgress        = new ProgressDialog(this);
        mFacebook        = new Facebook(APP_ID);
       
        SessionStore.restore(mFacebook, this);
       
        if (mFacebook.isSessionValid()) {
            mFacebookBtn.setChecked(true);
           
            String name = SessionStore.getName(this);
            name        = (name.equals("")) ? "Unknown" : name;
           
            mFacebookBtn.setText("  Facebook (" + name + ")");
            mFacebookBtn.setTextColor(Color.WHITE);
        }
       
        mFacebookBtn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                onFacebookClick();
            }
        });
       
        ((Button) findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                getFriendList();
            
                   
                startActivity(new Intent(TestConnect.this, TestPost.class));
            }
        });
    }
   
    private void onFacebookClick() {
        if (mFacebook.isSessionValid()) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
           
            builder.setMessage("Delete current Facebook connection?")
                   .setCancelable(false)
                   .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                           fbLogout();
                       }
                   })
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                           
                            mFacebookBtn.setChecked(true);
                       }
                   });
           
            final AlertDialog alert = builder.create();
           
            alert.show();
        } else {
            mFacebookBtn.setChecked(false);
           
            mFacebook.authorize(this, PERMISSIONS, -1, new FbLoginDialogListener());
        }
    }
   
    private final class FbLoginDialogListener implements DialogListener {
        public void onComplete(Bundle values) {
            SessionStore.save(mFacebook, TestConnect.this);
          
            mFacebookBtn.setText("  Facebook (No Name)");
            mFacebookBtn.setChecked(true);
            mFacebookBtn.setTextColor(Color.WHITE);
           
            getFbName();
        }

        public void onFacebookError(FacebookError error) {
           Toast.makeText(TestConnect.this, "Facebook connection failed", Toast.LENGTH_SHORT).show();
          
           mFacebookBtn.setChecked(false);
        }
       
        public void onError(DialogError error) {
            Toast.makeText(TestConnect.this, "Facebook connection failed", Toast.LENGTH_SHORT).show();
           
            mFacebookBtn.setChecked(false);
        }

        public void onCancel() {
            mFacebookBtn.setChecked(false);
        }
    }
   
    private void getFbName() {
        mProgress.setMessage("Finalizing ...");
        mProgress.show();
       
        new Thread() {
            @Override
            public void run() {
                String name = "";
                int what = 1;
               
                try {
                    String me = mFacebook.request("me");
                   
                    JSONObject jsonObj = (JSONObject) new JSONTokener(me).nextValue();
                    name = jsonObj.getString("name");
                    what = 0;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
               
                mFbHandler.sendMessage(mFbHandler.obtainMessage(what, name));
            }
        }.start();
    }
   
    private void fbLogout() {
        mProgress.setMessage("Disconnecting from Facebook");
        mProgress.show();
           
        new Thread() {
            @Override
            public void run() {
                SessionStore.clear(TestConnect.this);
                      
                int what = 1;
                   
                try {
                    mFacebook.logout(TestConnect.this);
                       
                    what = 0;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                   
                mHandler.sendMessage(mHandler.obtainMessage(what));
            }
        }.start();
    }
   
    private Handler mFbHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mProgress.dismiss();
           
            if (msg.what == 0) {
                String username = (String) msg.obj;
                username = (username.equals("")) ? "No Name" : username;
                   
                SessionStore.saveName(username, TestConnect.this);
               
                mFacebookBtn.setText("  Facebook (" + username + ")");
                
                Toast.makeText(TestConnect.this, "Connected to Facebook as " + username, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(TestConnect.this, "Connected to Facebook", Toast.LENGTH_SHORT).show();
            }
        }
    };
   
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mProgress.dismiss();
           
            if (msg.what == 1) {
                Toast.makeText(TestConnect.this, "Facebook logout failed", Toast.LENGTH_SHORT).show();
            } else {
                mFacebookBtn.setChecked(false);
                mFacebookBtn.setText("  Facebook (Not connected)");
                mFacebookBtn.setTextColor(Color.GRAY);
                  
                Toast.makeText(TestConnect.this, "Disconnected from Facebook", Toast.LENGTH_SHORT).show();
            }
        }
    };
    public void generateFBKeyHash()
    {
     try
     {
      PackageInfo info = getPackageManager().getPackageInfo("com.mobulous.desicomicsreader", PackageManager.GET_SIGNATURES);
      for (Signature signature : info.signatures)
      {
       MessageDigest md = MessageDigest.getInstance("SHA");
       md.update(signature.toByteArray());
//       String key =  Base64.encodeToString(md.digest(), Base64.DEFAULT);
       Log.e("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
//       userNameEditText.setText(key);
      }
     } catch (NameNotFoundException e) {

     } catch (NoSuchAlgorithmException e) {

     }
    }
    private void getFriendList()
    {       
        Bundle params = new Bundle();
       
       
        params.putString("method", "fql.query");
        params.putString("query", "SELECT name,uid,pic_square FROM user WHERE uid IN ( SELECT uid2 FROM friend WHERE uid1=me() )");
       
       
        AsyncFacebookRunner runner = new AsyncFacebookRunner(this.mFacebook);   
       
        runner.request(params, new RequestListener(){
            public void onComplete(String response) {
                // TODO Auto-generated method stub
                try {
                    JSONObject json = Util.parseJson(response);
                   
                    JSONArray array = json.getJSONArray("data");
                    System.out.println(array.length());
                    for(int i=0;i<array.length();i++){

                        JSONObject friend = array.getJSONObject(i);

                        Log.d("uid",friend.getString("uid"));
                        Log.d("name", friend.getString("name"));
                        Log.d("pic_square",friend.getString("pic_square"+"\n"));            
                    }
                    //System.out.println(json.toString());
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (FacebookError e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
               
            }

            public void onIOException(IOException e) {
                // TODO Auto-generated method stub
               
            }

            public void onFileNotFoundException(FileNotFoundException e) {
                // TODO Auto-generated method stub
               
            }

            public void onMalformedURLException(MalformedURLException e) {
                // TODO Auto-generated method stub
               
            }

            public void onFacebookError(FacebookError e) {
                // TODO Auto-generated method stub
               
            }
        });
    }
}



TestPost.java
----------------

import android.os.Bundle;
import android.os.Handler;

import android.app.Activity;
import android.app.ProgressDialog;

import android.view.View;
import android.view.View.OnClickListener;

import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.BaseRequestListener;
import com.facebook.android.Facebook;
import com.facebook.android.SessionStore;


public class TestPost extends Activity{
    private Facebook mFacebook;
    private CheckBox mFacebookCb;
    private ProgressDialog mProgress;
   
    private Handler mRunOnUi = new Handler();
   
    private static final String APP_ID = "your facebook app id from fecebook developers";
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        setContentView(R.layout.post);
       
        final EditText reviewEdit = (EditText) findViewById(R.id.revieew);
        mFacebookCb                  = (CheckBox) findViewById(R.id.cb_facebook);
       
        mProgress    = new ProgressDialog(this);
       
        mFacebook     = new Facebook(APP_ID);
       
        SessionStore.restore(mFacebook, this);

        if (mFacebook.isSessionValid()) {
            mFacebookCb.setChecked(true);
               
            String name = SessionStore.getName(this);
            name        = (name.equals("")) ? "Unknown" : name;
               
            mFacebookCb.setText("  Facebook  (" + name + ")");
        }
       
        ((Button) findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                String review = reviewEdit.getText().toString();
               
                if (review.equals("")) return;
           
                if (mFacebookCb.isChecked()) postToFacebook(review);
            }
        });
    }
   
    private void postToFacebook(String review) {   
        mProgress.setMessage("Posting ...");
        mProgress.show();
       
        AsyncFacebookRunner mAsyncFbRunner = new AsyncFacebookRunner(mFacebook);
       
        Bundle params = new Bundle();
           
        params.putString("message", review);
        //params.putString("name", "Dexter");
        //params.putString("caption", "londatiga.net");
        //params.putString("link", "http://www.londatiga.net");
        //params.putString("description", "Dexter, seven years old dachshund who loves to catch cats, eat carrot and krupuk");
        //params.putString("picture", "http://twitpic.com/show/thumb/6hqd44");
       
        mAsyncFbRunner.request("me/feed", params, "POST", new WallPostListener());
    }

    private final class WallPostListener extends BaseRequestListener {
        public void onComplete(final String response) {
            mRunOnUi.post(new Runnable() {
                @Override
                public void run() {
                    mProgress.cancel();
                   
                    Toast.makeText(TestPost.this, "Posted to Facebook", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
}


res/drawable/btn_check_facebook.xml
-----------------------------------------

<?xml version="1.0" encoding="UTF-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_checked="true"
        android:state_window_focused="true"
         android:state_enabled="true"
         android:drawable="@drawable/ic_facebook_on" />

     <item
        android:state_checked="true"
        android:state_window_focused="false"
         android:state_enabled="true"
         android:drawable="@drawable/ic_facebook_on" />
        
    <item
        android:state_checked="false"
        android:state_window_focused="true"
         android:state_enabled="true"
         android:drawable="@drawable/ic_facebook_off" />
        
     <item
         android:drawable="@drawable/ic_facebook_off" />
</selector>

1 comment:

  1. nice post..... very useful code for me ....Thank u so much mouli garu

    ReplyDelete