2015-04-13 2 views
7

В моем приложении для Android я разработал этот код для входа в мою учетную запись и получения пользовательской собственности, такой как имя, местоположение и адрес электронной почты. Проблема в том, что я могу получить имя, но я не могу получить адрес электронной почты и местоположение. Когда я попробовал свой код, не пытаясь поймать раздачу приложения и мой лог-пункт в getproperty("email") и getlocation(). Когда я использую попытку. Приложение работает, но нет электронной почты или местоположения.Не удается найти местоположение и адрес электронной почты с помощью Facebook API

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

Права на Facebook Я говорю! – Skynet

ответ

18

Вопрос заключается в том, что вы не просили разрешения:

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

Однако, вы используете старую Facebook SDK, в то время как newest SDK is 4.0.+. Ниже я дам вам полный образец кода для входа в Facebook, основанный на новейшем API. Имейте в виду, что сначала необходимо добавить свое приложение в 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 счет, где ваш проект находится.

В граде, вы должны добавить jcenter в repositories, а также добавить compile 'com.facebook.android:facebook-android-sdk:4.0.0' в 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..*/ 
    } 
} 

А другой 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' 
} 

Edit:

Для того, чтобы отслеживать местоположение пользователя, вы будете нуждаться в GPS Tracker, что-то вроде this. "user_location" разрешение не возвращает lon, lat, но объект Page, который, я думаю, не то, что вы хотите. Итак, ваши разрешения должны быть List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile");, и теперь вы сможете получить электронное письмо пользователя

+0

спасибо. Я перехожу к новейшему фейсбуку sdk, но у меня проблема с 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) - полная документация о настройке манифеста и grandle. –

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

Это действительно нужно задать как собственный вопрос ... Это не будет видно в разделе «Ответ» другого вопроса. –

Смежные вопросы