2011-07-12 53 views
0

我跟着这个教程在线设置我的android应用程序的Facebook SDK。它的工作原理,直到在用户登录,然后当它崩溃我得到的logcat此错误Facebook的Android SDK NullPointerException

07-12 16:59:29.783: ERROR/AndroidRuntime(556): FATAL EXCEPTION: main 
07-12 16:59:29.783: ERROR/AndroidRuntime(556): java.lang.NullPointerException 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at com.outfit.first.FBConnectionActivity$IDRequestListener$1.run(FBConnectionActivity.java:129) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at android.os.Handler.handleCallback(Handler.java:587) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at android.os.Looper.loop(Looper.java:123) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at android.app.ActivityThread.main(ActivityThread.java:3839) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
07-12 16:59:29.783: ERROR/AndroidRuntime(556):  at dalvik.system.NativeStart.main(Native Method) 

我的整个代码波纹管,我出演的是logcat的说叫错误的线,在这条线:

username.setText("Welcome: " + name+"\n ID: "+id); 

任何人都可以帮我弄清楚我做错了什么?我感觉自己很靠近它的工作。

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.net.MalformedURLException; 

import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import com.facebook.android.AsyncFacebookRunner; 
import com.facebook.android.DialogError; 
import com.facebook.android.Facebook; 
import com.facebook.android.FacebookError; 
import com.facebook.android.Util; 
import com.facebook.android.AsyncFacebookRunner.RequestListener; 
import com.facebook.android.Facebook.DialogListener; 

public abstract class FBConnectionActivity extends Activity { 
    public static final String TAG = "FACEBOOK"; 
    private Facebook mFacebook; 
    public static final String APP_ID = "IDHERE"; 
    private AsyncFacebookRunner mAsyncRunner; 
    private static final String[] PERMS = new String[] { "read_stream" }; 
    private SharedPreferences sharedPrefs; 
    private Context mContext; 

    private TextView username; 
    private ProgressBar pb; 

    public void setConnection() { 
      mContext = this; 
      mFacebook = new Facebook(APP_ID); 
      mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
    } 

    public void getID() { 
     if (isSession()) { 
      Log.d(TAG, "sessionValid"); 
      mAsyncRunner.request("me", new IDRequestListener()); 
     } else { 
      // no logged in, so relogin 
      Log.d(TAG, "sessionNOTValid, relogin"); 
      mFacebook.authorize(this, PERMS, new LoginDialogListener()); 
     } 
    } 

    public void getID(TextView txtUserName, ProgressBar progbar) { 
      username = txtUserName; 
      pb = progbar; 
      if (isSession()) { 
        Log.d(TAG, "sessionValid"); 
        mAsyncRunner.request("me", new IDRequestListener()); 
      } else { 
        // no logged in, so relogin 
        Log.d(TAG, "sessionNOTValid, relogin"); 
        mFacebook.authorize(this, PERMS, new LoginDialogListener()); 
      } 
    } 

    public boolean isSession() { 
      sharedPrefs = PreferenceManager.getDefaultSharedPreferences(mContext); 
      String access_token = sharedPrefs.getString("access_token", "x"); 
      Long expires = sharedPrefs.getLong("access_expires", -1); 
      Log.d(TAG, access_token); 

      if (access_token != null && expires != -1) { 
        mFacebook.setAccessToken(access_token); 
        mFacebook.setAccessExpires(expires); 
      } 
      return mFacebook.isSessionValid(); 
    } 

    private class LoginDialogListener implements DialogListener { 

      @Override 
      public void onComplete(Bundle values) { 
        Log.d(TAG, "LoginONComplete"); 
        String token = mFacebook.getAccessToken(); 
        long token_expires = mFacebook.getAccessExpires(); 
        Log.d(TAG, "AccessToken: " + token); 
        Log.d(TAG, "AccessExpires: " + token_expires); 
        sharedPrefs = PreferenceManager 
            .getDefaultSharedPreferences(mContext); 
        sharedPrefs.edit().putLong("access_expires", token_expires) 
            .commit(); 
        sharedPrefs.edit().putString("access_token", token).commit(); 
        mAsyncRunner.request("me", new IDRequestListener()); 
      } 

      @Override 
      public void onFacebookError(FacebookError e) { 
        Log.d(TAG, "FacebookError: " + e.getMessage()); 
      } 

      @Override 
      public void onError(DialogError e) { 
        Log.d(TAG, "Error: " + e.getMessage()); 
      } 

      @Override 
      public void onCancel() { 
        Log.d(TAG, "OnCancel"); 
      } 
    } 

    private class IDRequestListener implements RequestListener { 

      @Override 
      public void onComplete(String response, Object state) { 
        try { 
          Log.d(TAG, "IDRequestONComplete"); 
          Log.d(TAG, "Response: " + response.toString()); 
          JSONObject json = Util.parseJson(response); 

          final String id = json.getString("id"); 
          final String name = json.getString("name"); 
          FBConnectionActivity.this.runOnUiThread(new Runnable() { 
            public void run() { 
            //!!!line 129!!!  username.setText("Welcome: " + name+"\n ID: "+id); 
              pb.setVisibility(ProgressBar.GONE); 

            } 
          }); 
        } catch (JSONException e) { 
          Log.d(TAG, "JSONException: " + e.getMessage()); 
        } catch (FacebookError e) { 
          Log.d(TAG, "FacebookError: " + e.getMessage()); 
        } 
      } 

      @Override 
      public void onIOException(IOException e, Object state) { 
        Log.d(TAG, "IOException: " + e.getMessage()); 
      } 

      @Override 
      public void onFileNotFoundException(FileNotFoundException e, 
          Object state) { 
        Log.d(TAG, "FileNotFoundException: " + e.getMessage()); 
      } 

      @Override 
      public void onMalformedURLException(MalformedURLException e, 
          Object state) { 
        Log.d(TAG, "MalformedURLException: " + e.getMessage()); 
      } 

      @Override 
      public void onFacebookError(FacebookError e, Object state) { 
        Log.d(TAG, "FacebookError: " + e.getMessage()); 
      } 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      mFacebook.authorizeCallback(requestCode, resultCode, data); 
    } 
} 

编辑: 所以这是我的活动,从一个按钮,点击开始Facebook的代码:

ImageButton combine = (ImageButton) findViewById(R.id.CompressImg); 
     combine.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       setConnection(); 
       getID(); 
       //createoneimage("final.png");   
      } 
      }); 

这是我main.java类即时通讯真的不知道它做什么:

public class main extends FBConnectionActivity { 
    private TextView txtUserName; 
    private ProgressBar pbLogin; 
    private Button btnLogin; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainfb); 

    txtUserName = (TextView) findViewById(R.id.textFacebook); 
    pbLogin = (ProgressBar) findViewById(R.id.progressLogin); 
    btnLogin = (Button) findViewById(R.id.buttonLogin); 
      btnLogin.setOnClickListener(new OnClickListener() { 
        @Override 
        public void onClick(View arg0) { 
          pbLogin.setVisibility(ProgressBar.VISIBLE); 
          setConnection(); 
          getID(txtUserName, pbLogin); 
        } 
      }); 
} 
} 

最后,这是我mainfb.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <TextView android:layout_width="fill_parent" android:id="@+id/textFacebook" 
       android:gravity="center_horizontal" android:layout_height="wrap_content" 
       android:text="@string/welcome" android:layout_alignParentTop="true" /> 
     <Button android:text="@string/enter" android:id="@+id/buttonLogin" 
       android:layout_below="@+id/textFacebook" 
       android:layout_centerHorizontal="true" android:layout_width="wrap_content" 
       android:layout_height="wrap_content" android:layout_marginTop="30dip"></Button> 
     <ProgressBar android:id="@+id/progressLogin" 
       android:layout_centerInParent="true" android:layout_width="wrap_content" 
       android:visibility="gone" android:layout_height="wrap_content"></ProgressBar> 
</RelativeLayout> 

编辑2: 因为我一直在使用这个代码ive认识到,每当我第一次登录应用程序崩溃时使用此代码,然后第二次登录时它已经保存了fb用户信息。 Bellow是我在碰撞时得到的logcat错误。我不确定它是否真的第二次工作,因为我没有得到任何错误,但是当我尝试发布到我的fb墙时,它会得到错误。

07-16 21:46:16.720: ERROR/AndroidRuntime(818): FATAL EXCEPTION: main 
07-16 21:46:16.720: ERROR/AndroidRuntime(818): java.lang.NullPointerException 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at com.outfit.first.FBConnectionActivity$IDRequestListener$1.run(FBConnectionActivity.java:169) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at android.os.Handler.handleCallback(Handler.java:587) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at android.os.Looper.loop(Looper.java:123) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at android.app.ActivityThread.main(ActivityThread.java:3839) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
07-16 21:46:16.720: ERROR/AndroidRuntime(818):  at dalvik.system.NativeStart.main(Native Method) 
+0

一个可能的问题是,您在IDRequestListener中获取的JSON不包含“name”对象 - 这会导致json.getString(“name”)返回null。你在log.d中看到了什么(TAG,“Response:”+ response.toString())行? – Torid

+0

@Torid - JSON确实返回一个名称对象,它是来自Facebook的标准响应的一部分。 @Peter - 您可以发布布局xml和代码实现此类的活动.FBConnectionActivity类没有问题,因此您的错误必须来自其他类。 – Kenny

+0

你也可以在你的代码中标记什么行是数字129,我认为它是username.setText(....或pb。setVisibility(....让我知道哪一个。 – Kenny

回答

2

行,所以我觉得你的问题是,你的getID()方法使用,然后试图设置一个TextView的用户名和ID是null,因为您的通话getID(),而没有经过的TextView或进度作为该IDRequestListener参数。所以,你有两个选择,一是你可以只添加此功能,您FBConnectionActivity类:

public void login(){ 
    if (!isSession()) { 
     // no logged in, so relogin 
     Log.d(TAG, "login"); 
     mFacebook.authorize(this, PERMS, new LoginDialogListener()); 
    } 
} 

然后,而不是调用getID()就叫login() - 这样你就跳过IDRequestListener,因此也就没有空指针。或者你可以简单地把一个try/catch周围有问题的代码:

try{ 
    username.setText("Welcome: " + name+"\n ID: "+id); 
    pb.setVisibility(ProgressBar.GONE); 
}catch(Exception e){ 
    e.printStackTrace(); 
} 

这将捕获异常,并继续进行。

编辑:通过我的回答infact看我注意到,loginDialogListener使用IDRequestListener所以你或者需要删除调用来设置文本视图和进度条或把try/catch!

+0

当我在第二行pd = progDialog粘贴这个;出现错误“不能被取消”我认为它的suppoded是“pb”而不是“pd”,但仍然会出现错误。 – Peter

+0

对不起,我从一个项目复制/粘贴,我使用对话框而不是进度条,我也编辑了代码,所以你不需要pd = progDialog;线! – Kenny

+0

它的工作,非常感谢你的帮助! – Peter