2014-02-14 21 views
0

我正在嘗試使用Facebook Android SDK登錄Facebook。我已經設置了Fragment來做到這一點。由於我需要讀取權限併發布權限,因此我正在運行自己的回調。在接受basic_infouser_birthday的第一個許可後,我收到錯誤消息。下面是我做這一切的片段:登錄Facebook。每個權限請求的回調,onActivityResult強制關閉

public class MainFragment extends Fragment { 

private UiLifecycleHelper uiHelper; 
private final List<String> permissions; 

public MainFragment() { 
    permissions = Arrays.asList("basic_info", "user_birthday"); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    uiHelper = new UiLifecycleHelper(getActivity(), callback); 
    uiHelper.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.main, container, false); 
    getActivity().getActionBar().hide(); 

    LoginButton authButton = (LoginButton) view.findViewById(R.id.FBButton); 
    authButton.setFragment(this); 
    authButton.setReadPermissions(permissions); 

    return view; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    uiHelper.onResume(); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    uiHelper.onActivityResult(requestCode, resultCode, data); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    uiHelper.onPause(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    uiHelper.onDestroy(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    uiHelper.onSaveInstanceState(outState); 
} 

private Session.StatusCallback callback = new Session.StatusCallback() { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     session.removeCallback(callback); 
     session.addCallback(newCall); 
     Log.i("MainFragment", "callback status called"); 
    } 
}; 

private Session.StatusCallback newCall = new Session.StatusCallback() { 

    Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("publish_actions")); 

    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     session.removeCallback(newCall); 
     session.addCallback(new Session.StatusCallback() { 
      @Override 
      public void call(Session session, SessionState state, Exception exception) { 
       if (session != null && session.isOpened()) { 

        //Running profile stuff 
        Request.newMeRequest(session, new Request.GraphUserCallback() { 

         @Override 
         public void onCompleted(GraphUser user, Response response) { 
          //In here I use the users profile information to send them to the correct activity. 
         } 

        }).executeAsync(); 

       } 
      } 
     }); 
Line 299:  session.requestNewPublishPermissions(request); 
    } 
}; 
} 

這裏是我的logcat錯誤:

02-14 14:20:36.668: E/AndroidRuntime(17146): FATAL EXCEPTION: main 
02-14 14:20:36.668: E/AndroidRuntime(17146): Process: com.package.name, PID: 17146 
02-14 14:20:36.668: E/AndroidRuntime(17146): java.lang.NullPointerException 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.facebook.Session$AuthorizationRequest$1.startActivityForResult(Session.java:1660) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.facebook.Session.tryLoginActivity(Session.java:1167) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.facebook.Session.authorize(Session.java:917) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.facebook.Session.requestNewPermissions(Session.java:1022) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.facebook.Session.requestNewPublishPermissions(Session.java:512) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.package.name.MainFragment$2.call(MainFragment.java:299) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.facebook.Session$3$1.run(Session.java:1303) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at android.os.Handler.handleCallback(Handler.java:733) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at android.os.Handler.dispatchMessage(Handler.java:95) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at android.os.Looper.loop(Looper.java:136) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at android.app.ActivityThread.main(ActivityThread.java:5017) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at java.lang.reflect.Method.invokeNative(Native Method) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at java.lang.reflect.Method.invoke(Method.java:515) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
02-14 14:20:36.668: E/AndroidRuntime(17146): at dalvik.system.NativeStart.main(Native Method) 

我被告知錯誤是因爲uiHelper不知道活動我說關於。我不確定這意味着什麼以及如何修復。希望這裏的某個人可以給我一些關於如何解決錯誤的建議。真的會有所幫助,我感覺這是讓這個工作成功的最後一步。第一個權限請求顯示,我接受,然後發生這種情況。

我真的很感謝任何幫助,在此先感謝。

+0

在你的代碼中發佈一些行號 –

+0

行299似乎是唯一指向某些東西,我補充說。其餘不適用。第95行是onResume方法中的空格,第136行是我沒有使用的完全註釋掉的方法。在第一個StatusCallback'回調'之前。 –

+0

你不能在堆棧跟蹤中找到一個空格(空行),它必須已經過期 –

回答

0

我想你的代碼必須已經更新,因爲你得到了堆棧跟蹤,基於上面的評論。

如果它是您已經編號的行,那麼它的可能性是請求爲空,因爲在之前的行中使用了該會話。檢查Session.NewPermissionsRequest是什麼回來,它可能不喜歡你的數據

+0

在一行一行的調試中有很多東西需要注意,它很難遵循。如果我讀得對,在第一次回調運行後data = null。你知道是否有更好的方式在日誌中顯示來確認嗎? –

+0

對,我至少在某處。我把Session.NewPermissionRequest放在它下面的public void call中,就在removecallback(newCall)之上。它調用發佈權限,我接受,然後再次運行第一個回調,屏幕上沒有任何反應。退出應用程序並再次輸入,我得到一個強制關閉告訴我試圖請求具有未決請求的會話的新權限。 –

+0

如果您使用的是android studio(也可能是大多數IDE),則可以使用各種過濾器來減少日誌記錄並查看重要的內容。您的新問題聽起來很值得您用新代碼作爲新問題開放 –