2013-03-18 132 views
0

我想連接Facebook並在Facebook中獲取我的詳細信息,但是當我想獲取我的名字時,我得到一個帶有錯誤的JSONException:「」一個活動的訪問令牌必須用於查詢有關當前用戶「Facebook連接異常

我標誌着它的發生

非常感謝

這是我的班線:

public class MainActivity extends Activity { 

    private Button logInButton; 
    private TextView registerScreen; 
    private TextView userText; 
    private TextView passwordText; 
    private SharedPreferences loginPreferences; 
    private SharedPreferences.Editor loginPrefsEditor; 
    private Boolean saveLogin; 
    private CheckBox saveLoginCheckBox; 
    private Button buttonLoginLogout; 
    private ShareActionProvider provider; 
    private TextView forgotPassword; 
    private String userName=""; 


    private String friendsId=""; 
    private String friendsName=""; 
    private List<String> freindsIdList =new ArrayList<String>(); 

    String FILENAME = "AndroidSSO_data"; 
    private SharedPreferences mPrefs; 
    private Facebook facebook; 
    private AsyncFacebookRunner mAsyncRunner; 
    private static String APP_ID = "xxxxxx" ; 


    public void onCreate(Bundle savedInstanceState) { 



     super.onCreate(savedInstanceState); 

     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 

     setContentView(R.layout.login); 

     facebook = new Facebook(APP_ID); 
     mAsyncRunner = new AsyncFacebookRunner(facebook); 

     final LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     buttonLoginLogout=(Button) findViewById(R.id.facebooklog); 

     buttonLoginLogout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        loginToFacebook(); 
        getProfileInformation(); 
       } 
     }); 

    public void loginToFacebook() { 
     mPrefs = getPreferences(MODE_PRIVATE); 
     String access_token = mPrefs.getString("access_token", null); 
     long expires = mPrefs.getLong("access_expires", 0); 

     if (access_token != null) { 
      facebook.setAccessToken(access_token); 
     } 

     if (expires != 0) { 
      facebook.setAccessExpires(expires); 
     } 

     if (!facebook.isSessionValid()) { 
      facebook.authorize(this, 
        new String[] { "email", "publish_stream" }, 
        new DialogListener() { 

         @Override 
         public void onCancel() { 
          // Function to handle cancel event 
         } 

         @Override 
         public void onComplete(Bundle values) { 
          // Function to handle complete event 
          // Edit Preferences and update facebook acess_token 
          SharedPreferences.Editor editor = mPrefs.edit(); 
          editor.putString("access_token", 
            facebook.getAccessToken()); 
          editor.putLong("access_expires", 
            facebook.getAccessExpires()); 
          editor.commit(); 
         } 

         @Override 
         public void onError(DialogError error) { 
          // Function to handle error 

         } 

         @Override 
         public void onFacebookError(FacebookError fberror) { 
          // Function to handle Facebook errors 

         } 

        }); 
     } 
    } 




    public void getProfileInformation() { 
     mAsyncRunner.request("me", new RequestListener() { 
      @Override 
      public void onComplete(String response, Object state) { 
       Log.d("Profile", response); 
       String json = response; 
       try { 
        JSONObject profile = new JSONObject(json); 
        // getting name of the user 
        final String name = profile.getString("name");  //this line i get an JSONException with error: 
                     //"An active access token must be used to query information about the current user " 
        // getting email of the user 
        final String email = profile.getString("email"); 

        runOnUiThread(new Runnable() { 

         @Override 
         public void run() { 
          Toast.makeText(getApplicationContext(), "Name: " + name + "\nEmail: " + email, Toast.LENGTH_LONG).show(); 
         } 

        }); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 

      @Override 
      public void onIOException(IOException e, Object state) { 
      } 

      @Override 
      public void onFileNotFoundException(FileNotFoundException e, 
        Object state) { 
      } 

      @Override 
      public void onMalformedURLException(MalformedURLException e, 
        Object state) { 
      } 

      @Override 
      public void onFacebookError(FacebookError e, Object state) { 
      } 
     }); 
    } 

} 

這裏是logcat的:

03-18 12:24:32.081: W/System.err(858): org.json.JSONException: No value for name 
03-18 12:24:32.131: W/System.err(858): at org.json.JSONObject.get(JSONObject.java:354) 
03-18 12:24:32.131: W/System.err(858): at org.json.JSONObject.getString(JSONObject.java:510) 
03-18 12:24:32.150: W/System.err(858): at com.example.sale.MainActivity$3.onComplete(MainActivity.java:291) 
03-18 12:24:32.150: W/System.err(858): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:276) 
+0

PLZ加入其中U是響應表格服務器獲取JSON字符串 – 2013-03-18 12:19:41

+0

我加入的logcat也 – 2013-03-18 12:26:40

+0

確定PLZ檢查logcat(「Profile」,response);''作爲迴應的線路 – 2013-03-18 12:31:31

回答

2

我推薦使用Facebook新的Android 3.0 Facebook庫。它有一個很好的教程和預建類來管理狀態和查詢。它比原來的庫更簡單和更清潔的

https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

Wait till get my id and my freinds id facebook 瞭解更多信息

+0

我試圖使用最新的Facebook SDK 3.0,但我有沒有解決方案的大問題:http://stackoverflow.com/questions/15471107/wait-till-get-my-id-and-my-freinds-id-facebook,因此,我想嘗試另一個Facebook連接(或者也許有人有解決我的問題?)非常感謝 – 2013-03-18 12:30:56

+0

我回答了另一個問題,請看看它 – Darussian 2013-03-18 12:43:52