我正在使用Android应用中的facebook集成。我做了很多关于facebook inn android的错误处理的搜索,但没什么。谁能告诉我如何在android中处理这些情况:
1.用户更改密码,使访问令牌无效。 2.用户取消对您的应用的授权。 3.用户退出Facebook。
我的Facebook集成代码在这里:
private UiLifecycleHelper uiHelper;
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if ( exception instanceof FacebookOperationCanceledException ||
exception instanceof FacebookAuthorizationException)
{
new AlertDialog.Builder(MainWindow.this)
.setTitle("cancel")
.setMessage("your permission has expired.")
.setPositiveButton("ok", null)
.show();
}
}
private void onClickFacebookRequest()
{
if (session.isOpened())
{
sendRequests();
} else {
StatusCallback callback = new StatusCallback() {
public void call(Session session, SessionState state, Exception exception) {
if (exception != null) {
new AlertDialog.Builder(MainWindow.this)
.setTitle(R.string.login_failed_dialog_title)
.setMessage(exception.getMessage())
.setPositiveButton(R.string.ok_button, null)
.show();
session = createSession();
}
}
};
pendingRequest = true;
session.openForRead(new Session.OpenRequest(this).setCallback(callback));
}
}
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
private void sendRequests()
{
List<String> permissions = quytechApps.getSession().getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
pendingRequest = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
return;
}
showValidationDialog("Please Wait.posting Data on Facebook");
Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.splash_screen_final4);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Bundle postParams=new Bundle();
postParams.putByteArray("photo",byteArray);
postParams.putString("message", "Hi Friends I am using Twinqli Chat App.");
Request request = new Request(Session.getActiveSession(), "me/photos", postParams, HttpMethod.POST, new Request.Callback()
{
@Override
public void onCompleted(Response response) {
// TODO Auto-generated method stub
// showPublishResult(getString(R.string.photo_post), response.getGraphObject(), response.getError());
if(response.getError() == null)
{
Log.d("GraphApiSample.java Sucesses","sucess");
dismissValidatingDialog();
}
else
{
dismissValidatingDialog();
session.closeAndClearTokenInformation();
//quytechApps.getSession().
//quytechApps.setSession(null);
// Log.d("GraphApiSample.java",""+response.getError().getErrorMessage());
}
}
});
request.executeAsync();
}
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
static final String applicationId = "390611174384274";
boolean pendingRequest;
static final String PENDING_REQUEST_BUNDLE_KEY = "com.facebook.samples.graphapi:PendingRequest";
private Session createSession()
{
Session activeSession = Session.getActiveSession();
if (activeSession == null || activeSession.getState().isClosed())
{
activeSession = new Session.Builder(this).setApplicationId(applicationId).build();
Session.setActiveSession(activeSession);
}
return activeSession;
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (qsession.onActivityResult(this, requestCode, resultCode, data) &&
pendingRequest &&
session.getState().isOpened()) {
sendRequests();
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
pendingRequest = savedInstanceState.getBoolean(PENDING_REQUEST_BUNDLE_KEY, pendingRequest);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(PENDING_REQUEST_BUNDLE_KEY, pendingRequest);
}
任何人都可以帮助我。提前谢谢。
答案 0 :(得分:2)
Ming Li指出的handleError()
方法与请求错误有关。它不处理登录错误。我没有看到Facebook文档中的任何示例,也没有示例如何处理登录错误,除了区分取消和错误。我的建议是在登录尝试之前生成错误的条件(例如更改密码,取消对应用程序的授权等),然后在登录回调中查看为error.getMessage()获取的不同值,并相应地构建自己的机制(例如,如果消息中出现“会话”一词,则告诉用户登录Facebook应用程序)。另请注意,getLocalizedMessage()似乎不起作用(从SDK 3.5.2开始)。您可以按if (exception instanceof FacebookOperationCanceledException)
和if (exception instanceof FacebookAuthorizationException)
区分取消和错误,但这几乎就是它。
答案 1 :(得分:0)
这个问题与脸书错误处理有关,处理起来非常复杂。
然而,当我使用面子书API时,我得到了一个可能返回的错误代码列表,因此我能够优雅地解决这个问题。我想你要求的是优雅的错误处理。
首先,如果是这样,Google搜索会显示此url。
现在进入有趣的部分:
访问令牌失效:此处错误说明为:无效的OAuth 2.0访问令牌,返回的错误号为:190
User de authorirization:这是一个权限问题,因此错误说明是:权限错误,错误号为:
用户注销:当用户注销时,会导致用户数据错误。错误描述为:用户数据失败,错误号为:310。
但是,还有其他一些场景,您需要考虑这些场景。为此,您可以在此LINK中获取所有这些错误代码的列表。
答案 2 :(得分:0)
错误处理文档在此处 - https://developers.facebook.com/docs/reference/api/errors/
您还应该查看Scrumptious示例应用程序,特别是SelectionFragment.java中的handleError()方法,它会分解您应该处理的不同情况。