[英]Getting error for Login and Logout using facebook SDK
這是我的MainActivity:
package com.FBupdater;
import java.io.IOException;
import java.net.MalformedURLException;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;
import com.facebook.android.DialogError;
import com.facebook.android.Facebook;
import com.facebook.android.Facebook.DialogListener;
import com.facebook.android.FacebookError;
public class MainActivity extends Activity implements OnClickListener {
String APP_ID = getString(R.string.APP_ID);
Facebook fb;
ImageButton button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fb = new Facebook(APP_ID);
button = (ImageButton)findViewById(R.id.loginbtn);
button.setOnClickListener(this);
updateContentView();
}
private void updateContentView() {
// TODO Auto-generated method stub
if(fb.isSessionValid()){
Toast.makeText(MainActivity.this, "done", Toast.LENGTH_LONG).show();
button.setImageResource(R.drawable.logout);
}else{
button.setImageResource(R.drawable.login);
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(fb.isSessionValid()){
//button close our session - log out of facebook
try {
fb.logout(getApplicationContext());
updateContentView();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
//login to facebook
fb.authorize(MainActivity.this, new DialogListener() {
@Override
public void onFacebookError(FacebookError e) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onFBerror", Toast.LENGTH_LONG).show();
}
@Override
public void onError(DialogError e) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onError", Toast.LENGTH_LONG).show();
}
@Override
public void onComplete(Bundle values) {
// TODO Auto-generated method stub
updateContentView();
}
@Override
public void onCancel() {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "onCancel", Toast.LENGTH_LONG).show();
}
});
}
}
}
這是我的AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.FBupdater"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.FBupdater.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
這是我的activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center"
android:layout_gravity="center"
android:background="#000000" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="70dp"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notloggedinmessage"
android:textColor="#ffffff"
android:textSize="20sp" />
<ImageButton
android:id="@+id/loginbtn"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@drawable/login"
android:src="@drawable/login" />
</LinearLayout>
</LinearLayout>
這是錯誤日志:
////單擊注銷按鈕后:
11-28 15:22:56.824: D/AndroidRuntime(2123): Shutting down VM
11-28 15:22:56.824: W/dalvikvm(2123): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
11-28 15:22:57.034: E/AndroidRuntime(2123): FATAL EXCEPTION: main
11-28 15:22:57.034: E/AndroidRuntime(2123): android.os.NetworkOnMainThreadException
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
11-28 15:22:57.034: E/AndroidRuntime(2123): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
11-28 15:22:57.034: E/AndroidRuntime(2123): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
11-28 15:22:57.034: E/AndroidRuntime(2123): at java.net.InetAddress.getAllByName(InetAddress.java:220)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:460)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:432)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168)
11-28 15:22:57.034: E/AndroidRuntime(2123): at libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:270)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.facebook.android.Util.openUrl(Util.java:215)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.facebook.android.Facebook.request(Facebook.java:777)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.facebook.android.Facebook.request(Facebook.java:693)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.facebook.android.Facebook.logout(Facebook.java:652)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.timelystatusupdater.MainActivity.onClick(MainActivity.java:54)
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.view.View.performClick(View.java:3511)
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.view.View$PerformClick.run(View.java:14105)
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.os.Handler.handleCallback(Handler.java:605)
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.os.Handler.dispatchMessage(Handler.java:92)
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.os.Looper.loop(Looper.java:137)
11-28 15:22:57.034: E/AndroidRuntime(2123): at android.app.ActivityThread.main(ActivityThread.java:4424)
11-28 15:22:57.034: E/AndroidRuntime(2123): at java.lang.reflect.Method.invokeNative(Native Method)
11-28 15:22:57.034: E/AndroidRuntime(2123): at java.lang.reflect.Method.invoke(Method.java:511)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-28 15:22:57.034: E/AndroidRuntime(2123): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-28 15:22:57.034: E/AndroidRuntime(2123): at dalvik.system.NativeStart.main(Native Method)
11-28 15:22:57.534: D/dalvikvm(2123): GC_CONCURRENT freed 400K, 9% free 5888K/6407K, paused 10ms+34ms
11-28 15:22:57.874: I/dalvikvm(2123): threadid=3: reacting to signal 3
11-28 15:22:57.994: I/dalvikvm(2123): Wrote stack traces to '/data/anr/traces.txt'
11-28 15:23:07.315: I/Process(2123): Sending signal. PID: 2123 SIG: 9
他在視頻教程中說這很簡單。 他使用了facebook.logout(Context context)函數。 他的代碼工作正常,但我的代碼卻行不通。
所以,問題是什么,我不明白。 提前致謝。
注意:我是Android和Facebook SDK的新手。 實際上,這是我在android中的第一個項目。
我為最低android sdk 8,目標sdk 16運行了這個項目,當我在android 2.3.3(api 10)模擬器中運行它時,我可以很容易地注銷,但是當我在android 4.0.3(api 15)模擬器中運行時,我可以登錄,但是當我嘗試注銷該應用程序時發生崩潰,並且出現上述錯誤。
我正在關注一個視頻教程: 將Android上有關sdk的所有11個視頻全部回撥
他在視頻教程中說這很簡單。 他使用了facebook.logout(Context context)
函數。 他的代碼工作正常,但我的代碼卻行不通。
在您的facebook.java中,只有一個功能...
public void authorize(Activity activity, String[] permissions, int activityCode, final DialogListener listener)
{
boolean singleSignOnStarted = true;
mAuthDialogListener = listener;
Log.d("in authorise", "authorise");
// Prefer single sign-on, where available.
**if (activityCode >= 0)
{
Log.d("single sign", "single sign");
singleSignOnStarted = startSingleSignOn(activity, mAppId, permissions, activityCode);
}**/////put comment for this code...
// Otherwise fall back to traditional dialog.
// else
startDialogAuth(activity, permissions);
}
您使用的Facebook SDK版本比較舊(是的,我知道它是最新發布的)。 因此,它在內部執行的某些操作旨在在Froyo(2.2)上運行,而不考慮ICS(4.0)引入的更改。
ICS中的此類更改之一是,默認情況下,應用程序的嚴格模式已打開。 嚴格模式在運行時將一堆檢查應用於應用行為,以確保最佳實踐和流暢的用戶體驗。 其中一項檢查是該應用程序是否正在主線程上執行網絡請求。 這是一項重要的檢查,因為網絡請求可能會長時間阻塞,在此期間,UI(呈現在主線程上)將對用戶無響應。
您在ICS上看到的錯誤正好是-Facebook logout()
方法中對主線程上的netwrok請求的嚴格檢查失敗。 因此出現了NetworkOnMainThread
異常。
為了避免這種情況,您可以在onClickListener
中將AsyncTask
與簡單的Runnable
使用(使用靜態AsyncTask.execute()
方法)以在另一個線程上啟動注銷。 這樣的事情(用瀏覽器編寫的代碼,因此請檢查是否合理):
// ... cut ...
if(fb.isSessionValid()){
//button close our session - log out of facebook
try {
AsyncTask.execute(new Runnable() {
@Override
public void run() {
fb.logout(getApplicationContext());
// You can also use MainActivity.this instead of getApplicationContext()
}
});
updateContentView();
} catch (MalformedURLException e) {
// ... cut ...
當然,這是簡單的版本,只是為了解除對您的限制。 如果您希望UI與注銷完成時完全同步,則必須編寫更多代碼。
Facebook API每天都在變化,這是一個廢話,但是您可以檢查這個proyect,我認為它將非常適合您
啊哈,我遵循了AsyncFacebookRunner.java類,並使用了其注銷方法,問題解決了。
喜歡
myAsyncFB.logout(Context, RequestListener);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.