2015-04-21 2 views
2

Я проверил ниже. Это очень похоже, но это не моя проблема.Как запросить отклоненные разрешения в Facebook SDK 4.0 (android)

How to re-request permissions in Facebook SDK 4.0

Я получил разрешение в этом коде.

LoginManager.getInstance().logInWithReadPermissions(*fragment*, "user_friends"); 

Если пользователь отклонить «user_friends» разрешение, я не могу вновь спросить «user_friends» разрешения выше кода. Потому что автоматически отклоняется при следующей аутентификации.

Какие действия следует делать, чтобы получить «user_friends» программным путем?

ответ

7

его просто просто использовать

LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Log.e(TAG, "LoginManager FacebookCallback onSuccess"); 

      if (loginResult.getAccessToken() != null) { 
       Set<String> deniedPermissions = loginResult.getRecentlyDeniedPermissions(); 

       if (deniedPermissions.contains("user_friends")) { 

        LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("user_friends")); 

       } 
      } 
     } 

     @Override 
     public void onCancel() { 
      Log.e(TAG, "LoginManager FacebookCallback onCancel"); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      Log.e(TAG, "LoginManager FacebookCallback onError"); 
     } 
    }); 

и не забудьте инициализировать Fb SDK перед вызовом setContentView (R.layout.main) т.е.

// Create callback manager to handle login response 
    FacebookSdk.sdkInitialize(getApplicationContext()); 
    callbackManager = CallbackManager.Factory.create(); 
+0

спасибо. Оно работает! но у меня возникли другие проблемы ... поэтому я отделил второй запрос и покажу сообщение на 1-ом завершении. – kyanro

+0

Не работает с разрешением электронной почты. Диалоговое окно запроса не отображается, оно все равно возвращает предыдущий результат. – marino

+0

Что делать, если второй раз лишить разрешения? Как я могу запросить еще раз? Как узнать, предоставил ли пользователь разрешение после отклонения нескольких раз? –

1
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    fb = (ImageView) findViewById(R.id.authFacebook); 
    setFacebookData(savedInstanceState); 

    fb.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile", "email")); 
     } 
    }); 
} 

private void setFacebookData(Bundle savedInstanceState) { 
    FacebookSdk.sdkInitialize(MainActivity.this); 
    callbackManager = CallbackManager.Factory.create(); 
    LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 

     @Override 
     public void onSuccess(LoginResult result) { 
      Log.i("LoginActivity","onSuccess Facebook Login"+result); 
      GraphRequest request = GraphRequest.newMeRequest(
        AccessToken.getCurrentAccessToken(), 
        new GraphRequest.GraphJSONObjectCallback() { 
         @Override 
         public void onCompleted(JSONObject jsonObject, GraphResponse response) { 
          Log.d("","onCompleted jsonObject: "+jsonObject); 
          Log.d("","onCompleted response: "+response); 
         } 
        }); 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", "id,name,link,cover,email"); 
      request.setParameters(parameters); 
      request.executeAsync(); 
     } 

     @Override 
     public void onCancel() { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onError(FacebookException e) { 
      // TODO Auto-generated method stub 
      Log.e("LoginActivity","ERROR: "+e.getMessage()); 
     } 
    }); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.d("FbLogin", "Result Code is = " + resultCode +""); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
} 

В Manifest Добавить файл эти строки

<meta-data 
     android:name="com.facebook.sdk.ApplicationId" 
     android:value="@string/app_id" /> 

    <provider 
     android:name="com.facebook.FacebookContentProvider" 
     android:authorities="com.facebook.app.FacebookContentProvider355198514515820" 
     android:exported="true" /> 
      <receiver android:name="laddu.fbexample.HelloFacebookBroadcastReceiver" > 
     <intent-filter> 
      <action android:name="com.facebook.platform.AppCallResultBroadcast" /> 
     </intent-filter> 
    </receiver> 
0

Решение пользователя2403096 хорошо работает, но я столкнулся с некоторыми проблемами и потратил некоторое время на его устранение. Если Пользователь отозвана некоторое разрешение через консоль или как-то еще, и вам это нужно в вашем приложении во время входа в систему (например, мне нужно разрешение по электронной почте) Я использую код, user2403096:

LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
    @Override 
    public void onSuccess(LoginResult loginResult) { 
     if (loginResult.getRecentlyDeniedPermissions().contains("email")) { 
     LoginManager.getInstance().logInWithReadPermissions(
       this, (Collections.singletonList("email"))); 
     } else { 
      performGraphRequest(); 
     } 
    } 

    @Override 
    public void onCancel() { 
     Log.e(TAG, "LoginManager FacebookCallback onCancel"); 
    } 

    @Override 
    public void onError(FacebookException e) { 
     Log.e(TAG, "LoginManager FacebookCallback onError"); 
    } 
}); 

performGraprhRequest() просто получает данные профиля, с GraphRequest.newMeRequest (токен, обратный вызов). Поэтому, когда вы повторно запрашиваете разрешение, будет обратный вызов в onActivityResult, но onSuccess(), onCancel() или onError() НЕ будет вызываться снова. Мой подход:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    boolean processed = mCallbackManager.onActivityResult(requestCode, resultCode, data); 
    if (!processed) { 
     performGraphRequest(); 
    } 
} 

Если вы входите в Facebook и введите свои учетные данные - onActivityResult будет обработан CallbackManager и возвращает истину. CallbackManager под капотом проверяет, является ли ваш текущий AccessToken нулевым или нет, и если вы уже вошли в систему, а затем повторно запрашиваете разрешение - у вас будет токен, а callbackManager.onActivityResult возвращает false. Затем вы можете вызвать performGraphRequest и войти в свое приложение.

0

Просто улучшение ответа @Naveedumar «s

Вы также можете сделать

LoginManager.getInstance() 
.logInWithReadPermissions(MainActivity.this, 
new ArrayList<String>(AccessToken.getCurrentAccessToken().getDeclinedPermissions())); 
Смежные вопросы