Facebook Android SDK NullPointerException

Facebook Android SDK NullPointerException,android,facebook,Android,Facebook,我在线学习了本教程,为我的android应用程序设置了facebook sdk。它一直工作到用户登录,然后当它崩溃时,我在logcat中得到这个错误 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/An

我在线学习了本教程,为我的android应用程序设置了facebook sdk。它一直工作到用户登录,然后当它崩溃时,我在logcat中得到这个错误

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>

好的,我认为您的问题在于您的
getID()
方法使用
IDRequestListener
,然后它试图在文本视图中设置用户名和id,该文本视图为空,因为调用
getID()
时没有将文本视图或进度条作为参数传递。所以您有两个选项,首先您可以将此函数添加到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();
}
它将捕获异常并继续


编辑:事实上,在查看我的答案时,我注意到
logindialglistener
使用了
IDRequestListener
,因此您需要删除调用以设置文本视图和进度栏,或者将try/catch放入其中

一个可能的问题是您在IDRequestListener中返回的JSON不包含“name”对象,这将导致JSON.getString(“name”)返回null。对于Log.d(标记,“Response:+Response.toString())行,您在logcat中看到了什么?@Torid——JSON确实返回了一个名称对象,它是facebook标准响应的一部分@Peter-您可以发布实现该类的活动的布局xml和代码吗。FBConnectionActivity类没有问题,因此您的错误一定来自另一个类。您还可以在代码中标记第129行,我认为是username.setText(..)或pb.setVisibility(…让我知道是哪一个。对不起,是username.setText。我会把它添加到帖子右侧now@Torid-另一件事是,如果是由于JSON不包含名为name的对象,它将引发JSON异常而不是空指针异常。当我在第二行pd=progDialog中粘贴此异常时,出现错误“无法解析”.我想应该是“pb”而不是“pd”但这仍然会出现错误。很抱歉,我是从一个使用对话框而不是进度条的项目中复制/粘贴的,我刚刚编辑了代码,所以您不需要pd=progDialog;行!不用担心-如果您遇到其他“facebooky”问题,只需在此处发表评论并链接到您的新问题!谢谢,我非常感激我有一些问题,我刚刚更新了我希望你能帮忙的问题?
try{
    username.setText("Welcome: " + name+"\n ID: "+id);
    pb.setVisibility(ProgressBar.GONE);
}catch(Exception e){
    e.printStackTrace();
}