#android #facebook #facebook-graph-api #facebook-apps #facebook-requests
#Android #Facebook #facebook-graph-api #facebook-приложения #facebook-запросы
Вопрос:
Я пытаюсь реализовать отправку данных и принять эти данные в своем игровом приложении Facebook для Android.Я следую https://developers.facebook.com/docs/android/send-requests/#notifications учебное пособие для этого. Я могу отправить запрос, однако я не могу принять данные на стороне получателя.
Я intentUri
каждый раз возвращаю null, поэтому я не могу получить requestIds.
мой код для получения данных на стороне получателя:
intentUri = MainActivity.this.getIntent().getData();
if (intentUri != null) {
String requestIdParam = intentUri.getQueryParameter("request_ids");
if (requestIdParam != null) {
String array[] = requestIdParam.split(",");
requestId = array[0];
Log.i("Request id: ", "Request id: " requestId);
}else{
Log.i("Request id: ", "null" );
}
} else {
Log.i("intentUri", "null"); //**Always printing this part**
}
Метод onSessionStateChange() для вызова метода requestData
private void onSessionStateChange(Session session, SessionState state,Exception exception) {
if (state.isOpened() amp;amp; requestId != null) {
getRequestData(requestId);
requestId = null;
}
}
Я отправляю запрос, используя следующий метод :
private void sendRequestDialog() {
Bundle params = new Bundle();
params.putString("message",
"Learn how to make your Android apps social");
params.putString("data", "{"badge_of_awesomeness":"1","
""social_karma":"5"}");
WebDialog requestsDialog = (new WebDialog.RequestsDialogBuilder(
MainActivity.this, Session.getActiveSession(), params))
.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();
}
}
}
}).build();
requestsDialog.show();
}
Код для принятия запроса, как показано ниже:
private void getRequestData(final String inRequestId) {
// Create a new request for an HTTP GET with the
// request ID as the Graph path.
Request request = new Request(Session.getActiveSession(), inRequestId,
null, HttpMethod.GET, new Request.Callback() {
@Override
public void onCompleted(Response response) {
// Process the returned response
GraphObject graphObject = response.getGraphObject();
FacebookRequestError error = response.getError();
// 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(
(String) graphObject
.getProperty("data"));
// 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 "nn" "Badge: "
badge " Karma: " karma;
} catch (JSONException e) {
message = "Error getting request info";
}
} else if (error != null) {
message = "Error getting request info";
}
}
Toast.makeText(MainActivity.this, message,
Toast.LENGTH_LONG).show();
deleteRequest(inRequestId);
}
});
// Execute the request asynchronously.
Request.executeBatchAsync(request);
}
Примечание: я просто использую простое действие, я не использую фрагменты
Комментарии:
1. Поскольку Facebook SDK меняется так быстро, я могу только дать вам несколько указаний.
2. 1. Во-первых, вы получили какую-либо ошибку при отправке запроса?? Возможно, запрос не отправлен успешно. Вы должны тщательно проверить logcat на наличие подозрительных предупреждений / ошибок.
3. 2. Иногда настройки в вашей консоли приложений Facebook могут сделать ее видимой / невидимой на мобильном / рабочем столе. Вы можете проверить настройки консоли приложения fb. Эта часть настолько сложна и сложна для отладки, все, что вы можете сделать, это попробовать и ошибиться.
4. @NickJian Спасибо, запрос успешно отправлен без каких-либо ошибок или предупреждений, а также отображается в области уведомлений получателей на Facebook (web). Однако, когда я получаю доступ к данным с помощью
MainActivity.this.getIntent().getData();
кода, он показывает null при печати в моем logcat, как я упоминал в вопросе.
Ответ №1:
Метод getIntent()
возвращает намерение, с которого началось действие. Вы можете попробовать переопределить метод Activity
protected void onNewIntent(Intent intent)
И вызовите
setIntent(Intent intent)
оттуда.
Вы также можете попробовать запросить свои данные с помощью:
Intent intent = MainActivity.this.getIntent();
Bundle bundle = intent.getExtras();
intentUri = (Uri)bundle.get(Intent.EXTRA_TEXT);
Помимо этого, куда и как вы звоните intent.putExtra("request_ids", data)
?
Не уверен, что я полностью понял вашу проблему,
в любом случае, я желаю вам удачи.
Редактировать:
Возможно, вы захотите использовать Intent .EXTRA_STREAM вместо намерения.EXTRA_TEXT, в зависимости от способа хранения ваших данных
Комментарии:
1. Данные, которые я отправляю, передаются через собственные диалоги Facebook. Проверьте
sendRequestDialog()
мой вопрос, в котором я отправляю данные, используя params.putString(«данные»,»…..»); Так что здесь не может быть и речи оintent.putExtra
2. Да, вы правы, я виноват. Вы проверили настройки панели мониторинга приложений Facebook? Возможно, вы получаете нулевые данные, потому что у вас нет нужных разрешений. Разместили ли вы код для получения данных (intentUri = MainActivity.this.GetIntent().getData(); и т.д.) В методе MainActivity onCreate? Удивительно, что он не работает должным образом, учитывая, что он почти скопирован и вставлен из примеров документов Facebook SDK. Единственное, что приходит мне на ум прямо сейчас, это панель приложений. Дайте мне знать, как это происходит. P.S: вы пробовали intentUri =(Uri)bundle.get(намерение. EXTRA_STREAM)?