2012-11-28 164 views
1

得到錯誤,這是我的MainActivity:的登錄和註銷使用Facebook SDK

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(上下文上下文)功能。他的代碼工作正常,但我的代碼沒有。

那麼,有什麼問題,我不明白。提前致謝。

N.B:我是Android和Facebook SDK中的新手。實際上,這是我在android中的第一個項目。我運行這個項目爲min android sdk 8,target sdk 16 當我在android 2.3.3(api 10)模擬器中運行它時,我可以很容易地註銷,但是當我在android 4.0.3中運行它(api 15)模擬器我可以登錄,但當我嘗試註銷應用程序崩潰時,我得到上述錯誤。

我下面的視頻教程:mybringback all 11 videos about facebook sdk in android

在視頻教程,他說,它是如此簡單。他使用facebook.logout(Context context)函數。他的代碼工作正常,但我的代碼沒有。

+0

請任何人都可以給我一些東西。我死在這裏:( – Shoshi

回答

0

啊哈,我都跟着AsyncFacebookRunner.java類使用其註銷方法,問題消失了。

myAsyncFB.logout(Context, RequestListener); 
0
在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); 

    } 
+0

但在視頻教程中,他完成了與我在我的問題中輸入相同的代碼,所以,如果他的應用程序運行良好,那麼我的應用程序也應該運行良好,但它不會。 。我不明白你的解決方案,因爲我是android和facebook sdk中的新手。那麼問題是什麼,我應該怎麼做?@ Mehelu1000 – Shoshi

0

您正在使用Facebook的SDK的版本太舊(是的,我知道這是最新出版)。因此,它在內部做的一些事情是打算在Froyo(2.2)上工作,並且不考慮ICS(4.0)引入的變化。

ICS中的一個變化就是應用程序的嚴格模式默認打開。嚴格模式在運行時對應用行爲進行一系列檢查,旨在確保最佳實踐和流暢的用戶體驗。一種這樣的檢查是應用程序是否在主線程上執行網絡請求。這是一個重要的檢查,因爲網絡請求可能會阻塞很長一段時間,在此期間UI(在主線程上呈現)將不響應用戶。

您在ICS上看到的錯誤就是 - 在主線程上嚴格檢查網絡請求在Facebook logout()方法中失敗。因此例外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 ... 

當然,這是簡單的版本,只是爲了解除你的。如果你希望你的用戶界面與註銷完成時的完全同步,你將不得不多寫一些代碼。

+0

我寫下你描述的代碼,但是eclipse說: 「這條線上的多個標記 - 無法從AsyncTask類型的非靜態方法exicute(Object ...)中進行靜態引用-AsyncTask是原始類型。對泛型類型的引用AsyncTask 應該參數化 -Type安全性:方法execut(Object ...)屬於原始類型AsyncTask。對泛型AsyncTask的引用應參數化「 那麼,我現在應該做什麼? @Franci Penov – Shoshi

+1

請確保您使用的API級別爲11(因爲此時添加了靜態執行方法)。如果您想支持較舊的API級別,那麼您需要創建自己的AsyncTask子類。 –

+0

啊,在API 11中增加了靜態'execute(Runnable)'方法。由於您的目標是min API 8,所以您必須編寫一些稍微不同的代碼,使用您自己的'AsyncTask'子類並調用'logout' 'doInBackground'覆蓋。 –

0

Facebook的API變化每隔幾天,這是一個廢話,但你可以檢查此proyect,我認爲這將是您的最佳選擇

https://github.com/facebook/facebook-android-sdk

+0

這是更適合作爲OP的評論,因爲即使它指向正確的位置(Android SDK的官方Facebook),也不能解決問題。 –