2012-08-06 5 views
0

페이스 북 게시를 사용하는 응용 프로그램이 있습니다. 나는 때문에 내가 페이스 북에 게시 할 수 없습니다 표준 권한 부여 방법 힘 로그인페이스 북에 게시 nullpointer 시스템 오류

mFacebook.authorize(this, PERMS, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener()); 

대신

mFacebook.authorize(this, PERMS, new LoginDialogListener()); 

의를 사용하고 있습니다. 이제 포스트 작품,하지만 난이 오류를 얻을 :

:

이것은 페이스 북의 활동이다 : 그러나

08-06 20:35:52.814: W/System.err(682): java.lang.NullPointerException 
08-06 20:35:52.824: W/System.err(682): at com.b2creativedesigns.b2lovecalculator.FacebookActivity$IDRequestListener$1.run(FacebookActivity.java:147) 
08-06 20:35:52.824: W/System.err(682): at android.os.Handler.handleCallback(Handler.java:587) 
08-06 20:35:52.824: W/System.err(682): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-06 20:35:52.824: W/System.err(682): at android.os.Looper.loop(Looper.java:123) 
08-06 20:35:52.824: W/System.err(682): at android.app.ActivityThread.main(ActivityThread.java:4363) 
08-06 20:35:52.824: W/System.err(682): at java.lang.reflect.Method.invokeNative(Native Method) 
08-06 20:35:52.824: W/System.err(682): at java.lang.reflect.Method.invoke(Method.java:521) 
08-06 20:35:52.824: W/System.err(682): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
08-06 20:35:52.824: W/System.err(682): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
08-06 20:35:52.824: W/System.err(682): at dalvik.system.NativeStart.main(Native Method) 

을, 오류에도 불구하고, 나는 응용 프로그램에서 (강제 닫기) 눈에 보이는 오류가 없습니다 Log.d(TAG, "Response: " + response.toString());

가 왜이받을 수 있나요 : 그러나 나는 이름과 ID를 모두 볼 수있는 stactrace,이 선으로 인쇄

username.setText("Welcome: " + name+"\n ID: "+id); 라인에 오류 점

public abstract class FacebookActivity extends Activity { 
    public static final String TAG = "FACEBOOK"; 
    private Facebook mFacebook; 
    public static final String APP_ID = "blablabla"; //the API Key for your Facebook APPs 
    private AsyncFacebookRunner mAsyncRunner; 
    private static final String[] PERMS = new String[] { "publish_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(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()); 
        mFacebook.authorize(this, PERMS, Facebook.FORCE_DIALOG_AUTH, 
          new LoginDialogListener()); 
      } 
    } 

    public void logout() { 
     mContext = this; 

     try { 

      mFacebook = new Facebook(APP_ID); 
      mFacebook.logout(mContext); 
      //mFacebook.authorize(this, PERMS, -1, new LoginDialogListener()); 

      Log.d(TAG, "ssucesfull logout"); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

    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"); 
          FacebookActivity.this.runOnUiThread(new Runnable() { 
            public void run() { 
             try{ 
              username.setText("Welcome: " + name+"\n ID: "+id); //the error points to this line 
              pb.setVisibility(ProgressBar.GONE); 
             }catch(Exception e){ 
              e.printStackTrace(); 
             } 
            } 
          }); 
          postOnWall("The possibility of love between " + GlobalVars.getName1() + " and " + GlobalVars.getName2() + " is " + GlobalVars.getPercent() + "%!"); 
        } 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); 
    } 

    public void postOnWall(String msg) { 
     Log.d("Tests graph API %%%%%$$$$%%%", msg); 
     try { 
       String response = mFacebook.request("me"); 
       Bundle parameters = new Bundle(); 
       parameters.putString("message", msg); 
       parameters.putString("picture", "https://lh3.ggpht.com/f79UCpnLisZxO2P2C43f55YLvFpNco_cTcC-t9Ck-Qmqe5jwKbfnUvCh5N6-Te-mOw=w124"); 
       parameters.putString("link", "https://play.google.com/store/apps/details?id=com.b2creativedesigns.b2lovecalculator"); 

       response = mFacebook.request("me/feed", parameters,"POST"); 
       Log.d("Tests", "got response: " + response); 
       if (response == null || response.equals("") || 
         response.equals("false")) { 
        Log.v("Error", "Blank response"); 
       } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
     finally { 
      FacebookActivity.this.runOnUiThread(new Runnable() { 
        public void run() { 
         Toast.makeText(FacebookActivity.this, "Posted to Facebook", Toast.LENGTH_SHORT).show(); 
        } 
       }); 

     } 
    } 

} 
, 오류?

편집 :

이 나는 ​​버튼을 클릭하여 페이스 북의 포스트 프로세스를 호출하는 방법입니다

btnFB = (Button)findViewById(R.id.btnFB); 
btnFB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      setConnection(); 
      getID(txtUserName, pbLogin); 

     } 
    }); 

변수는 다음과 같이 정의되어 있지만에서 (할당 된 값이없는 튜토리얼) :

라고 getID(txtUserName, pbLogin);
TextView txtUserName; 
ProgressBar pbLogin; 

답변

0

위에서 언급 한 바와 같이, 모두 txtUserNamepbLoginnull입니다. 이로 인해 액세스하려고하면 NullPointerException이 표시됩니다.

튜토리얼의 내용에 관계없이이 필드를 할당해야합니다. IDRequestListener이 완료 될 때 TextViewProgressBar 개체가 있어야합니다. 그렇지 않으면 프로그램이 강제 종료됩니다.

따라서이 문제를 해결하려면 XML 또는 코드를 통해 TextViewProgressBar 개의 개체를 만들어야합니다. 나는 당신이 사용하는 튜토리얼이 이것을 말하는 것이라고 의심 할 것이다. btnFB을 할당 한 행 위에 findViewById을 사용하여 정의해야한다고 생각합니다.

+0

내 페이스 북 버튼 리스너에서 getId를 호출합니다. 편집 된 질문 참조 – erdomester

+0

변경 사항을 반영하여 답변을 편집했습니다. – Eric

관련 문제