【问题标题】:How to send app requests to friends through Facebook Android SDK如何通过 Facebook Android SDK 向好友发送应用请求
【发布时间】:2013-12-09 18:24:00
【问题描述】:

目前我正在为此使用 Facebook SDK 开发一个 Android 应用程序。将消息发布到墙上等工作正常,但通过此 SDK 我无法向其他人发送应用请求。

谁能帮帮我?

这是我的代码 sn-p:

Bundle params = new Bundle();
params.putString("message", getString(R.string.request_message));
Utility.mFacebook.dialog(Hackbook.this, "apprequests", params, new AppRequestsListener());

AppRequestsListener

public class AppRequestsListener extends BaseDialogListener {
    @Override
    public void onComplete(Bundle values) {
        Toast toast = Toast.makeText(getApplicationContext(), "App request sent", Toast.LENGTH_SHORT);
        toast.show();
    }

    @Override
    public void onFacebookError(FacebookError error) {
        Toast.makeText(getApplicationContext(), "Facebook Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onCancel() {
        Toast toast = Toast.makeText(getApplicationContext(), "App request cancelled", Toast.LENGTH_SHORT);
        toast.show();
    }
}

【问题讨论】:

  • 不需要来自 facebook sdk 的代码,只需要你的.. 这是什么 AppRequestsListener?能否请您也添加该代码。
  • @NitzanTomer AppRequestsListener 只是一个回调监听器..只是为了显示 toast。我们可以通过某种方式拦截请求并检查其参数???
  • 请查看我编辑的答案。
  • @NitzanTomer Hackbook 是我的班级名称,你能像我一样发布你的 InviteListener 的代码吗?我使用 AppRequestsListener 来显示祝酒词
  • 我的监听器在功能上非常简单,但是那里有一个层次结构,这将导致我发布至少 3 个类的代码,以便您了解我在那里所做的事情。因此,如果您发布代码会更简单,我想在这里帮助您,但您似乎不想获得帮助。我只会再问一次,然后继续:请分享您的 AppRequestsListener 的代码,无论您认为它做什么或不做什么。

标签: android facebook facebook-graph-api


【解决方案1】:

从 SDK 版本 3.0 开始,您使用 WebDialog。下面是一个示例,说明如何使用提供的 Builder 来创建一个,该 Builder 使用所有可用参数:

private void sendRequestDialog() {
    Bundle params = new Bundle();
    params.putString("title", "Send a Request");
    params.putString("message", "Learn how to make your Android apps social");
    params.putString("to", "12343543,32423534");  // comma seperated list of facebook IDs to preset the recipients. If left out, it will show a Friend Picker.
    params.putString("data",
        "{\"badge_of_awesomeness\":\"1\"," +
        "\"social_karma\":\"5\"}");  // any additional data

    WebDialog requestsDialog = (
        new WebDialog.RequestsDialogBuilder(getActivity(), Session.getActiveSession(), params))
            .setOnCompleteListener(new OnCompleteListener() {

                @Override
                public void onComplete(Bundle values, FacebookException error) {
                    // do something, e.g. show toast message
                }   
            })
            .build();
    requestsDialog.show();
}

参考:Facebook SDK 3.0 for Android: Send Requests

【讨论】:

    【解决方案2】:

    使用 Facebook Api 3.0

    1.发送好友请求

    Bundle params = new Bundle();
    params.putString("message", "Learn how to make your Android apps social");
    
    RequestsDialogBuilder builder = new RequestsDialogBuilder(MainActivity.this,
                                        Session.getActiveSession(), params);
    
    builder.setOnCompleteListener(new OnCompleteListener() {
    
        @Override
        public void onComplete(Bundle values, FacebookException error) {
    
            if (error != null){
                if (error instanceof FacebookOperationCanceledException){
                    Toast.makeText(MainActivity.this,"Request cancelled",Toast.LENGTH_SHORT).show();
                }
                else{
                    Toast.makeText(MainActivity.this,"Network Error",Toast.LENGTH_SHORT).show();
                }
            }
            else{
    
                final String requestId = values.getString("request");
                if (requestId != null) {
                    Toast.makeText(MainActivity.this,"Request sent",Toast.LENGTH_SHORT).show();
                } 
                else {
                    Toast.makeText(MainActivity.this,"Request cancelled",Toast.LENGTH_SHORT).show();
                }
            }
        }
    });
    
    WebDialog requestDialog = builder.build();
    requestDialog.show();
    

    2。发送应用请求

    Bundle parameters = new Bundle();
    parameters.putString("message", "Send Request");
    
    WebDialog.Builder builder = new Builder(MainActivity.this, Session.getActiveSession(),
                                    "apprequests", parameters);
    
    builder.setOnCompleteListener(new OnCompleteListener() {
    
        @Override
        public void onComplete(Bundle values, FacebookException error) {
            if (error != null){
                if (error instanceof FacebookOperationCanceledException){
                    Toast.makeText(MainActivity.this,"Request cancelled",Toast.LENGTH_SHORT).show();
                }
                else{
                    Toast.makeText(MainActivity.this,"Network Error",Toast.LENGTH_SHORT).show();
                }
            }
            else{
    
                final String requestId = values.getString("request");
                if (requestId != null) {
                    Toast.makeText(MainActivity.this,"Request sent",Toast.LENGTH_SHORT).show();
                } 
                else {
                    Toast.makeText(MainActivity.this,"Request cancelled",Toast.LENGTH_SHORT).show();
                }
            }                       
        }
    });
    
    WebDialog webDialog = builder.build();
    webDialog.show();
    

    【讨论】:

    • 完美流畅的解决方案
    • RequetsDialogBuilder 已将 apprequests 指定为操作。没有必要使用Builder? (FB SDK 3.0.2 com.facebook.widget.WebDialog 第 656、670、684 行)
    【解决方案3】:

    android sdk 有Dialogs 可以使用,当你打开一个对话框时你指定要打开哪个对话框。

    您可以在Dialogs 文档中查看可用对话框的列表。 其中一个对话框是Requests Dialog,您也可以从 android sdk 打开它,例如:

    Facebook facebook = new Facebook("YOUR_APP_ID");
    
    ....
    
    Bundle params = new Bundle();
    params.putString("title", "invite friends");
    facebook.dialog(this, "apprequests", params, new DialogListener() {
        @Override
        public void onComplete(Bundle values) {}
    
        @Override
        public void onFacebookError(FacebookError error) {}
    
        @Override
        public void onError(DialogError e) {}
    
        @Override
        public void onCancel() {}
    });
    

    您可以为此对话框添加更多参数,使用文档查看您需要什么。


    编辑

    好的,看看这段代码:

    Bundle paramsOut = new Bundle(), paramsIn = this.getIntent().getExtras();
    paramsOut.putString("message", paramsIn.getString("message"));
    this.facebook.dialog(this, "apprequests", paramsOut, new InviteListener(this));
    

    我使用它,它对我来说效果很好,正在发送应用请求并且用户接收它。 由于您的代码非常相似,因此可以安全地假设问题出在不同之处,因此您应该将代码发布到不同之处。

    那么,您的 AppRequestsListener 中有什么?说它只是显示一个弹出窗口并不能帮助我帮助你。 另外,这个 *Hackbook 是什么?它是一个活动吗?

    【讨论】:

    • 您能否详细说明一下,因为我尝试使用上面的代码但没有成功
    • 我认为这很简单。它显然只是一个“骨架”代码 sn-p,您必须实现 DialogListener 等。 “没有成功”是什么意思?你有错误吗?如果是这样,那是什么?另外,请务必阅读文档(我链接到 3 个不同的 fb 文档页面)。我很乐意为您提供更多帮助,但我需要知道您缺少什么/什么不起作用。
    • thnx 回复..我已经阅读了文档并使用了 Facebook 提供的 Facebook sdk 并按照文档中提到的步骤进行操作。通过使用 hackbook 的源代码,我可以在墙上等发布消息但不能向其他 Facebook 朋友发送应用请求我的意思是它告诉我我的应用请求已发送但实际上其他用户没有收到该请求。你能帮我解决这个问题吗...thanx in adv
    • “显示我的应用请求已发送”是什么意思?它是如何显示的?另外,你能用你正在使用的代码编辑你的问题吗?
    • 对于 SDK v3,Facebook.dialog() 已弃用并由 WebDialog 替换
    【解决方案4】:

    这段代码在 Facebook Sdk 3.0 中对我来说很好用

     private void sendRequestDialog(final String userId) {
             Bundle params = new Bundle();       
             params.putString("title", "Invite Friend");
             params.putString("message", "has invite has you to try out " +
                     "The perfect gamified experience for today's smart and social Cricket fan " +
                     "Download now on your ANDROID device!");
             // comma seperated list of facebook IDs to preset the recipients. If left out, it will show a Friend Picker.
             params.putString("to",  userId);  // your friend id
    
             WebDialog requestsDialog = ( new WebDialog.RequestsDialogBuilder(MainActivity.this,
                     Session.getActiveSession(), params)).setOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(Bundle values, FacebookException error) {
                    //   Auto-generated method stub                     
                    if (error != null) {
                        if (error instanceof FacebookOperationCanceledException) {
                            Toast.makeText(MainActivity.this.getApplicationContext(), 
                                    "Request cancelled", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this.getApplicationContext(), 
                                    "Network Error",  Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        final String requestId = values.getString("request");
                        if (requestId != null) {
                            Toast.makeText(MainActivity.this.getApplicationContext(), 
                                    "Request sent",  Toast.LENGTH_SHORT).show();
                            Log.i("TAG", " onComplete req dia ");                                   
                        } else {
                            Toast.makeText(MainActivity.this.getApplicationContext(), 
                                    "Request cancelled", Toast.LENGTH_SHORT).show();
                        }
                    }                   
                }
             }).build();
             requestsDialog.show();
         }
    

    【讨论】:

    • 我试试这个,但它说请求已发送,但没有通知我选择的朋友..
    【解决方案5】:

    我认为您缺少实际发送请求的 onComplete 中的代码。你在 onComplete 中只有一个祝酒词,这就是为什么你会收到一条消息说请求已发送。您需要一个返回 ID 才能实际发送请求。

    public void onComplete(Bundle values) {
        final String returnId = values.getString("request");
    
        if (returnId != null) {
            Toast.makeText(getApplicationContext(),
                           "Request sent " + returnId,
                           Toast.LENGTH_SHORT).show();
        }
    }
    

    您必须实际发送 onComplete 的值。

    【讨论】:

    • 我收到消息“请求已发送”。但没有通知。
    【解决方案6】:

    使用 Facebook Api

    参考:https://stackoverflow.com/users/1237937/kirit

    public void run() {
                Bundle parameters = new Bundle();
                parameters.putString("message", "Send Request");
    
            WebDialog.Builder builder = new WebDialog.Builder(ConnectionSearchFacebook.this, facebookConnector.getFacebook().getSession(),
                    "apprequests", parameters);
    
            builder.setOnCompleteListener(new WebDialog.OnCompleteListener() {
                @Override
                public void onComplete(Bundle values, FacebookException error) {
                    if (error != null){
                        if (error instanceof FacebookOperationCanceledException){
                            Toast.makeText(ConnectionSearchFacebook.this,"Request cancelled",Toast.LENGTH_SHORT).show();
                        }
                        else{
                            Toast.makeText(ConnectionSearchFacebook.this,"Network Error",Toast.LENGTH_SHORT).show();
                        }
                    }
                    else{
    
                        final String requestId = values.getString("request");
                        if (requestId != null) {
                            Toast.makeText(ConnectionSearchFacebook.this,"Request sent",Toast.LENGTH_SHORT).show();
                        }
                        else {
                            Toast.makeText(ConnectionSearchFacebook.this,"Request cancelled",Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
    
            WebDialog webDialog = builder.build();
            webDialog.show();
    
        }
    

    【讨论】:

    • 我试试这个,但它说请求已发送,但没有通知我选择的朋友..
    猜你喜欢
    • 2011-12-30
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多