Опубликовать на стене пользователя Facebook не работает, когда приложение Facebook установлено на устройстве / эмуляторе - PullRequest
4 голосов
/ 11 мая 2011

Я создал действие, которое использует эту реализацию (см. Принятый ответ) для публикации обновления статуса на стене пользователя в Facebook.

Это работает без проблем, если эмулятор/ На телефоне не установлено приложение facebook.

Если на эмуляторе / телефоне установлено приложение facebook, приложение facebook загружает экран входа в систему, но после попытки входа приложение facebook просто исчезает, возвращая меня кмое приложение.

Кто-нибудь сталкивался с таким опытом при установке приложения facebook?

Мой код:

public class AchievementActivity extends Activity implements DialogListener, OnClickListener{


private Facebook facebook;
Button facebookPostButton;
String defaultFacebookPost;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
    setContentView(R.layout.achievements);
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_layout);

    View achievementDivider = (View)findViewById(R.id.achievementDivider);
    int[] colors = {0, 0xff00ffff, 0};
    achievementDivider.setBackgroundDrawable(new GradientDrawable(Orientation.RIGHT_LEFT, colors));

    //get the title of the achievement from the intent that started this activity from the activity StatisticsActivity
    String achievementTitleString = getIntent().getStringExtra("title");

    String achievementTextToDisplay = getAchievementTextToDisplay(achievementTitleString);

    defaultFacebookPost = getDefaultPost(achievementTitleString);

    //ImageView achievementActivityAchievementBadgeImageView = (ImageView)findViewById(R.id.achievementActivityAchievementBadgeImageView);
    TextView achievementActivityBadgeTitleTextView = (TextView)findViewById(R.id.achievementActivityBadgeTitleTextView);
        achievementActivityBadgeTitleTextView.setText(achievementTitleString);

    TextView achievementActivityAchievementText = (TextView)findViewById(R.id.achievementActivityAchievementText);
        achievementActivityAchievementText.setText(achievementTextToDisplay);

    facebookPostButton = (Button)findViewById(R.id.facebookPostButton);
    facebookPostButton.setOnClickListener(this);


}

@Override
public void onComplete(Bundle values) {

    if (values.isEmpty())
    {
        Toast.makeText(getApplicationContext(), "Empty", Toast.LENGTH_SHORT);

        return;
    }

    if (!values.containsKey("post_id"))
    {
        try
        {
            Bundle parameters = new Bundle();
            parameters.putString("message", defaultFacebookPost);// the message to post to the wall
            facebook.dialog(AchievementActivity.this, "stream.publish", parameters, this);// "stream.publish" is an API call
        }
        catch (Exception e)
        {
            // TODO: handle exception
                System.out.println(e.getMessage());
        }
    }

    try 
    {
        facebook.logout(getApplicationContext());
    } 
    catch (MalformedURLException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
public void onFacebookError(FacebookError error) 
{
    Toast.makeText(AchievementActivity.this, "onFacebookError", Toast.LENGTH_LONG); 
}

@Override
public void onError(DialogError e) 
{
    Toast.makeText(AchievementActivity.this, "onError", Toast.LENGTH_LONG); 
}

@Override
public void onCancel() 
{
    Toast.makeText(AchievementActivity.this, "onCancel", Toast.LENGTH_LONG);
}

@Override
public void onClick(View v)
{
    if (v == facebookPostButton)
    {
        facebook = new Facebook("my_facebook_api");
        // replace APP_API_ID with your own
        facebook.authorize(this, new String[] {"publish_stream", "read_stream", "offline_access"}, this); 
    }
}

private String getDefaultPost(String defaultTitleString) 
{
    //do some stuff here to get a string to post to wall

    return defaultPost;
}

private String getAchievementTextToDisplay(String achievementTitleString) {
    String achievementTextToDisplay = "DEFAULT";

    //do some stuff here to get text to display in the activity
            //this has nothing to do with the facebook post...

    return achievementTextToDisplay;
}

}

Logcat говорит мне следующее:

05-11 13:03:34.076: INFO/ActivityManager(98): Starting activity: Intent { cmp=com.facebook.katana/.ProxyAuth (has extras) }
05-11 13:03:34.246: INFO/ActivityManager(98): Displayed activity com.facebook.katana/.ProxyAuth: 158 ms (total 158 ms)
05-11 13:03:35.166: DEBUG/dalvikvm(12390): GC_FOR_MALLOC freed 6729 objects / 418424 bytes in 44ms
05-11 13:03:35.166: DEBUG/webviewglue(12390): nativeDestroy view: 0x527e20
05-11 13:03:35.166: DEBUG/NativeCrypto(12390): Freeing OpenSSL session

РЕДАКТИРОВАТЬ : После установки платформы разработки Android на нескольких компьютерах в течение прошлого года и ВСЕГДА возникли проблемы с Facebook после создания новых сред разработки, я обнаружил, что этот простой ответ может бытьпричина, по которой реализация Facebook работает на одном устройстве, а не на другом ....

Секретный ключ API Facebook (тот, который вы перечислилиn developer.facebook.com) будет отличаться для каждой версии вашего приложения, которую вы упаковываете с другим сертификатом.Например, скажем, у вас есть две машины для разработки.Поскольку обе эти машины будут создавать ваши приложения с разными сертификатами, вы должны убедиться, что вы сгенерировали секретный ключ API Facebook для каждой машины и перечислили их на developer.facebook.com.

Ответы [ 3 ]

3 голосов
/ 19 февраля 2012

Я нашел обходной путь, но пока он не самый лучший.

facebook.authorize(activity, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, 
                new LoginDialogListener());

Это заставит ваше приложение не использовать единый вход, если на устройстве установлено официальное приложение facebook. Но должно быть лучшее решение, потому что есть приложения, которые используют sso с официальным приложением facebook.

1 голос
/ 11 мая 2011

Это потому, что когда вы вошли в учетную запись Facebook, то ваш сеанс входа в систему создается на устройстве. Вы должны выйти из Facebook после выполнения своей задачи.

0 голосов
/ 12 мая 2011
private static final String[] PERMISSIONS =
        new String[] {"publish_stream", "read_stream", "offline_access"};  




@Override
public void onClick(View v)
{
    if (v == facebookPostButton)
    {
        mAsyncRunner    = new AsyncFacebookRunner(mFacebook);
                                   mAsyncRunner.request(mFacebook.logout(getApplicationContext()), new LogoutListener());
                        mFacebook.authorize(FacebookImplement.this, PERMISSIONS, new AuthorizeListener());
    }
}



public class AuthorizeListener extends BaseDialogListener {

        public void onComplete(Bundle values) {

           Bundle params = new Bundle();
           params.putString("message"," Message");
       params.putString("description", "Wall Posting Description");        
        mAsyncRunner.request("me/feed", params, "POST",
                new UploadListener());         

        }

}

public class UploadListener extends BaseRequestListener {

        public void onComplete(final String response) {
              mAsyncRunner.request(mFacebook.logout(getApplicationContext()), new LogoutListener());
}

}

 public class LogoutListener extends BaseRequestListener {


        public void onComplete(final String response) {         



        }
    }

Может быть, этот код поможет вам. Если есть какие-либо проблемы, то спрашивайте без каких-либо проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...