2015-04-13 5 views
7

Nella mia applicazione Android ho sviluppato questo codice per accedere con il mio account e ottenere proprietà utente come nome, posizione e e-mail. Il problema è che posso ottenere il nome, ma non riesco a ottenere l'email e la posizione. Quando ho provato il mio codice senza provare a catturare l'applicazione crush e il mio log point in getproperty("email") e getlocation(). Quando uso il tentativo. L'applicazione funziona ma non ci sono email o posizione.Impossibile ottenere la posizione e l'e-mail utilizzando l'API di Facebook

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

Hai chiesto le autorizzazioni? – Skynet

+0

ho bisogno solo del permesso di internet. Posso accedere e avere la mia immagine e il mio nome utente, quindi non credo che il problema fosse nell'autorizzazione. – user3921905

+0

Permessi di Facebook di cui sto parlando! – Skynet

risposta

18

Il problema è che non avete chiesto permesso:

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

Tuttavia, si sta utilizzando un vecchio Facebook SDK, mentre il newest SDK is 4.0.+. Di seguito, ti fornirò un codice di esempio completo per l'accesso a Facebook, basato sulla più recente API. Tieni presente che devi prima aggiungere la tua domanda in developers.facebook mentre lo documentation cita.

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()); 
     } 
    }); 
    } 
} 

Se si desidera utilizzare Fragment invece di ActionBarActivity, l'basta aggiungere loginButton.setFragment(this); subito dopo la linea di permesso.

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"/> 

Sarà necessario aggiungere alla vostra applicazione un tasto cancelletto troppo. Ecco un modo per farlo con il codice:

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) 
{ 
} 

Dopo che si visualizza la chiave hash, che si copia incolla al tuo facebook.developer conto, dove si trova il vostro progetto.

In grandle, è necessario aggiungere jcenter in repositories e aggiungere compile 'com.facebook.android:facebook-android-sdk:4.0.0' in dependecies.

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..*/ 
    } 
} 

E l'altro file Grandel:

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' 
} 

Edit:

Al fine di tracciare la posizione dell'utente, avrete bisogno di un GPS Tracker, qualcosa come this. L'autorizzazione "user_location" non restituisce un valore lon, lat, ma un oggetto Page, che a mio avviso non è quello che desideri. Quindi, le tue autorizzazioni dovrebbero essere List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile"); e ora dovresti essere in grado di recuperare l'email dell'utente

+0

grazie. passo al nuovissimo SDK di Facebook, ma ho problemi con build.gradle puoi inviarmi il tuo gradle per favore? – user3921905

+0

@ user3921905 Ho aggiunto i file build.grandle. 'com.facebook.android: facebook-android-sdk: 4.0.0'' dovrebbe fare il lavoro qui. Fammi sapere se è stato risolto il problema –

+0

Inoltre, [qui] (https://developers.facebook.com/docs/android/getting-started) è la documentazione completa su manifest e grandle. –

0

Tutto è buono, ma sto ottenendo il fbid diverso. ecco il mio codice

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

Questo dovrebbe davvero essere chiesto come una sua domanda ... Non sarà visto nella sezione Risposta di un'altra domanda. –

Problemi correlati