Android/Java - Опубликовать простой текст на стене Facebook?
Я пытаюсь интегрировать проводку на одну стену из своего приложения. У меня уже есть область, где пользователь может сохранить свое имя пользователя и пароль (зашифровано). Я хотел бы, чтобы моя программа вспомнила сохраненное имя пользователя и пароль, передала это в Facebook для аутентификации, а затем разрешила приложению публиковать простой текст (возможно, ссылку) на стену пользователя.
Тем не менее, я прочитал все на страницах разработчиков в Facebook (api выглядит совершенно чуждо мне... Я никогда не делал какой-либо разработки веб-приложений до того, как... просто настольные приложения) и экспериментировал с библиотеками Java здесь, но, честно говоря, я не понимаю ни одной из различных реализаций. Некоторые утверждают, что они просты в использовании, но, судя по всему, они все выше меня.
Я даже пытался возиться с официальным Android Android SDK, но это использует интерфейс веб-просмотра, и я не могу передать имя пользователя и пароль для простой аутентификации. Кроме того, я до сих пор не знаю, как отправлять сообщения на стену даже после правильной проверки подлинности.
Пожалуйста, помогите.
Спасибо.
О, кстати, у меня уже есть ключ API Facebook и идентификатор приложения.
[ОБНОВЛЕНИЕ 1]
Для дальнейшего уточнения:
Если я использую следующий фрагмент кода с официальным Android Android SDK http://github.com/facebook/facebook-android-sdk, что мне делать дальше (после входа пользователя в систему)? Это мне непонятно.
Facebook facebookClient = new Facebook();
facebookClient.authorize(this, "[APP ID]", new String[] {"publish_stream", "read_stream", "offline_access"}, this);
где "this" - это действие, которое реализует DialogListener, и "[APP ID]" - это мой идентификатор приложения Facebook.
Спасибо.
[ОБНОВЛЕНИЕ 2]
Я нашел решение (см. ниже), хотя единственное, чего не хватает, это возможность автоматического заполнения текстовых полей входа с данными, которые я сохранил в приложении. Официальный Facebook Android SDK не может этого допускать. Я буду продолжать изучать его.
Ответы
Ответ 1
Я понял, с Томом помогите (спасибо). Ключом было создание диалога с вызовом API "stream.publish" с помощью Android Android SDK. Вот шаги:
- Загрузите официальный Android Android SDK: http://github.com/facebook/facebook-android-sdk
- Импортировать файлы проекта в Eclipse.
-
Экспортируйте проект как файл *.jar. (это может вызвать конфликт)
[ОБНОВЛЕНИЕ]
Facebook недавно обновил исходный код, и я заметил, что файл значка вызвал конфликты ресурсов с моими проектами (Android 1.5+). Мое решение - забыть об экспорте в качестве банки. Вместо этого скопируйте папку "com" Facebook прямо в папку "src" вашего приложения (т.е. "Com.facebook.android" должен быть пакетом в вашем приложении... прямо рядом с вашими исходными файлами). Если у вас уже есть папка "com" в папке "src" , не беспокойтесь о каких-либо диалоговых окнах, связанных с перезаписыванием файлов, ни один из ваших исходных файлов не должен быть перезаписан. Вернитесь в Eclipse и обновите папку "src" и "com.facebook.android" теперь должны быть перечислены как пакет. Скопируйте один из включенных значков Facebook в папку "drawable" вашего приложения и обновите это. Eclipse будет жаловаться на файл "FbDialog.java"... просто добавьте импорт, указывающий на файл приложения "R" в заголовок этого файла (например, если ваше имя пакета приложения "com.android.myapp", затем добавьте это: "import com.android.myapp.R;" ). Перейдите к № 5, если вам нужно это сделать.
-
Добавьте файл .jar в путь создания проекта
- Посмотрите на следующий упрощенный пример кода:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import com.facebook.android.*;
import com.facebook.android.Facebook.DialogListener;
public class FacebookActivity extends Activity implements DialogListener,
OnClickListener
{
private Facebook facebookClient;
private LinearLayout facebookButton;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.test);//my layout xml
facebookButton = (LinearLayout)this.findViewById(R.id.Test_Facebook_Layout);
}
@Override
public void onComplete(Bundle values)
{
if (values.isEmpty())
{
//"skip" clicked ?
return;
}
// if facebookClient.authorize(...) was successful, this runs
// this also runs after successful post
// after posting, "post_id" is added to the values bundle
// I use that to differentiate between a call from
// faceBook.authorize(...) and a call from a successful post
// is there a better way of doing this?
if (!values.containsKey("post_id"))
{
try
{
Bundle parameters = new Bundle();
parameters.putString("message", "this is a test");// the message to post to the wall
facebookClient.dialog(this, "stream.publish", parameters, this);// "stream.publish" is an API call
}
catch (Exception e)
{
// TODO: handle exception
System.out.println(e.getMessage());
}
}
}
@Override
public void onError(DialogError e)
{
System.out.println("Error: " + e.getMessage());
}
@Override
public void onFacebookError(FacebookError e)
{
System.out.println("Error: " + e.getMessage());
}
@Override
public void onCancel()
{
}
@Override
public void onClick(View v)
{
if (v == facebookButton)
{
facebookClient = new Facebook();
// replace APP_API_ID with your own
facebookClient.authorize(this, APP_API_ID,
new String[] {"publish_stream", "read_stream", "offline_access"}, this);
}
}
}
Ответ 2
AsyncFacebookRunner mAsyncRunner;
Facebook facebook =new Facebook("Your app id");
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
facebook.authorize(FbdemoActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {
@Override
public void onComplete(Bundle values) {
}
@Override
public void onFacebookError(FacebookError error) {
}
@Override
public void onError(DialogError e) {
}
@Override
public void onCancel() {
}
});
}
});
public void postOnWall(String msg) {
Log.d("Tests", "Testing graph API wall post");
try {
String response = facebook.request("me");
Bundle parameters = new Bundle();
parameters.putString("message", msg);
parameters.putString("description", "test test test");
response = facebook.request("me/feed", parameters,
"POST");
Log.d("Tests", "got response: " + response);
if (response == null || response.equals("") ||
response.equals("false")) {
Log.v("Error", "Blank response");
}
} catch(Exception e) {
e.printStackTrace();
}
Ответ 3
Вот объективный ответ на ваш новый вопрос: "Что мне делать дальше?"
Быстрый взгляд на исходный код заставляет меня поверить в то, что вы делаете:
Проверьте этот URL для метода REST (http://en.wikipedia.org/wiki/Representational_State_Transfer), который вы можете использовать, чтобы оставить комментарий/сообщение:
http://developers.facebook.com/docs/reference/rest/
В частности это: http://developers.facebook.com/docs/reference/rest/links.post
Проверьте строки с 171 по 295 из Facebook.java
http://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/android/Facebook.java
Чтобы узнать, как использовать API для выполнения этих запросов.
Вам, вероятно, понадобится этот метод (он перегружен, см. код).
/**
* Make a request to Facebook old (pre-graph) API with the given
* parameters. One of the parameter keys must be "method" and its value
* should be a valid REST server API method.
*
* See http://developers.facebook.com/docs/reference/rest/
*
* Note that this method blocks waiting for a network response, so do not
* call it in a UI thread.
*
* Example:
* <code>
* Bundle parameters = new Bundle();
* parameters.putString("method", "auth.expireSession");
* String response = request(parameters);
* </code>
*
* @param parameters
* Key-value pairs of parameters to the request. Refer to the
* documentation: one of the parameters must be "method".
* @throws IOException
* if a network error occurs
* @throws MalformedURLException
* if accessing an invalid endpoint
* @throws IllegalArgumentException
* if one of the parameters is not "method"
* @return JSON string representation of the response
*/
public String request(Bundle parameters)
Ответ 4
тем, у кого есть проблемы, в новом facebook();, строка - это App_id и просто удалите APP_ID в авторизованном вызове.
Не знаю, почему отображается сообщение об ошибке, но я думаю, что facebook обновил SDK в facebook.