Вот мое полное решение с использованием Graph API
Если все, что вы намереваетесь сделать, это обновить статус пользователя, вам нужно только получить разрешение «publish_stream».
От developers.facebook.com ...
«publish_stream»: позволяет вашему приложению публиковать контент, комментарии и лайки в потоке пользователя и в потоках его друзей. С этим разрешением вы можете в любое время публиковать контент в фиде пользователя , не требуя offline_access . Тем не менее, обратите внимание, что Facebook рекомендует модель совместного использования по инициативе пользователя.
Это важно, потому что это означает, что вам не нужно повторно авторизоваться каждый раз, когда вы пытаетесь обновить статус. Хитрость заключается в том, чтобы сохранить ключ / токен и отправить его с любым запросом на обновление.
Одно примечание: я изменил "Facebook.DEFAULT_AUTH_ACTIVITY_CODE" с частного на общедоступный в классе Facebook.java.
В моем коде есть две кнопки, одна из которых проверяет сохраненный токен, а другая просто отправляет пустой токен, чтобы я мог проверить, что произойдет, если токен выйдет из строя по какой-либо причине. Если происходит сбой, и API возвращает строку с «OAuthException», этот код делает новую попытку авторизации, а затем снова пытается обновить статус.
FBTest.java
package com.test.FBTest;
import java.io.IOException;
import java.net.MalformedURLException;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Facebook.DialogListener;
public class FBTest extends Activity {
Facebook facebook = new Facebook("199064386804603");
EditText et1;
TextView tv1;
Button button1;
Button button2;
private int mAuthAttempts = 0;
private String mFacebookToken;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 = (Button)findViewById(R.id.Button1);
button2 = (Button)findViewById(R.id.Button2);
tv1 = (TextView)findViewById(R.id.TextView1);
et1 = (EditText)findViewById(R.id.EditText1);
button1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
b1Click();
}
});
button2.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
b2Click();
}
});
}
private void saveFBToken(String token, long tokenExpires){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.edit().putString("FacebookToken", token).commit();
}
private void fbAuthAndPost(final String message){
facebook.authorize(this, new String[]{"publish_stream"}, new DialogListener() {
@Override
public void onComplete(Bundle values) {
Log.d(this.getClass().getName(),"Facebook.authorize Complete: ");
saveFBToken(facebook.getAccessToken(), facebook.getAccessExpires());
updateStatus(values.getString(Facebook.TOKEN), message);
}
@Override
public void onFacebookError(FacebookError error) {
Log.d(this.getClass().getName(),"Facebook.authorize Error: "+error.toString());
}
@Override
public void onError(DialogError e) {
Log.d(this.getClass().getName(),"Facebook.authorize DialogError: "+e.toString());
}
@Override
public void onCancel() {
Log.d(this.getClass().getName(),"Facebook authorization canceled");
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode,Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case Facebook.DEFAULT_AUTH_ACTIVITY_CODE:
facebook.authorizeCallback(requestCode, resultCode, data);
}
}
private void b1Click(){
mAuthAttempts = 0;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
mFacebookToken = prefs.getString("FacebookToken", "");
if(mFacebookToken.equals("")){
fbAuthAndPost(et1.getText().toString());
}else{
updateStatus(mFacebookToken,et1.getText().toString());
}
}
private void b2Click(){
mAuthAttempts = 0;
updateStatus("",et1.getText().toString());
}
public void updateStatus(String accessToken, String message){
try {
Bundle bundle = new Bundle();
bundle.putString("message", message);
bundle.putString(Facebook.TOKEN,accessToken);
String response = facebook.request("me/feed",bundle,"POST");
Log.d("UPDATE RESPONSE",""+response);
showToast("Update process complete. Respose:"+response);
if(response.indexOf("OAuthException") > -1){
if(mAuthAttempts==0){
mAuthAttempts++;
fbAuthAndPost(message);
}else{
showToast("OAuthException:");
}
}
} catch (MalformedURLException e) {
Log.e("MALFORMED URL",""+e.getMessage());
showToast("MalformedURLException:"+e.getMessage());
} catch (IOException e) {
Log.e("IOEX",""+e.getMessage());
showToast("IOException:"+e.getMessage());
}
String s = facebook.getAccessToken()+"\n";
s += String.valueOf(facebook.getAccessExpires())+"\n";
s += "Now:"+String.valueOf(System.currentTimeMillis())+"\n";
tv1.setText(s);
}
private void showToast(String message){
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();
}
}
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"
>
<EditText
android:id="@+id/EditText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/Button1"
android:text="Test: With Auth"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/Button2"
android:text="Test: Without Auth"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/TextView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>