Статьи

Интеграция API Графика Facebook в Android

В этом уроке я покажу, как отправлять запросы и получать данные из Facebook с помощью Graph API.
Вы можете найти проект на Github

Чтобы выполнить запросы к API Graph, пользователь должен войти в систему с помощью SDK Facebook для Android.

Вы можете найти статью об интеграции входа в Facebook здесь

Создать проект и настроить SDK

Убедитесь, что у вас установлена ​​последняя версия Android Studio. Я использую версию 2.2.3
Откройте Android Studio и создайте новый проект , назвав его по своему желанию. Нажмите Далее, выберите Минимальный уровень API 17 и снова нажмите Далее . Выберите « Пустое действие» в качестве первого действия, назовите его « LoginActivity» и нажмите « Готово» .

Далее мы добавляем еще одно пустое действие в проект. Щелкните правой кнопкой мыши по пакету и выберите New -> Activity -> Blank Activity . Оставьте его имя по умолчанию и нажмите Готово .

Откройте build.gradle (Project) и добавьте mavenCentral() в оба раздела репозитория. Затем откройте build.gradle (Module) и добавьте библиотеку SDK, добавив эту строку в зависимости:

  compile 'com.facebook.android:facebook-android-sdk:4.18.0' 

Откройте strings.xml и добавьте эту строку

 <string name="facebook_app_id">{Your App ID here}</string> 

Убедитесь, что вы дали Интернет- разрешение для вашего приложения, добавив:

 <uses-permission android:name="android.permission.INTERNET" /> 

в вашем файле AndroidManifest.xml .
В том же файле внутри тегов <application></application> добавьте:

 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" /> <activity android:name="com.facebook.FacebookActivity" android:label="@string/app_name" android:screenOrientation="portrait" /> 

Происходит вход в систему

Добавьте кнопку входа в Facebook внутри макета activity_login.xml :

 <com.facebook.login.widget.LoginButton android:id="@+id/login_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center" android:layout_margin="4dp" android:paddingTop="12dp" android:paddingBottom="12dp"/> 

Это единственный виджет, отображаемый в LoginActivity .

Откройте класс LoginActivity . Сначала нам нужно инициализировать SDK Facebook , добавив:

 FacebookSdk.sdkInitialize(this); 

перед setContentView() .

Инициализируйте эти переменные перед onCreate() :

 private CallbackManager callbackManager; private AccessTokenTracker accessTokenTracker; private ProfileTracker profileTracker; private LoginButton loginButton; private String firstName,lastName, email,birthday,gender; private URL profilePicture; private String userId; private String TAG = "LoginActivity"; 

После setContentView() добавьте следующие строки:

 callbackManager = CallbackManager.Factory.create(); 

Здесь мы создаем callbackManager который будет зарегистрирован на нашей кнопке входа в Facebook .
Экземпляр кнопки входа будет создан путем добавления:

 loginButton = (LoginButton) findViewById(R.id.login_button); loginButton.setHeight(100); loginButton.setTextColor(Color.WHITE); loginButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); loginButton.setCompoundDrawablePadding(0); 

Теперь пришло время создать Login Result Callback . Этот обратный вызов будет прикреплен к кнопке входа в систему вместе с callbackManager мы создали ранее.

Код обратного вызова в результате входа в систему, как показано ниже:

 FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { Log.e(TAG,object.toString()); Log.e(TAG,response.toString()); try { userId = object.getString("id"); profilePicture = new URL("https://graph.facebook.com/" + userId + "/picture?width=500&height=500"); if(object.has("first_name")) firstName = object.getString("first_name"); if(object.has("last_name")) lastName = object.getString("last_name"); if (object.has("email")) email = object.getString("email"); if (object.has("birthday")) birthday = object.getString("birthday"); if (object.has("gender")) gender = object.getString("gender"); Intent main = new Intent(LoginActivity.this,MainActivity.class); main.putExtra("name",firstName); main.putExtra("surname",lastName); main.putExtra("imageUrl",profilePicture.toString()); startActivity(main); finish(); } catch (JSONException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } } }); //Here we put the requested fields to be returned from the JSONObject Bundle parameters = new Bundle(); parameters.putString("fields", "id, first_name, last_name, email, birthday, gender"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { } @Override public void onError(FacebookException e) { e.printStackTrace(); } }; 

Этот обратный вызов имеет три метода переопределения : onSuccess() , onCancel() и onError . Каждый раз, когда пользователь входит в систему, будет вызываться только один из методов.
Внутри onSuccess() будет создан новый GraphRequest . Этот запрос будет принимать два аргумента: токен доступа к результату входа в систему (loginResult.getAccessToken ()) и новый GraphRequest с JSONObjectCallback .
Если запрос выполнен успешно, будет запущено новое действие

Ответ GraphRequest будет иметь тип JSONObject и будет содержать обязательные поля.
Перед закрывающим тегом метода onCreate() нам нужно добавить loginButton read permissions .

 loginButton.setReadPermissions("email", "user_birthday","user_posts"); loginButton.registerCallback(callbackManager, callback); 

Login Permissions Dialog
Последний метод класса LoginActivity :

 @Override protected void onActivityResult(int requestCode, int responseCode, Intent intent) { super.onActivityResult(requestCode, responseCode, intent); callbackManager.onActivityResult(requestCode, responseCode, intent); } 

Получение и обмен данными в Facebook

Get and Share Data
После того, как пользователь вошел в систему, будет запущено new Intent . Следующее действие — MainActivity класс MainActivity .
Убедитесь, что ваш public class MainActivty implements View.OnClickListener .
xml код его макета:

  <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:text="Hello:" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="20dp" android:layout_gravity="center_horizontal"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/nameAndSurname" android:textSize="22dp" android:textStyle="bold" android:layout_marginTop="10dp" android:layout_gravity="center_horizontal"/> <ImageView android:layout_width="200dp" android:layout_height="200dp" android:id="@+id/profileImage" android:layout_marginTop="10dp" android:layout_gravity="center_horizontal"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/share" android:layout_gravity="center_horizontal" android:onClick="onClick" android:text="Share Content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/getPosts" android:layout_gravity="center_horizontal" android:onClick="onClick" android:text="Posts"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:onClick="onClick" android:text="Logout" android:id="@+id/logout"/> </LinearLayout> из  <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:text="Hello:" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:textSize="20dp" android:layout_gravity="center_horizontal"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/nameAndSurname" android:textSize="22dp" android:textStyle="bold" android:layout_marginTop="10dp" android:layout_gravity="center_horizontal"/> <ImageView android:layout_width="200dp" android:layout_height="200dp" android:id="@+id/profileImage" android:layout_marginTop="10dp" android:layout_gravity="center_horizontal"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/share" android:layout_gravity="center_horizontal" android:onClick="onClick" android:text="Share Content" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/getPosts" android:layout_gravity="center_horizontal" android:onClick="onClick" android:text="Posts"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:onClick="onClick" android:text="Logout" android:id="@+id/logout"/> </LinearLayout> 

Откройте класс MainActivity и перед `onCreate () ‘добавьте следующие строки:

 private ShareDialog shareDialog; private String name, surname, imageUrl; private String TAG = "MainActivity"; 

Первое, что нужно сделать после того, как действие создано, — это извлечь дополнительные намерения из предыдущего действия.

 Bundle inBundle = getIntent().getExtras(); name = inBundle.getString("name"); surname = inBundle.getString("surname"); imageUrl = inBundle.getString("imageUrl"); 

Мы можем использовать переменные name и surname для отображения информации о пользователе, используя:

 TextView nameView = (TextView)findViewById(R.id.nameAndSurname); nameView.setText("" + name + " " + surname); 

Поскольку наш класс MainActivity реализует View.OnClickListener нам необходимо @Override метод @Override onClick(View view) :

 @Override public void onClick(View view) { switch (view.getId()){ case R.id.share: share(); break; case R.id.getPosts: getPosts(); break; case R.id.logout: logout(); break; } } 

Это метод share() :

 private void share(){ shareDialog = new ShareDialog(this); List<String> taggedUserIds= new ArrayList<String>(); taggedUserIds.add("{USER_ID}"); taggedUserIds.add("{USER_ID}"); taggedUserIds.add("{USER_ID}"); ShareLinkContent content = new ShareLinkContent.Builder() .setContentUrl(Uri.parse("http://www.sitepoint.com")) .setContentTitle("This is a content title") .setContentDescription("This is a description") .setShareHashtag(new ShareHashtag.Builder().setHashtag("#sitepoint").build()) .setPeopleIds(taggedUserIds) .setPlaceId("{PLACE_ID}") .build(); shareDialog.show(content); } 

Метод выше разделяет содержание ссылки . Вы можете использовать похожие методы, такие как SharePhotoContent , ShareVideoContent , ShareFeedContent , ShareMediaContent и т. Д. Содержимое всегда должно отображаться внутри ShareDialog .

Для того, чтобы получать сообщения о временной шкале пользователя, нам нужно сделать GraphRequest :

 private void getPosts(){ new GraphRequest( AccessToken.getCurrentAccessToken(), "/me/posts", null, HttpMethod.GET, new GraphRequest.Callback() { public void onCompleted(GraphResponse response) { Log.e(TAG,response.toString()); } } ).executeAsync(); } 

В этом случае сообщения пользователя — это единственные данные, которые мы можем получить из профиля, потому что это единственный запрос на разрешение при входе в систему:

loginButton.setReadPermissions («электронная почта», «user_birthday», «user_posts»);

Вы можете увидеть разрешения ниже:
Graph API Permissions

или вы можете попробовать Graph API Explorer для лучшего понимания, как он работает.

Метод logout() :

 private void logout(){ LoginManager.getInstance().logOut(); Intent login = new Intent(MainActivity.this, LoginActivity.class); startActivity(login); finish(); } 

Вывод

API Graph Facebook гораздо шире. Это было простое использование, чтобы показать, как это реализовано в Android.
Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать по комментариям ниже.