通过Android的应用程序不能访问Facebook好友 [英] Can not access Facebook friends via Android application
问题描述
我通过我的Android应用程序获取用户的朋友们的JSONObject访问图形API的一个问题,提取他们的名字,并在屏幕上显示出来。它应该是一个简单明了的任务,但显然事实并非如此。当我跑我在Android的Nexus我的应用程序,我登录到Facebook的,那么我问我点击允许按钮,授予权限,我重定向到一个空白页。我希望看到我的朋友的名字,但它不会发生。能有人帮助我。
公共类登录扩展活动
{
Facebook的mFacebook =新的Facebook(201509899926116);
AsyncFacebookRunner mAsyncRunner =新AsyncFacebookRunner(mFacebook);
字符串文件名=AndroidSSO_data;
私人共享preferences米preFS;
查看的LinearLayout;
@覆盖
公共无效的onCreate(包savedInstanceState)
{
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
的LinearLayout = findViewById(R.id.main_layout);
/ *获取现有access_token如有* /
米preFS = GET preferences(MODE_PRIVATE);
字符串access_token = M prefs.getString(access_token,NULL);
长过期= M prefs.getLong(access_expires,0);
若(access_token!= NULL)
{
mFacebook.setAccessToken(access_token);
}
如果(到期!= 0)
{
mFacebook.setAccessExpires(到期);
}
/ *只有调用授权,如果access_token已过期。 * /
如果(!mFacebook.isSessionValid())
{
mFacebook.authorize(这一点,新的String [] {user_birthday,电子邮件,
user_relationships,user_religion_politics,user_hometown,
user_location,user_relationship_details,user_education_history,
user_likes,user_interests,user_activities},
新DialogListener()
{
@覆盖
公共无效的onComplete(束值)
{
共享preferences.Editor编辑= M prefs.edit();
editor.putString(access_token,mFacebook.getAccessToken());
editor.putLong(access_expires,mFacebook.getAccessExpires());
editor.commit();
/ *访问的图形API * /
Log.d(脸谱 - 示例 - 好友请求,入门API请求);
mAsyncRunner.request(我的/朋友,新FriendsRequestListener());
Log.d(脸谱 - 示例 - 好友请求,已完成API请求);
}
@覆盖
公共无效onFacebookError(FacebookError错误){}
@覆盖
公共无效onerror的(DialogError E){}
@覆盖
公共无效OnCancel的(){}
});
}
}
@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据)
{
super.onActivityResult(要求code,因此code,数据);
mFacebook.authorizeCallback(要求code,因此code,数据);
}
公共类FriendsRequestListener实现com.facebook.android.AsyncFacebookRunner.RequestListener
{
/ **
*调用时得到朋友的请求已经完成。
*检索和分析,并显示JSON流。
* /
公共无效的onComplete(最后弦乐响应)
{
尝试
{
//过程中,这里的响应:在后台线程中执行
Log.d(脸谱 - 示例 - 好友请求,response.length():+ response.length());
Log.d(脸谱 - 示例 - 好友请求,回应:+响应);
最后的JSONObject JSON =新的JSONObject(响应);
JSONArray D = json.getJSONArray(数据);
int类型l =(D =空d.length():!?0);
Log.d(脸谱 - 示例 - 好友请求,d.length():+ 1);
的for(int i = 0; I<升;我++)
{
JSONObject的O = d.getJSONObject(我);
字符串n = o.getString(姓名);
字符串ID = o.getString(ID);
TextView的电视=新的TextView(Login.this);
tv.setText(N);
((的LinearLayout)的LinearLayout).addView(TV);
}
}
赶上(JSONException E)
{
Log.w(脸谱 - 示例,在JSON的错误反应);
}
}
}
}
我想我可能已经找到了问题。根据对onComplet文档;
/ **
*当给定响应的请求完成后调用。
*
*通过执行的后台线程:不更新该方法的UI。
* /
和您要更新的用户界面,所以addViews实际上并未体现在UI线程。您应该建立在性的方法,你可以用的onComplete调用runOnUIThread ..这样的事情;
runOnUiThread(新的Runnable(){
公共无效的run(){
inserFacebookNames(facebookContactNames);
}
});
让我知道如果这实际上修复它。我很好奇,如果是这样的原因。
I have a problem with accessing the graph API through my android application that retrieves a user's friends as JSONObject, extracts their names and displays them on the screen. It is supposed to be a simple and straightforward task but apparently it is not. When I run my application on Android Nexus I, I login to Facebook, then I am asked I click "Allow" button to grant permissions and I am redirected to a blank page. I am expect to see the name of my friends but it does not happen. Could some one assist me.
public class Login extends Activity
{
Facebook mFacebook = new Facebook("201509899926116");
AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(mFacebook);
String FILENAME = "AndroidSSO_data";
private SharedPreferences mPrefs;
View linearLayout;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
linearLayout = findViewById(R.id.main_layout);
/* Get existing access_token if any */
mPrefs = getPreferences(MODE_PRIVATE);
String access_token = mPrefs.getString("access_token", null);
long expires = mPrefs.getLong("access_expires", 0);
if(access_token != null)
{
mFacebook.setAccessToken(access_token);
}
if(expires != 0)
{
mFacebook.setAccessExpires(expires);
}
/* Only call authorize if the access_token has expired. */
if(!mFacebook.isSessionValid())
{
mFacebook.authorize(this, new String[] {"user_birthday","email",
"user_relationships","user_religion_politics","user_hometown",
"user_location","user_relationship_details","user_education_history",
"user_likes","user_interests", "user_activities"},
new DialogListener()
{
@Override
public void onComplete(Bundle values)
{
SharedPreferences.Editor editor = mPrefs.edit();
editor.putString("access_token", mFacebook.getAccessToken());
editor.putLong("access_expires", mFacebook.getAccessExpires());
editor.commit();
/* access the graph API */
Log.d("Facebook-Example-Friends Request", "Started API request");
mAsyncRunner.request("me/friends", new FriendsRequestListener());
Log.d("Facebook-Example-Friends Request", "Finished API request");
}
@Override
public void onFacebookError(FacebookError error) {}
@Override
public void onError(DialogError e) {}
@Override
public void onCancel() {}
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
mFacebook.authorizeCallback(requestCode, resultCode, data);
}
public class FriendsRequestListener implements com.facebook.android.AsyncFacebookRunner.RequestListener
{
/**
* Called when the request to get friends has been completed.
* Retrieve and parse and display the JSON stream.
*/
public void onComplete(final String response)
{
try
{
// process the response here: executed in background thread
Log.d("Facebook-Example-Friends Request", "response.length(): " + response.length());
Log.d("Facebook-Example-Friends Request", "Response: " + response);
final JSONObject json = new JSONObject(response);
JSONArray d = json.getJSONArray("data");
int l = (d != null ? d.length() : 0);
Log.d("Facebook-Example-Friends Request", "d.length(): " + l);
for (int i=0; i<l; i++)
{
JSONObject o = d.getJSONObject(i);
String n = o.getString("name");
String id = o.getString("id");
TextView tv = new TextView(Login.this);
tv.setText(n);
((LinearLayout) linearLayout).addView(tv);
}
}
catch (JSONException e)
{
Log.w("Facebook-Example", "JSON Error in response");
}
}
}
}
I think i might've found the issue.. According to the documentation on onComplet;
/**
* Called when a request completes with the given response.
*
* Executed by a background thread: do not update the UI in this method.
*/
And you are trying to update your UI, so addViews don't actually get reflected on the UI thread.. You should create a method in your activity that you can call from onComplete with runOnUIThread.. Something like this;
runOnUiThread(new Runnable() {
public void run() {
inserFacebookNames(facebookContactNames);
}
});
Let me know if this actually fixes it.. I'm curious if that was the reason..
这篇关于通过Android的应用程序不能访问Facebook好友的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!