5

उपयोगकर्ता एक बटन पर क्लिक करने के बाद फेसबुक पर लॉगिन करने का प्रयास कर रहा है और फिर एक बार सफलतापूर्वक लॉग इन हो जाने पर, नई गतिविधि बनाई जाती है।एक नई गतिविधि खोलने के लिए फेसबुक पर एक बटन लॉग इन करें

यह अब तक की मुख्य गतिविधि का कोड है!

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.ImageButton; 
import android.widget.Toast; 

import com.facebook.LoggingBehavior; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.Settings; 

public class MainActivity extends Activity { 

    @SuppressWarnings("unused") 
    private static final String URL_PREFIX_FRIENDS = "https://graph.facebook.com/me/friends?access_token="; 
    private Session.StatusCallback statusCallback = new SessionStatusCallback(); 
    private ImageButton fbImgButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     fbImgButton = (ImageButton)findViewById(R.id.imageView2); 

     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

     Session session = Session.getActiveSession(); 
     if(session == null) { 
      if(savedInstanceState != null) { 
       session = Session.restoreSession(this, null, statusCallback, savedInstanceState); 
      } 
      if(session== null) { 
       session = new Session(this); 
      } 
      Session.setActiveSession(session); 
      if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
       session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
      } 
     } 
     updateView(); 

    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Session.getActiveSession().addCallback(statusCallback); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     Session.getActiveSession().removeCallback(statusCallback); 
    } 

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

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
    } 

    private void updateView() { 
     Session session = Session.getActiveSession(); 
     if(session.isOpened()) { 
      Toast.makeText(getApplicationContext(), "Logged in....", Toast.LENGTH_LONG).show(); 
      fbImgButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { loginfb(); } 
      }); 
     } else { 
      fbImgButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View view) { onClickLogin(); } 
      }); 
     } 
    } 

    public void loginfb() { 
     //start the new activity here 
     //Toast.makeText(getApplicationContext(), "Works first", Toast.LENGTH_LONG).show(); 
     Intent intent = new Intent(MainActivity.this, SelectionFragment.class); 
     MainActivity.this.startActivity(intent); 

    } 

    private void onClickLogin() { 
     Session session = Session.getActiveSession(); 
     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
     } else { 
      Session.openActiveSession(this, true, statusCallback); 
     } 
     Intent intent = new Intent(MainActivity.this, SelectionFragment.class); 
     MainActivity.this.startActivity(intent); 
    } 

    public void shareOnTwitter(View v) { 
     EditText widget40 = (EditText)findViewById(R.id.widget40); 
     Uri uri = Uri.parse("https://twitter.com/intent/tweet?text=" + " @coolfacts_fb " + widget40.getText()); 
     Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
     startActivity(intent); 
    } 

    public void nofb(View v) { 
     Intent intent = new Intent(v.getContext(), shareTw.class); 
     startActivityForResult(intent, 0); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 

    } 

    private class SessionStatusCallback implements Session.StatusCallback { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      updateView(); 
     } 
    } 
} 

समस्या, कोई बात नहीं क्या, उपयोगकर्ता की वर्तमान स्थिति है, तो जैसे ही मैं फेसबुक लॉगइन के लिए बटन पर क्लिक करें के रूप में नई गतिविधि के लिए चला जाता है!

क्या कोई मेरी मदद कर सकता है?

+0

क्या ऐसा लगता है कि 'सत्र' खोला नहीं गया है, तो आप 'onClickLogin()' विधि में नहीं जा सकते हैं? –

+0

यह ऑनक्लिकॉगिन() विधि पर जा रहा है क्योंकि ये लाइनें काम कर रही हैं: इरादा इरादा = नया इरादा (मुख्य गतिविधि। यह, चयनफ्रेगमेंट.क्लास); MainActivity.this.startActivity (इरादा); – defiant

+0

@oDx क्या आपने नई गतिविधि शुरू करने से पहले फेसबुक प्रमाणीकरण काम कर लिया है? –

उत्तर

1

अपनी "ऑनक्लिक लॉजिक()" विधि के अंत में, सत्र शुरू होने से पहले आप प्रारंभिकता() को कॉल करते हैं। सत्र पृष्ठभूमि में खुलने शुरू होता है, लेकिन नई गतिविधि इसके शीर्ष पर चली जाएगी।

आपके कोड में ऐसा लगता है कि आपका अपडेट दृश्य() विधि सही जगह पर खुलने वाले सत्र पर प्रतिक्रिया करती है। सत्र स्थिति को खोलने पर स्टार्ट एक्टिविटी() को कॉल करने पर विचार करें।

2

इस के साथ प्रयास करें:

public class MainActivity extends Activity { 

    @SuppressWarnings("unused") 
    private static final String URL_PREFIX_FRIENDS = "https://graph.facebook.com/me/friends?access_token="; 
    private Session.StatusCallback statusCallback = new SessionStatusCallback(); 
    private ImageButton fbImgButton; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     fbImgButton = (ImageButton)findViewById(R.id.imageView2); 

     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

     // Add Session Callback Here 
     Session.getActiveSession().addCallback(statusCallback); 

     Session session = Session.getActiveSession(); 
     if(session == null) { 
      if(savedInstanceState != null) { 
       session = Session.restoreSession(this, null, statusCallback, savedInstanceState); 
      } 
      if(session== null) { 
       session = new Session(this); 
      } 
      Session.setActiveSession(session); 
      if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
       session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
      } 

      // Get Avtive Session again in case of session is null 
      Session session = Session.getActiveSession(); 
     } 

    // Dont call updateView() here as we have called this from session callback already. 
    // updateView(); 

    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Session.getActiveSession().addCallback(statusCallback); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     Session.getActiveSession().removeCallback(statusCallback); 
    } 

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

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
    } 

    // Minor changes made with updateView() Method flow 
    private void updateView() { 
     Session session = Session.getActiveSession();  
     fbImgButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) {  
      if(session.isOpened()){ 
       Toast.makeText(getApplicationContext(), "loginfb...", Toast.LENGTH_LONG).show(); 
       loginfb(); 
      } 
      else{ 
       Toast.makeText(getApplicationContext(), "onClickLogin...", Toast.LENGTH_LONG).show(); 
       onClickLogin(); 
      } 
      } 
     }); 
    } 

    public void loginfb() { 
     //start the new activity here 
     //Toast.makeText(getApplicationContext(), "Works first", Toast.LENGTH_LONG).show(); 
     Intent intent = new Intent(MainActivity.this, SelectionFragment.class); 
     MainActivity.this.startActivity(intent); 

    } 

    private void onClickLogin() { 
     Session session = Session.getActiveSession(); 
     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
     } else { 
      Session.openActiveSession(this, true, statusCallback); 
     } 
     Intent intent = new Intent(MainActivity.this, SelectionFragment.class); 
     MainActivity.this.startActivity(intent); 
    } 

    public void shareOnTwitter(View v) { 
     EditText widget40 = (EditText)findViewById(R.id.widget40); 
     Uri uri = Uri.parse("https://twitter.com/intent/tweet?text=" + " @coolfacts_fb " + widget40.getText()); 
     Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
     startActivity(intent); 
    } 

    public void nofb(View v) { 
     Intent intent = new Intent(v.getContext(), shareTw.class); 
     startActivityForResult(intent, 0); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 

    } 

    private class SessionStatusCallback implements Session.StatusCallback { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      updateView(); 
     } 
    } 
} 

OnCreate() और onStart() अंतर के लिए इस चेक। यह स्पष्ट रूप से ऑनस्टार्ट() पर पहले क्रिएट() को दिखाता है, इसलिए हमें ऑनरेट() विधि से भी सत्र कॉलबैक जोड़ने की आवश्यकता है।

Difference between onCreate() and onStart()

ध्यान दें: आप, के रूप में यह भी है() विधि अपने updateView रख सकते तार्किक कुछ भी गलत नहीं है।

उम्मीद है कि यह आपकी मदद करता है।

धन्यवाद।

+0

जब मैं सत्र सत्र = सत्र.getActiveSession(); oncreate() विधि को एप्लिकेशन को बंद करने के लिए बनाता है। – defiant

+0

मैं इसे फिर से कैसे बनाऊंगा ताकि जब यह गतिविधि लॉन्च की जाए तो यह केवल उपयोगकर्ता को लॉग इन करता है अगर वे क्लिक करते हैं लॉगिन बटन कोई फर्क नहीं पड़ता कि क्या? – ChuckKelly

+0

@oDx आपको यह जांचना होगा कि क्या यह मौजूद सत्र में जोड़ने की कोशिश करने से पहले यह शून्य हो रहा है या नहीं। –