2013-02-20 10 views
11

अब मैं एक छोटी सी परियोजना कर रहा हूं जो शेयर बटन (संवाद) रखना चाहता है, जब उपयोगकर्ता इसे क्लिक करते हैं, तो वह अपने एफबी खाते में स्वतः लॉगिन करेगा और वे सामग्री साझा करें जो वे चाहते हैं।फेसबुक एंड्रॉइड एसडीके 3.0, लॉग इन बटन के बिना सामग्री कैसे साझा करें

fb dev से ट्यूटोरियल के बाद, मेरा ऐप दीवार पर सामग्री साझा कर सकता है, लेकिन साझा करने से पहले एक fblogin बटन से लॉगिन करने की आवश्यकता है।

मैं stackoverflow से एक पोस्ट पढ़ लिया है: Android - Facebook SDK 3 - How to login programmatically without LoginButton

अद्यतन: मैं अपने प्रोजेक्ट में onActivityResult साथ feedDialog लागू है, मैंने पाया कि मैं प्रवेश कर सकते हैं और एक बटन के साथ साझा करें। हाउवर, जब मैं ऐप का पुनर्निर्माण करता/अपने फोन को पुनरारंभ करता हूं, मुझे पहली बार पर साझा करने के लिए बटन को दो बार दबा देना है, लेकिन बाद में सामान्य (एक बार दबाएं) बनें।

P.S.I ShareActionProvider

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getSupportMenuInflater().inflate(R.menu.content_main, menu); 
    /** Getting the actionprovider associated with the menu item whose id is share */ 
    mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.share).getActionProvider(); 

    /** Getting the target intent */ 
    Intent intent = getDefaultShareIntent(); 

    /** Setting a share intent */  
    if(intent!=null){ 
     mShareActionProvider.setShareIntent(intent); 
     mShareActionProvider.setOnShareTargetSelectedListener(new OnShareTargetSelectedListener(){ 
      @Override 
      public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { 
       if ("com.facebook.katana".equals(intent.getComponent().getPackageName())){ 
        if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) { 
         Session.openActiveSession(Content.this, true, null); 
       }else{ 
         publishFeedDialog(); 
        } 
        return true; 
       } 
       return false; 
      } 
     }); 
    } 

    return super.onCreateOptionsMenu(menu); 
} 
@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
     if (Session.getActiveSession() != null || Session.getActiveSession().isOpened()) 
      publishFeedDialog(); 
    } 
private void publishFeedDialog() { 
     Bundle params = new Bundle(); 
     params.putString("name", "ab"); 
     params.putString("caption", "cd"); 
     params.putString("description", "def"); 
     params.putString("link", "https://developers.facebook.com/android"); 
     params.putString("picture", "abc.jpg"); 

     WebDialog feedDialog = (
      new WebDialog.FeedDialogBuilder(Content.this, 
       Session.getActiveSession(), 
       params)) 
      .setOnCompleteListener(new OnCompleteListener() { 

       @Override 
       public void onComplete(Bundle values, 
        FacebookException error) { 
        if (error == null) { 
         // When the story is posted, echo the success 
         // and the post Id. 
         final String postId = values.getString("post_id"); 
         if (postId != null) { 
          Toast.makeText(Content.this, 
           "Posted story, id: "+postId, 
           Toast.LENGTH_SHORT).show(); 
         } else { 
          // User clicked the Cancel button 
          Toast.makeText(Content.this.getApplicationContext(), 
           "Publish cancelled", 
           Toast.LENGTH_SHORT).show(); 
         } 
        } else if (error instanceof FacebookOperationCanceledException) { 
         // User clicked the "x" button 
         Toast.makeText(Content.this.getApplicationContext(), 
          "Publish cancelled", 
          Toast.LENGTH_SHORT).show(); 
        } else { 
         // Generic, ex: network error 
         Toast.makeText(Content.this.getApplicationContext(), 
          "Error posting story", 
          Toast.LENGTH_SHORT).show(); 
        } 
       } 

      }) 
      .build(); 
     feedDialog.show(); 
     } 
+0

जाओ मिंग के माध्यम से ली जवाब और उनकी टिप्पणी (दूसरा)। –

+0

मुझे पता है, लेकिन मैं वास्तव में थोड़ा और स्पष्टीकरण या कोड बीकॉक्स चाहता हूं जो मुझे समझ में नहीं आता ........ मैं एंड्रॉइड देव –

+0

@ कैल्विन चेन के लिए नया हूं, क्या आप इसे खींचने में सक्षम हैं? मैं उसी समाधान की तलाश में हूं जहां मैं फोटो – Casper

उत्तर

11

मुझे लगता है कि यह मुद्दा यह है कि जब आप मेनू बना रहे हैं, तो आप यह देखने के लिए जांचें कि सक्रिय सत्र शून्य है, और यदि ऐसा है, तो आप openActiveSession को कॉल करते हैं, और सक्रियता के लिए प्रतीक्षा करें।

यह सब सही है, फिर भी, यदि उपयोगकर्ता ने पहले आपके ऐप को अधिकृत किया है, तो एक्सेस टोकन इत्यादि सभी टोकन कैश में सहेजे जाते हैं, और ओपनएक्टिव सत्र कॉलिंग वास्तव में सत्र को तुरंत खोल देगा (एक्टिविटी रिसेट पर कॉल किए बिना)।

असली सही तरीका है स्टेटस कॉलबैक को अपनी खुली कॉल (शून्य के बजाए) में पास करना है, और उस कॉल में वापस, यह देखने के लिए जांचें कि सत्र खुला है या नहीं, और अपनी प्रकाशन FeedDialog विधि को कॉल करें।

0

LoginButton फेसबुक-sdk-3.0 के साथ इसे लागू किया है अमेरिकन प्लान से एक सत्र पाने के लिए सिर्फ एक उपकरण है।

यदि आप पहले ही एफबी से सत्र प्राप्त करते हैं, तो आपको प्रकाशित करने की अनुमति जांचनी होगी।

+0

साझा करूंगा, मुझे पता है, मैंने इसे लॉगिन बटन के साथ कार्यान्वित किया है। लेकिन मैं जो चाहता हूं उसे लॉगिन के बिना बनाना है –

15

धन्यवाद मिंग ली समाधान

मैं अंत में इस सवाल का जवाब मिल गया है के लिए बहुत बहुत !!!! नीचे कोड है, आशा है कि यह अन्य डेवलपर्स

private Session.StatusCallback callback = new Session.StatusCallback() { 
      @Override 
      public void call(Session session, SessionState state, 
      Exception exception) { 
      onSessionStateChange(session, state, exception); 
      } 
    }; 
    private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     if (state.isOpened()) { 
      publishFeedDialog(); 
     } 
    } 
    //........................ 
        if (Session.getActiveSession() == null || Session.getActiveSession().isClosed()) { 
          Session.openActiveSession(Content.this, true, callback); 
        }else{ 
          publishFeedDialog(); 
         } 
    //....................... 
    @Override 
     public void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
     } 
    private void publishFeedDialog() { 
      //........................ 
     } 
+0

आपको बहुत धन्यवाद, आकर्षण की तरह काम करता है – Casper

4

यह सही Getting Started ट्यूटोरियल में कवर किया जाता है मदद कर सकते हैं:

package com.firstandroidapp; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.widget.TextView; 
import com.facebook.*; 
import com.facebook.model.*; 

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

// start Facebook Login 
Session.openActiveSession(this, true, new Session.StatusCallback() { 

    // callback when session changes state 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
    if (session.isOpened()) { 

     // make request to the /me API 
     Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

     // callback after Graph API response with user object 
     @Override 
     public void onCompleted(GraphUser user, Response response) { 
      if (user != null) { 
      TextView welcome = (TextView) findViewById(R.id.welcome); 
      welcome.setText("Hello " + user.getName() + "!"); 
      } 
     } 
     }); 
    } 


    } 
    }); 
    } 

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

} 
संबंधित मुद्दे