我使用Facebook SDK 3.0编写我的代码。登录facebook后,我想获得一些信息。
示例:(获取用户名,电子邮件或ID等)
我的程序第一次可以运行并获取此信息。
但如果我在手机上关闭我的程序而我想重新启动它,它会显示一些错误。
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@SuppressLint("NewApi")
public class MainActivity extends Activity implements OnClickListener {
ImageView FBLogin,Pic;
TextView show;
Facebook facebook;
SharedPreferences sp;
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//facebook key
sp = getPreferences(MODE_PRIVATE);
String token_access = sp.getString("token_access", null);
long expires = sp.getLong("access_expires", 0);
show = (TextView)findViewById(R.id.textView1);
if (token_access != null) {
facebook.setAccessToken(token_access);
Log.e("token","1");
}
if (expires != 0) {
facebook.setAccessExpires(expires);
Log.e("expires","2");
}
String app_id = getString(R.string.App_id);
facebook = new Facebook(app_id);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
FBLogin = (ImageView)findViewById(R.id.imageView1);
Pic = (ImageView)findViewById(R.id.pic);
FBLogin.setOnClickListener(this);
updata();
}
//update Btn Picture
private void updata() {
// TODO Auto-generated method stub
if (facebook.isSessionValid()) {
FBLogin.setImageResource(R.drawable.logout_button);
Pic.setVisibility(ImageView.VISIBLE);
JSONObject obj = null;
URL img_url = null;
try {
String jsonUser = facebook.request("me");
obj = Util.parseJson(jsonUser);
} catch (FacebookError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String id = obj.optString("id");
String name = obj.optString("name");
String email = obj.optString("email");
show.setText(id+"\n"+email+"\n"+name);
} else {
FBLogin.setImageResource(R.drawable.login_button);
Pic.setVisibility(ImageView.INVISIBLE);
}
}
//Btn login facebook
@SuppressWarnings("deprecation")
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (facebook.isSessionValid()) {
try {
facebook.logout(getApplicationContext());
updata();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
facebook.authorize(this,new String[] {"email","publish_stream"}, new DialogListener() {
@Override
public void onComplete(Bundle values) {
Editor Ed = sp.edit();
Ed.putString("token_access", facebook.getAccessToken());
Ed.putLong("expires", facebook.getAccessExpires());
Ed.commit();
updata();
Log.e("Login","onComplete");
} //Login Success
@Override
public void onFacebookError(FacebookError error) {
Log.e("Login","onFacebookError");
}
@Override
public void onError(DialogError e) {
Log.e("Login","onError");
}
@Override
public void onCancel() {
Log.e("Login","onCancel");
}
});
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e("Login","5");
facebook.authorizeCallback(requestCode, resultCode, data);
}
}
对不起,我忘了我的错误日志,这是我的错误日志
04-03 15:52:49.630: E/AndroidRuntime(28590): FATAL EXCEPTION: main
04-03 15:52:49.630: E/AndroidRuntime(28590): Process: com.faccbooktest, PID: 28590
04-03 15:52:49.630: E/AndroidRuntime(28590): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.faccbooktest/com.faccbooktest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.android.Facebook.setAccessToken(java.lang.String)' on a null object reference
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2411)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.ActivityThread.access$800(ActivityThread.java:144)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.os.Handler.dispatchMessage(Handler.java:102)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.os.Looper.loop(Looper.java:155)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.ActivityThread.main(ActivityThread.java:5696)
04-03 15:52:49.630: E/AndroidRuntime(28590): at java.lang.reflect.Method.invoke(Native Method)
04-03 15:52:49.630: E/AndroidRuntime(28590): at java.lang.reflect.Method.invoke(Method.java:372)
04-03 15:52:49.630: E/AndroidRuntime(28590): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
04-03 15:52:49.630: E/AndroidRuntime(28590): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
04-03 15:52:49.630: E/AndroidRuntime(28590): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.facebook.android.Facebook.setAccessToken(java.lang.String)' on a null object reference
04-03 15:52:49.630: E/AndroidRuntime(28590): at com.faccbooktest.MainActivity.onCreate(MainActivity.java:62)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.Activity.performCreate(Activity.java:5958)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
04-03 15:52:49.630: E/AndroidRuntime(28590): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
04-03 15:52:49.630: E/AndroidRuntime(28590): ... 10 more
你的facebook对象还没有实例化,你必须调用它,
facebook = new Facebook(app_id);
在这之前,
facebook.setAccessToken(token_access);