2015-04-13 6 views
7

का उपयोग कर स्थान और ईमेल नहीं प्राप्त किया जा सकता है मेरे एंड्रॉइड एप्लिकेशन में मैंने इस कोड को मेरे खाते से लॉगिन करने और नाम, स्थान और ईमेल जैसी उपयोगकर्ता संपत्ति प्राप्त करने के लिए विकसित किया। समस्या यह है कि मैं नाम प्राप्त कर सकता हूं, लेकिन मुझे ईमेल और स्थान नहीं मिल रहा है। जब मैंने बिना किसी कोशिश किए मेरे कोड की कोशिश की तो एप्लिकेशन क्रश और getproperty("email") और getlocation() में मेरा लॉग पॉइंट पकड़ने का प्रयास करें। जब मैं कोशिश का उपयोग करता हूं। आवेदन काम करता है लेकिन कोई ईमेल या स्थान नहीं है। हालांकि, अगर आप, एक पुराने फेसबुक एसडीके का उपयोग कर रहे हैं, जबकि newest SDK is 4.0.+फेसबुक एपीआई

authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday")); 

:

public class Share extends Fragment {private static final String TAG ="Share";private UiLifecycleHelper uiHelper; 
private View otherView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // To maintain FB Login session 
     uiHelper = new UiLifecycleHelper(getActivity(), callback); 
     uiHelper.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.share, container, false); 
     // Looks for Login button 
     LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton); 
     authButton.setFragment(this); 
     // Set View that should be visible after log-in invisible initially 
     otherView = view.findViewById(R.id.other_views); 
     otherView.setVisibility(View.GONE); 
     //authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday")); 
     return view; 
    } 

    // Called when session changes 
    private Session.StatusCallback callback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state,Exception exception) { 
      onSessionStateChange(session, state, exception); 
     } 
    }; 

    // When session is changed, this method is called from callback method 
    private void onSessionStateChange(Session session, SessionState state,Exception exception) { 
     final TextView name = (TextView) getView().findViewById(R.id.name); 
     final TextView mail = (TextView) getView().findViewById(R.id.mail); 
     final TextView location = (TextView) getView().findViewById(R.id.location); 
     final TextView locale = (TextView) getView().findViewById(R.id.locale); 
     final TextView info = (TextView)getView().findViewById(R.id.msginfo); 
     final LinearLayout views= (LinearLayout)getView().findViewById(R.id.other_views); 

     if (state.isOpened()) { 
      Log.i(TAG, "Logged in..."); 
      // make request to the /me API to get Graph user 
      views.setVisibility(View.VISIBLE); 
      info.setText("You can now share images in facebook "); 
      Request.newMeRequest(session, new Request.GraphUserCallback() { 

       // callback after Graph API response with user 
       // object 
       @Override 
       public void onCompleted(GraphUser user, Response response) { 
        if (user != null) { 
         try { 
          // Set view visibility to true 
          otherView.setVisibility(View.VISIBLE); 
          // Set User name 
          name.setText("Hello " + user.getName()); 
          // Set Email 
          mail.setText("Your Email: " + user.getProperty("email").toString()); 
          locale.setText("Locale: " + user.getProperty("locale").toString()); 
          location.setText("Your Current Location: " + user.getLocation().getProperty("name").toString()); 

         } 
         catch(Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }).executeAsync(); 
     } else if (state.isClosed()) { 
      views.setVisibility(View.INVISIBLE); 
      info.setText("If you want to share images in Facebook, please Login"); 

      Log.i(TAG, "Logged out..."); 
      otherView.setVisibility(View.GONE); 
     } 
    } 


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

     uiHelper.onActivityResult(requestCode, resultCode, data); 
     Log.i(TAG, "OnActivityResult..."); 
    } 

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

    @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); 
    } 
} 
+0

क्या आपने अनुमतियों के लिए कहा है? – Skynet

+0

मुझे केवल इंटरनेट अनुमति की आवश्यकता है। मैं लॉगिन कर सकता हूं और अपनी छवि और मेरा उपयोगकर्ता नाम रख सकता हूं इसलिए मुझे नहीं लगता कि समस्या अनुमति में थी। – user3921905

+0

फेसबुक अनुमतियां मैं बात कर रहा हूं! – Skynet

उत्तर

18

मुद्दा है कि आप अनुमतियों के लिए नहीं पूछा है। नीचे, मैं आपको नवीनतम एपीआई के आधार पर फेसबुक लॉगिन के लिए एक पूर्ण नमूना कोड दूंगा। ध्यान रखें कि आपको पहले developers.facebook में documentation उल्लेख के रूप में अपना आवेदन जोड़ना होगा।

public class LoginActivity extends ActionBarActivity{ 

@Override 
protected void onActivityResult(int requestCode, int responseCode, Intent data) 
{ 
    super.onActivityResult(requestCode, responseCode, data); 
    callbackManager.onActivityResult(requestCode, responseCode, data); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(this.getApplicationContext()); 
    setContentView(R.layout.activity_login); 
    callbackManager = CallbackManager.Factory.create(); 
    loginButton = (LoginButton) findViewById(R.id.loginFaceBook_button); 
    List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile"); 
    loginButton.setReadPermissions(permissionNeeds); 

    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() 
    { 
     @Override 
     public void onSuccess(LoginResult loginResult) 
     { 
      System.out.println("onSuccess"); 
      GraphRequest request = GraphRequest.newMeRequest 
        (loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() 
        { 
         @Override 
         public void onCompleted(JSONObject object, GraphResponse response) 
         { 
          // Application code 
          Log.v("LoginActivity", response.toString()); 
          //System.out.println("Check: " + response.toString()); 
          try 
          { 
           String id = object.getString("id"); 
           String name = object.getString("name"); 
           String email = object.getString("email"); 
           String gender = object.getString("gender"); 
           String birthday = object.getString("birthday"); 
           System.out.println(id + ", " + name + ", " + email + ", " + gender + ", " + birthday); 
          } 
          catch (JSONException e) 
          { 
           e.printStackTrace(); 
          } 

         } 
        }); 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", "id,name,email,gender, birthday"); 
      request.setParameters(parameters); 
      request.executeAsync(); 
     } 

     @Override 
     public void onCancel() 
     { 
      System.out.println("onCancel"); 
     } 

     @Override 
     public void onError(FacebookException exception) 
     { 
      System.out.println("onError"); 
      Log.v("LoginActivity", exception.getCause().toString()); 
     } 
    }); 
    } 
} 

आप Fragment बजाय ActionBarActivity, उपयोग करने के लिए सिर्फ सही आपकी अनुमति पंक्ति के बाद loginButton.setFragment(this); जोड़ने चाहते हैं।

Manifest.xml:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<application 
    <!-- your other attrs..--> 
    <meta-data 
     android:name="com.facebook.sdk.ApplicationId" 
     android:value="@string/app_id"/> <!-- Get this one from developers.facebook --> 
    <activity 
     android:name="com.facebook.FacebookActivity" 
     android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" 
     android:theme="@android:style/Theme.Translucent.NoTitleBar" 
     android:label="@string/app_name"/> 

आप अपने आवेदन करने के लिए एक हैश कुंजी भी जोड़ने की आवश्यकता होगी।

try 
{ 
    //paste Your package name at the first parameter 
    PackageInfo info = getPackageManager().getPackageInfo("PUT_YOUR_PACKAGE_NAME_HERE", 
      PackageManager.GET_SIGNATURES); 
    for (android.content.pm.Signature signature : info.signatures) 
    { 
     MessageDigest md = MessageDigest.getInstance("SHA"); 
     md.update(signature.toByteArray()); 
     String sign = Base64.encodeToString(md.digest(), Base64.DEFAULT); 
     Log.e("MY KEY HASH:", sign); 
     Toast.makeText(getApplicationContext(),sign,  Toast.LENGTH_LONG).show(); 
    } 
} 
catch (PackageManager.NameNotFoundException e) 
{ 
} 
catch (NoSuchAlgorithmException e) 
{ 
} 

यह तुम बाहर हैश कुंजी प्रिंट के बाद, यह अपने facebook.developer खाता है, जहां अपनी परियोजना स्थित है करने के लिए पेस्ट आप कॉपी: यहाँ कोड के साथ ऐसा करने का एक तरीका है।

ग्रैंड में, आपको repositories में जोड़ना चाहिए और में compile 'com.facebook.android:facebook-android-sdk:4.0.0' भी जोड़ें।

buildscript { 
repositories { 
    jcenter() 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle:1.1.0' 
    // NOTE: Do not place your application dependencies here; they belong 
    // in the individual module build.gradle files 
} 
} 
allprojects 
{ 
repositories { 
    jcenter() 
    /*more project attrs..*/ 
    } 
} 

और अन्य grandle फ़ाइल:

apply plugin: 'com.android.application' 
android { 
compileSdkVersion 21 
buildToolsVersion "21.1.2" 

defaultConfig { 
    applicationId "YOUR_PACKAGE_NAME" 
    minSdkVersion 14 
    targetSdkVersion 21 
    versionCode 1 
    versionName "1.0" 
} 
buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
} 
}dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
compile 'com.android.support:appcompat-v7:21.0.3' 
compile 'com.facebook.android:facebook-android-sdk:4.0.0' 
} 

संपादित करें:

आदेश उपयोगकर्ता के स्थान को ट्रैक करने के लिए, आप एक जीपीएस ट्रैकर, this की तरह कुछ की आवश्यकता होगी। "user_location" अनुमति lon, lat वापस नहीं करती है, लेकिन Page ऑब्जेक्ट, जो मुझे लगता है कि आप क्या चाहते हैं नहीं है। इसलिए, आपकी अनुमति List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile"); होनी चाहिए और अब आप उपयोगकर्ता के ईमेल को पुनर्प्राप्त करने में सक्षम होना चाहिए

+0

धन्यवाद। मैं नवीनतम फेसबुक एसडीके तक जाता हूं, लेकिन मुझे build.gradle के साथ समस्या है, क्या आप मुझे अपना ग्रेडल भेज सकते हैं? – user3921905

+0

@ user3921905 मैंने build.grandle फ़ाइलों को जोड़ा था। 'com.facebook.android: facebook-android-sdk: 4.0.0''' यहां नौकरी करना चाहिए। मुझे बताएं कि क्या आपकी समस्या –

+0

तय की गई है, इसके अलावा, [यहां] (https://developers.facebook.com/docs/android/getting-started) प्रकट और भव्य सेट अप के बारे में पूर्ण दस्तावेज़ीकरण है। –

0

सबकुछ जाना अच्छा है लेकिन मुझे अलग-अलग fbid मिल रहा है। यहाँ मेरा कोड है।

Profile profile = Profile.getCurrentProfile(); 
if (profile != null) { 

    Log.e("profile.getId()" , "profile.getId()" + profile.getId()); 

} 
else 
{ 

    Log.e("profile.getId()" , "profile.getId() not available"); 
} 

Thanks in advance. 
+0

इसे वास्तव में अपने प्रश्न के रूप में पूछा जाना चाहिए ... यह किसी अन्य प्रश्न के उत्तर खंड में नहीं देखा जाएगा। –

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