How to re-ask declined permissions in Facebook SDK 4.0 (android)

最后都变了- 提交于 2019-12-05 04:48:35

问题


I checked below. It is very similar but it is not same my problem.

How to re-request permissions in Facebook SDK 4.0

I got permissions in this code.

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

If a user reject "user_friends" permission, I can't re-ask "user_friends" permissions above code. Because automatically rejected on next authentication.

What actions should I do to get "user_friends" programmatically?


回答1:


its simple just use

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

and do not forget to initialize fb SDK before you call setContentView(R.layout.main) i.e

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



回答2:


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

In Manifest File add these lines

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



回答3:


Solution by user2403096 works well, but I've encountered some problem and spent some time to resolve it. If User revoked some permission through console or somehow else and you need it in your app during login (e.g. I need email permission) I use code by 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() just obtains profile info with GraphRequest.newMeRequest(token, callback). So when you re-requesting permission there will be callback into onActivityResult but onSuccess(), onCancel() or onError() will NOT be called again. My approach is:

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

If you login into facebook and enter your credentials - onActivityResult will be processed by CallbackManager and will return true. CallbackManager under the hood checks whether your current AccessToken null or not and if you already logged in and then you re-ask permission - you will have token and callbackManager.onActivityResult return false. Then you can invoke performGraphRequest and login user into your app.




回答4:


Just an improvement to @Naveedumar 's answer

You can also do

    LoginManager.getInstance()
.logInWithReadPermissions(MainActivity.this, 
new ArrayList<String>(AccessToken.getCurrentAccessToken().getDeclinedPermissions()) ); 


来源:https://stackoverflow.com/questions/29770536/how-to-re-ask-declined-permissions-in-facebook-sdk-4-0-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!