Om�wimy logowanie z u�yciem konta FB oraz umieszczanie post�w Wszystkie informacje: http://developers.facebook.com 0. Utw�rz konto deweloperskie FB i pobierz Facebook App ID zob.opis i linki w https://developers.facebook.com/docs/accountkit/android#download-facebook-sdk Uwaga! Poni�szy opis (pocz�tek) wed�ug: https://developers.facebook.com/docs/facebook-login/android <--- otworzy� t� stron� Wygodne, bo ma skrypty, kt�re generuj� kody z odpowiednimi numerami App ID Rejestracja: https://developers.facebook.com/quickstarts/?platform=android Po zatwierdzeniu nale�y klikn�� "Create App ID". Nale�y poda� nazw� (ja u�y�em "PUM") i adres e-mail Przydzielony zostanie wielocyfrowy numer (np. 1766900306675987) i pojawi si� strona, kt�ra pokazuje wszystkie API, kt�rych mo�emy u�y�. 1. Tworzymy nowy projekt o nazwie FacebookDemo (min SDK 15, Android 4.0.3, Empty Activity) 2. Przechodzimy do Gradle Scripts, build.gradle (Module: app) apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "pl.umk.fizyka.facebookdemo" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } //dodane !!!!!!!!!!!!!!!!!!!! repositories { mavenCentral() } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.facebook.android:facebook-android-sdk:[4,5)' //dodane !!!!!!!!!!!!!!!!!!!! testCompile 'junit:junit:4.12' } 3. Kompilujemy projekt (Ctrl+F9) 4. W pliku MainActivity.java dodajemy: import com.facebook.FacebookSdk; import com.facebook.appevents.AppEventsLogger; Nie powinno by� nic zaznaczonego na czerwono w tych liniach LOGOWANIE --------- 5. Przechodzimy do res/values/strings.xml i dodajemy: <string name="facebook_app_id">1766900306675987</string> <string name="fb_login_protocol_scheme">fb1766900306675987</string> <string name="zaloguj">Zaloguj u�ywaj�c konta FB</string> <string name="wyloguj">Wyloguj</string> 6. W pliku manifestu dodajemy (poza elementem application): <uses-permission android:name="android.permission.INTERNET"/> 7. Do manifestu dodajemy te� ******* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 8. Pobieramy OpenSSL: http://gnuwin32.sourceforge.net/packages/openssl.htm Pobra�em pakiet w 'zip'-ie i rozpakowa�em do c:\EXE\OpenSSL 9. Tworzenie klucza (bezpiecze�stwo autoryzacji) W katalogu c:\Program Files\Android\Android Studio\jre\bin\ uruchom 'cmd' set PATH=%PATH%;C:\EXE\OpenSSL\bin path keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64 Nale�y wprowadzi� has�o ('haslo') Otrzymamy 28-znakowy hash do developerki: Cmce+9aHdOoVtE7fS3B07tfj7Bc= Hash do release (zob. https://developers.facebook.com/docs/facebook-login/android) - wymagany przy wrzucaniu do Google Play 10. Je�eli chcemu "Single Sign On" z aplikacji, musimy ustawi� na stronie i zapisa�. 11. Dodajemy przycisk logowania przez FB do activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="pl.umk.fizyka.facebookdemo.MainActivity"> <TextView android:id="@+id/hello" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> <com.facebook.login.widget.LoginButton xmlns:facebook="http://schemas.android.com/apk/res-auto" facebook:com_facebook_login_text="@string/zaloguj" facebook:com_facebook_logout_text="@string/wyloguj" android:id="@+id/login_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> </LinearLayout> 12. Deklarujemy pola w klasie MainActivity: TextView textView; CallbackManager callbackManager; 13. W metodzie MainActivity.onCreate rejestrujemy funkcj� zwrotn�, kt�ra powiadamia o wynikach logowania package pl.umk.fizyka.facebookdemo; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.view.ActionMode; import android.widget.TextView; import com.facebook.AccessToken; import com.facebook.AccessTokenTracker; import com.facebook.CallbackManager; import com.facebook.FacebookCallback; import com.facebook.FacebookException; import com.facebook.login.LoginBehavior; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import com.facebook.login.widget.LoginButton; import org.w3c.dom.Text; public class MainActivity extends AppCompatActivity { TextView textView; CallbackManager callbackManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView)findViewById(R.id.hello); textView.setText("Niezalogowany"); callbackManager = CallbackManager.Factory.create(); LoginButton loginButton = (LoginButton)findViewById(R.id.login_button); loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { AccessToken accessToken = loginResult.getAccessToken(); String s = "Zalogowany"; s += "\nAplikacja: " + accessToken.getApplicationId(); s += "\nU�ytkownik: " + accessToken.getUserId(); //s += "\nToken: " + accessToken.getToken(); s += "\nTermin wa�no�ci: " + accessToken.getExpires().toString(); textView.setText(s); } @Override public void onCancel() { textView.setText("Logowanie anulowane"); } @Override public void onError(FacebookException error) { textView.setText("B��d logowania: " + error.getLocalizedMessage()); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); callbackManager.onActivityResult(requestCode, resultCode, data); } } 14. Przetestowa� (potrzebny dost�p do internetu z emulatora lub urz�dzenia) 15. �ledzenie zmian (w tym wylogoywanie i utrata wa�no�ci): Kod dodany w onCreate: //wylogowywanie i inne zmiany AccessTokenTracker accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) { if(currentAccessToken == null) textView.setText("Wylogowano"); } }; Uwaga! W innych metodach zawsze mo�na u�y� AccessToken accessToken = AccessToken.getCurrentAccessToken(); aby odczyta� token. 16. Porz�dki na koniec. Definiujemy metod� private String getTokenInfo(AccessToken accessToken) { String s; if(accessToken == null) { s = "Niezalogowany"; } else { s = "Zalogowany"; s += "\nAplikacja: " + accessToken.getApplicationId(); s += "\nU�ytkownik: " + accessToken.getUserId(); //s += "\nToken: " + accessToken.getToken(); s += "\nTermin wa�no�ci: " + accessToken.getExpires().toString(); } return s; } U�ywamy jej w onCreate: textView = (TextView)findViewById(R.id.hello); //textView.setText("Niezalogowany"); AccessToken accessToken = AccessToken.getCurrentAccessToken(); textView.setText(getTokenInfo(accessToken)); U�ywamy jej w onSuccess: public void onSuccess(LoginResult loginResult) { AccessToken accessToken = loginResult.getAccessToken(); textView.setText(getTokenInfo(accessToken)); } i przy �ledzeniu zmian: AccessTokenTracker accessTokenTracker = new AccessTokenTracker() { @Override protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) { getTokenInfo(currentAccessToken); } }; UDOST�PNIANIE ------------- Chodzi o umieszczanie wiadomo�ci na samym FB, do messangera jest osobne API. Uwaga! Zgodnie z polityk� FB nie mo�na w kontrolkach wstawia� �adnych domy�lnych tekst�w. Opis: https://developers.facebook.com/docs/sharing/android 1. Do manifestu (w obr�bie elementu application) dodaj <provider android:authorities="com.facebook.app.FacebookContentProvider1766900306675987" android:name="com.facebook.FacebookContentProvider" android:exported="true"/> Numer to App ID. 2. Do interfejsu (plik activity_main.xml) dodajemy okno edycyjne i przycisk: <EditText android:id="@+id/tre��Wpisu" android:layout_width="match_parent" android:layout_height="40dp" android:text="Test umieszczania tre�ci z aplikacji" android:textSize="10dp" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> <Button android:id="@+id/wy�lijWpis" android:text="Wy�lij" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> 3. Bezpo�rednie udost�pnianie (przez mechanizm udost�pniania - bez Facebook SDK): final EditText tre��Wpisu = (EditText)findViewById(R.id.tre��Wpisu); Button wy�lijWpis = (Button)findViewById(R.id.wy�lijWpis); wy�lijWpis.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //wysy�anie poprzez dialog "Udost�pnij" (bez Facebook SDK) //wymaga instalacji aplikacji Facebook Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, tre��Wpisu.getText()); //startActivity(Intent.createChooser(intent, "Udost�pnij")); } }); 4. Udost�pnianie linku przez Facebook SDK: final EditText tre��Wpisu = (EditText)findViewById(R.id.tre��Wpisu); Button wy�lijWpis = (Button)findViewById(R.id.wy�lijWpis); wy�lijWpis.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //link ShareLinkContent zawarto��Link = new ShareLinkContent.Builder() //.setContentDescription("Opis (wycofane)") //.setContentTitle("Tytu� (wycofane)") .setContentUrl(Uri.parse("http://www.fizyka.umk.pl/~jacek/dydaktyka")) .setQuote(tre��Wpisu.getText().toString()) .setShareHashtag(new ShareHashtag.Builder().setHashtag("#UMK").build()) .build(); try { ShareDialog shareDialog = new ShareDialog(MainActivity.this); shareDialog.show(zawarto��Link); //mo�na pomin�� drugi argument wybieraj�cy rodzaj okna dialogowego (domy�lny ShareDialog.Mode.AUTOMATIC) } catch(Exception exc) { Toast.makeText(getApplicationContext(), "B��d: " + exc.getLocalizedMessage(), Toast.LENGTH_LONG).show(); } } }); Poprawno�� linku i wydobywanych z niego informacji mo�na sprawdzi� na stronie: https://developers.facebook.com/tools/debug/ 5. Rejestrowanie si� do informacji zwrotnej o udost�pnieniu: final EditText tre��Wpisu = (EditText)findViewById(R.id.tre��Wpisu); Button wy�lijWpis = (Button)findViewById(R.id.wy�lijWpis); wy�lijWpis.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //link ShareLinkContent zawarto��Link = new ShareLinkContent.Builder() //.setContentDescription("Opis (wycofane)") //.setContentTitle("Tytu� (wycofane)") .setContentUrl(Uri.parse("http://www.fizyka.umk.pl/~jacek/dydaktyka")) .setQuote(tre��Wpisu.getText().toString()) .setShareHashtag(new ShareHashtag.Builder().setHashtag("#UMK").build()) .build(); try { ShareDialog shareDialog = new ShareDialog(MainActivity.this); FacebookCallback<Sharer.Result> resultFacebookCallback = new FacebookCallback<Sharer.Result>() { @Override public void onSuccess(Sharer.Result result) { textView.setText("Wys�anie posta uda�o si�"); } @Override public void onCancel() { textView.setText("Wys�anie posta zosta�o anulowane"); } @Override public void onError(FacebookException error) { textView.setText("Wys�anie posta nie powiod�o si�: " + error.getLocalizedMessage()); } }; shareDialog.registerCallback(callbackManager, resultFacebookCallback); shareDialog.show(zawarto��Link); } catch(Exception exc) { Toast.makeText(getApplicationContext(), "B��d: " + exc.getLocalizedMessage(), Toast.LENGTH_LONG).show(); } } }); 6. Publikowanie zdj�� Uwaga! Wymaga dodatkowych uprawnie� publikowania: publish_actions - bez tego b�dzie od razu nie udane publikowanie Przed logowaniem: LoginManager.getInstance().logInWithPublishPermissions( this, Arrays.asList("publish_actions")); Uwaga! Przy pierwszym logowaniu pojawi si� okno z pro�ba o potwierdzenie uprawnienia. Uzupe�nianie informacji o uprawnieniach: private String getTokenInfo(AccessToken accessToken) { String s; if(accessToken == null) { s = "Niezalogowany"; } else { s = "Zalogowany"; s += "\nAplikacja: " + accessToken.getApplicationId(); s += "\nU�ytkownik: " + accessToken.getUserId(); //s += "\nToken: " + accessToken.getToken(); s += "\nTermin wa�no�ci: " + accessToken.getExpires().toString(); s += "\nUprawnienia: "; for(String permission : accessToken.getPermissions()) { s += "\n\t" + permission; } } return s; } Mo�na teraz przygotowa� zawarto�� z obrazem: Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); SharePhoto photo = new SharePhoto.Builder() .setBitmap(bmp) .build(); SharePhotoContent zawarto��Obraz = new SharePhotoContent.Builder() .addPhoto(photo) .build(); i publikowanie: shareDialog.show(zawarto��Obraz); 7. Publikowanie z�o�onej zawarto�ci Uwaga! Wymaga zainstalowanej aplikacji Facebook //mieszanie r�nych zawarto�ci ShareContent zawarto��Z�o�ona = new ShareMediaContent.Builder() .addMedium(photo) .addMedium(photo) //mo�na dodawa� r�ne zdj�cia i wideo .build(); ... shareDialog.show(zawarto��Z�o�ona); //to wymaga zainstalowanej aplikacji Przycisk LIKE ------------- 1. Do pliku activity_main.xml dodajmy kontrolk�: <com.facebook.share.widget.LikeView android:id="@+id/likeView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> 2. Na ko�cu onCreate dodajmy LikeView likeView = (LikeView) findViewById(R.id.likeView); likeView.setLikeViewStyle(LikeView.Style.STANDARD); likeView.setAuxiliaryViewPosition(LikeView.AuxiliaryViewPosition.INLINE); likeView.setObjectIdAndType( "http://www.fizyka.umk.pl/~jacek/dydaktyka", LikeView.ObjectType.PAGE); B��dy? Zob. https://inthecheesefactory.com/blog/how-to-add-facebook-like-button-in-android-app/en Przycisk Udost�pniania ---------------------- To samo, co wcze�niej, ale gotowy przycisk z przypisan� akcj�. 1. Do pliku activity_main.xml dodajmy kontrolk�: <com.facebook.share.widget.ShareButton android:id="@+id/shareButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:layout_marginLeft="10dp" /> 2. Na ko�cu onCreate dodajmy ShareLinkContent zawarto��Link = new ShareLinkContent.Builder() //.setContentDescription("Opis (wycofane)") //.setContentTitle("Tytu� (wycofane)") .setContentUrl(Uri.parse("http://www.fizyka.umk.pl/~jacek/dydaktyka")) .setQuote(tre��Wpisu.getText().toString()) .setShareHashtag(new ShareHashtag.Builder().setHashtag("#UMK").build()) .build(); ShareButton shareButton = (ShareButton)findViewById(R.id.shareButton); shareButton.setShareContent(zawarto��Link); Zadanie: Wys�a� zdj�cie (zawarto��Obraz) u�ywaj�c SendButton przez Facebook Messenger - analogicznie do ShareButton