web-dev-qa-db-ja.com

Android / Java-シンプルなテキストをFacebookウォールに投稿しますか?

アプリ内から自分の壁への投稿を統合しようとしています。ユーザーが自分のユーザー名とパスワード(暗号化された)を保存できる領域が既にあります。私のプログラムに保存されたユーザー名とパスワードを呼び戻し、それを認証のためにFacebookに渡してから、アプリがユーザーの壁に簡単なテキスト(リンクも含む)を投稿できるようにします。

そうは言っても、Facebookの開発者ページのすべてを読みました(APIは私にはまったく見かけがありません...これまでにWebアプリ開発を行ったことは一度もありません...デスクトップアプリのみ)。 Java libraries here しかし、正直に言って、私はさまざまな実装のいずれも理解していません。頭。

公式のFacebook Android SDKをいじくり回しましたが、これはwebviewインターフェースを使用しており、簡単な認証のためにユーザー名とパスワードを渡すことができません。さらに、私はまだです正しい認証を行った後でも壁に投稿する方法についてはわかりません。

助けてください。ありがとう。

ああ、ところで私はすでにFacebook APIキーとアプリケーションIDを持っています。

[更新1]

さらなる説明:公式Facebookで次のコードスニペットを使用する場合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アプリケーションIDです。

ありがとう。

[更新2]

解決策を見つけました(以下を参照)が、欠けている唯一のものは、アプリに保存したデータをログインテキストボックスに自動入力する機能です。公式のFacebook Android SDKはこれを許可していない可能性があります。引き続き調査します。

45
RyanM

私はトムの助けを借りてそれを理解しました(ありがとう)。重要なのは、Facebook Android SDK。次の手順を使用して、 "stream.publish" API呼び出しでダイアログを作成することでした。

  1. 公式のFacebookをダウンロードAndroid SDK: http://github.com/facebook/facebook-Android-sdk
  2. プロジェクトファイルをEclipseにインポートします。
  3. プロジェクトを* .jarファイルとしてエクスポートします。 (これは競合を引き起こす可能性があります)

    [更新]

    Facebookは最近ソースコードを更新しましたが、アイコンファイルがプロジェクト(Android 1.5以降)とリソースIDの競合を引き起こすことに気付きました。私の解決策は、jarとしてエクスポートすることを忘れることです。代わりに、Facebookの「com」フォルダーをアプリの「src」フォルダーに直接コピーします(つまり、「com.facebook.Android」はアプリ内のパッケージである必要があります...ソースファイルのすぐ横にあります)。 「src」フォルダーに「com」フォルダーが既にある場合は、ファイルの上書きについて表示されるダイアログボックスを心配しないでください。ソースファイルは上書きされません。 Eclipseに戻り、「src」フォルダーを更新すると、「com.facebook.Android」がパッケージとしてリストされます。含まれているFacebookアイコンの1つをアプリの「描画可能な」フォルダーにコピーし、それも更新します。 Eclipseは「FbDialog.Java」ファイルについて文句を言います...アプリの「R」ファイルを指すインポートをそのファイルのヘッダーに追加するだけです(例えば、アプリのパッケージ名が「com.Android.myapp」の場合、追加しますこれ:「com.Android.myapp.Rをインポート;」)。これを行う必要がある場合は、#5に進みます。

  4. .jarファイルをプロジェクトのビルドパスに追加します

  5. 次の簡単なサンプルコードを見てください。

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);
        }
    }
}
45
RyanM
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();
             }
6
Nilesh Gawade

新しい質問「次はどうすればいいですか」に対する客観的な回答を次に示します。

ソースコードをざっと見てみると、これがあなたのしていることだと思うようになります。

REST( http://en.wikipedia.org/wiki/Representational_State_Transfer )のこのURLを確認してください。コメント/投稿を残すために使用できるAPIメソッド:

http://developers.facebook.com/docs/reference/rest/

具体的には: http://developers.facebook.com/docs/reference/rest/links.post

Facebook.Javaの171から295行目を確認してください http://github.com/facebook/facebook-Android-sdk/blob/master/facebook/src/com/facebook/Android/Facebook.Java

APIを使用してこれらのリクエストを行う方法を確認するには。

おそらくこのメソッドが必要でしょう(オーバーロードされています。コードを参照)。

        /**
* Make a request to Facebook's 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) 
1
user132014

新しいfacebook()で問題がある人に。 、文字列はApp_idであり、承認された呼び出しでAPP_IDを削除するだけです。

エラーメッセージが表示される理由はわかりませんが、facebookはfacebook SDKを更新したと思います。

0
Joakim Engstrom