идентификатор запроса имеет значение null в обработке входящего уведомления в facebook android sdk

Я пытаюсь обработать входящее уведомление в facebook.

ссылка: http://developers.facebook.com/docs/howtos/androidsdk/3.0/app-link-requests/

Код :

public class MainFragment extends Fragment{

private static final String TAG = "MainFragment";
private UiLifecycleHelper uiHelper;
private String requestId;
private TextView username;

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

    Log.d(TAG, "MainFragment.onCreate()");
    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

    Log.d(TAG, "MainFragment.onCreateView()");
    View view = inflater.inflate(R.layout.login,container, false);

    LoginButton authButton = (LoginButton) view.findViewById(R.id.loginButton);
    authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
    authButton.setFragment(this);

    username = (TextView) view.findViewById(R.id.textusename);

    return view;
}

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

    Log.d(TAG, "MainFragment.onActivityCreated()");

    // Check for an incoming notification. Save the info
    // Parse any incoming notifications and save

    Uri intentUri = getActivity().getIntent().getData();
    if (intentUri != null) {
        String requestIdParam = intentUri.getQueryParameter("request_ids");
        if (requestIdParam != null) {
            String array[] = requestIdParam.split(",");
            requestId = array[0];
        }
    }


}

private void onSessionStateChange(Session session, SessionState state, Exception exception) {

    // Check if the user is authenticated and
    // an incoming notification needs handling 
    Log.d(TAG,"MainFragment.onSessionStateChange()");

    Log.d(TAG, "Request id : "+requestId);

    if (state.isOpened() && requestId != null) {
        Log.d("request id", requestId);

        getRequestData(requestId);

        Toast.makeText(getActivity().getApplicationContext(), "Incoming request", Toast.LENGTH_SHORT).show();
        requestId = null;
    }

    if (state.isOpened())
    {
        Settings.addLoggingBehavior(LoggingBehavior.REQUESTS);


        Request.executeMeRequestAsync(Session.getActiveSession(), new GraphUserCallback() {

            @Override
            public void onCompleted(GraphUser user, Response response) {
                if (user != null) {
                    username.setText(user.getName());
                }                   
            }
        });

    }



}

private Session.StatusCallback callback = new Session.StatusCallback() {

    @Override
    public void call(Session session, SessionState state, Exception exception) {

        onSessionStateChange(session, state, exception);
    }
};

private void getRequestData(String requestid)
{
    Request request = new Request(Session.getActiveSession(), requestid, null, HttpMethod.GET, new Request.Callback() {

        @Override
        public void onCompleted(Response response) {

            // Process the returned response
            GraphObject graphObject = response.getGraphObject();
            FacebookRequestError error = response.getError();

            Log.d(TAG, response.toString());

            // Default message
            String message = "Incoming request";

            if( graphObject != null )
            {
                // Check if there is extra data
                if ( graphObject.getProperty("data") != null )
                {
                    try {

                        // Get the data, parse info to get the key/value info

                        JSONObject dataObject = new JSONObject(graphObject.getProperty("data").toString());

                        // Get the value for the key - badge_of_awesomeness
                        String badge = dataObject.getString("badge_of_awesomeness");

                        // Get the value for the key - social_karma
                        String karma = dataObject.getString("social_karma");

                        // Get the sender's name
                        JSONObject fromObject =(JSONObject) graphObject.getProperty("from");

                        String sender = fromObject.getString("name");
                        String title = sender+" sent you a gift";

                        // Create the text for the alert based on the sender
                        // and the data
                        message = title + "\n\n" + "Badge: " + badge + " Karma: " + karma;
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                Toast.makeText(getActivity().getApplicationContext(),message,Toast.LENGTH_LONG).show();
            }

        }
    });

    Log.d(TAG, "Request : "+request.toString());

    // Execute the request asynchronously.
    Request.executeBatchAsync(request);

}
}

Логкэт

03-02 17:40:20.443: D/MainFragment(947): MainFragment.onCreate()
03-02 17:40:20.463: D/MainFragment(947): MainFragment.onCreateView()
03-02 17:40:20.753: D/MainFragment(947): MainFragment.onActivityCreated()
03-02 17:40:28.623: D/MainFragment(947): MainFragment.onSessionStateChange()
03-02 17:40:28.623: D/MainFragment(947): Request id : null
03-02 17:40:30.673: D/MainFragment(947): MainFragment.onSessionStateChange()
03-02 17:40:30.673: D/MainFragment(947): Request id : null
03-02 17:40:30.823: D/MainFragment(947): MainFragment.onSessionStateChange()
03-02 17:40:30.833: D/MainFragment(947): Request id : null

Теперь моя проблема в том, что когда я нажимаю «Уведомление» с помощью приложения Facebook для Android, мое приложение запускается, но я не могу получить идентификатор запроса для этого уведомления.

Конфигурация панели управления приложения введите здесь описание изображения


person Kirit Vaghela    schedule 21.02.2013    source источник


Ответы (2)


Это проблема, на которую я потратил целый день. Благодаря Бобану

Это баг фейсбука. Просто добавьте Mobile Web в App Dashboard, и вы получите request_ids

Приложение для Android: обработка запроса приложения, опубликованного на Facebook

person Nick Jian    schedule 15.04.2013
comment
Здравствуйте, Ник, у меня такая же проблема, и вы можете проверить мой вопрос http://stackoverflow.com/questions/24324963/unable-to-get-facebook-incoming-requests также. Если возможно, пожалуйста, помогите мне с этим. - person Kunu; 24.06.2014

Я полагаю, вы не забыли атрибут requestId:

private String requestId;

Не могли бы вы также проверить значения intentUri, requestIdParam и array[0] в методе onActivityCreated?

@Override
public void onActivityCreated(Bundle savedInstanceState) { // <--- in THIS method
    super.onActivityCreated(savedInstanceState);
    Log.d(TAG, "MainFragment.onActivityCreated()");

    // Check for an incoming notification. Save the info
    Uri intentUri = getActivity().getIntent().getData();
    Log.d(TAG, "intentUri: " + intentUri.toString()); // <--- HERE
    if (intentUri != null) {
        String requestIdParam = intentUri.getQueryParameter("request_ids");
        Log.d(TAG, "requestIdParam: " + requestIdParam); // <--- HERE
        if (requestIdParam != null) {
            String array[] = requestIdParam.split(",");
            Log.d(TAG, "requestId: " + array[0]); // <--- HERE
            requestId = array[0];
        }
    }
}

Пожалуйста, обновите свой пост, чтобы показать нам весь класс.

Изменить:

Когда пользователь нажимает на уведомление в Facebook для Android, класс, который вы настроили в настройках панели приложений, будет вызван, а информация о запросе будет передана в данные о намерениях. Данные будут иметь следующую информацию:

target_url=[URL]/?request_ids=[COMMA_SEPARATED_REQUESTIDs]
    &ref=notif&fb_source=notification
    &app_request_type=user_to_user

Однако вы не получаете параметр request_ids. На мой взгляд, что-то не так со следующей конфигурацией: Настройки панели приложений

Что вы указали в этих полях? Совпадает ли это с фактическим древовидным строением вашего приложения?

Редактировать 2:

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

Что там в вашем Login.java?

Должно быть com.pricus.expensemanagement.MainActivity.

Убедитесь, что вы правильно выполнили это первое руководство по входу в систему, и особенно этот шаг:

Во-первых, сделайте активность подклассом FragmentActivity вместо Activity:

public class MainActivity extends FragmentActivity {
person Stéphane Bruckert    schedule 02.03.2013
comment
Нет, я прошу вас вывести значения вышеназванных переменных. Сообщение отредактировано с HERE утверждениями. Сделайте это и ответьте с результатами трех log.d. - person Stéphane Bruckert; 02.03.2013
comment
в logcat я получаю ноль - person Kirit Vaghela; 02.03.2013
comment
Прочтите еще раз мой последний комментарий и ответьте на просьбу. Не могу поверить, что вы добавили +50 к своему сообщению и даже не удосужились ответить серьезно. Я хочу 3 (ТРИ) значения. - person Stéphane Bruckert; 02.03.2013
comment
Извините. Я добавил вывод logcat - person Kirit Vaghela; 02.03.2013
comment
Серьезно? Это все еще не то, чего я хочу. Я с самого начала знаю, что requestId равен NULL в onSessionStateChange. В вашем выводе logcat указано то, что мы уже знаем. Но скажи мне, ты читаешь, что я пишу? Я прошу вас добавить 3 logs.d в метод onActivityCreated. После трех комментариев вы так и не поняли, и мы вообще не продвинулись. (Хорошо, я дам вам подсказку, потому что я хороший: вам нужно только скопировать/вставить мой метод onActivityCreated в свой код). Затем снова обновите вывод logcat. - person Stéphane Bruckert; 02.03.2013
comment
Logcat: D/MainFragment(487): Uri намерения: apps.facebook.com/apps /application.php?id=504782202896276 - person Kirit Vaghela; 02.03.2013
comment
У них нет параметра request_ids в намерении Uri= apps.facebook.com/apps/application. php?id=504782202896276. так как он может напечатать значение параметра requestIdParam - person Kirit Vaghela; 07.03.2013
comment
Можете ли вы проверить, что вы действительно получили уведомление, подключившись к вашему тестовому пользователю на Facebook (не в вашем приложении)? Нам нужно знать, успешно ли вы выполнили первое задание. . - person Stéphane Bruckert; 07.03.2013
comment
Да. Я получил уведомление в facebook. когда я нажимаю на уведомление, мое приложение запускается - person Kirit Vaghela; 07.03.2013
comment
Вы настроили Конфигурацию панели приложений? правильно? Не могли бы вы показать нам? - person Stéphane Bruckert; 07.03.2013
comment
да. Я могу делать что угодно с моей текущей конфигурацией панели инструментов приложения. например, отправить запрос, опубликовать историю, получить пользовательские данные с помощью запроса fql и т. д. и что вы хотите видеть в конфигурации панели инструментов приложения. - person Kirit Vaghela; 07.03.2013
comment
Я отредактировал свой ответ. Что вы указали в полях Package Name, Class Name, Key Hash, Facebook Login и Deep Linking? - person Stéphane Bruckert; 07.03.2013