Intereting Posts
Android: как запретить кнопку «Назад» отменить FragmentDialog Как я могу сделать липкие заголовки в RecyclerView? (Без внешней библиотеки) Настройка турецкого и английского языков: перевод турецких символов на латинские эквиваленты Преобразование даты и времени в миллисекунды в Android Какое намерение должно открыть экран использования данных (из настроек) Как перемещать маркер вдоль полилинии с помощью карты google Scrollview внутри прокрутки в версии для Android Android – активировать USB-привязку программно – есть приложение, которое сделало это для 2.3 Дисплей видео искажается при записи на Galaxy S3 Как получить путь к ADB в build.gradle Java.lang.IllegalStateException: не удается найти метод onClick для кнопки в Android Studio Как сделать полосы прокрутки списка видимыми все время Показывать только две цифры после десятичной Android listview дополнительное пространство в конце, когда прокрутка «Не найдено приемлемого модуля» на эмуляторах Android, используя com.google.android.gms play-services 9.2.0

Facebook после входа не возвращается, но снова спрашивает логин

Я пытаюсь внедрить функции входа в Facebook в своем приложении и получать токен после предоставления разрешения на публикацию.

Для этого я следую следующим шагам.

  1. Создайте приложение на Facebook (заполните все данные, такие как имя приложения, Хэш-ключ (Release), Имя класса, Имя пакета, Единый вход)

  2. Теперь приложение доступно для всех пользователей.

  3. Затем я использую id приложения в своем манифесте. Xml

Все отлично работает со мной, если приложение Native Facebook установлено на моем мобильном устройстве. Но если родное приложение не установлено, тогда он откроет facebook webview после заполнения регистрационной информации, которую он попросит авторизовать после нажатия кнопки ok, чтобы снова просить меня войти в систему. И этот процесс продолжится.

**** После входа в систему и разрешения для приложения он не возвращается на мой экран, но он просит меня снова войти ****.

Вот мой снимок экрана.

Введите описание изображения здесь

Вот второй снимок экрана

Введите описание изображения здесь

После нажатия на ok, он просит меня снова войти. Вход в систему – авторизация – логин.
Вот мой полный код:

Я использую свою собственную кнопку, поэтому я не добавляю xml-код.

public class FBActivity extends Activity { Session.StatusCallback statusCallback = new SessionStatusCallback(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.registartionwithmultiple); printHashKey(); bundle = savedInstanceState; permissions = new ArrayList<String>(); readpermissions = new ArrayList<String>(); permissions.add("publish_actions"); readpermissions.add("email"); executeFacebookLogin(); } private void executeFacebookLogin() { Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); Session session = Session.getActiveSession(); if(session == null) { if(bundle != null) { Log.i("TEST","RESTORING FROM BUNDLE"); session = Session.restoreSession(this, null, statusCallback, bundle); } if(session == null) { Log.i("TEST","CREATE NEW SESSION"); session = new Session(this); } Session.setActiveSession(session); session.addCallback(statusCallback); if(session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions)); } } if(session.isClosed()) { session.closeAndClearTokenInformation(); Session.setActiveSession(null); } if(!session.isOpened()) { session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions)); Log.i("FB Login ","Open for Publish"); } else { Session.openActiveSession(this, true, statusCallback); } } private class SessionStatusCallback implements Session.StatusCallback { @Override public void call(Session session, SessionState state, Exception exception) { //Check if Session is Opened or not processSessionStatus(session, state, exception); } } @SuppressWarnings("deprecation") public void processSessionStatus(Session session, SessionState state, Exception exception) { Log.i("TEST","Session in process session "+session); if(session != null && session.isOpened()) { if(session.getPermissions().contains("publish_actions")) { //Show Progress Dialog dialog = new ProgressDialog(this); dialog.setMessage("Loggin in.."); dialog.show(); Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (dialog!=null && dialog.isShowing()) { dialog.dismiss(); } if(user != null) { Map<String, Object> responseMap = new HashMap<String, Object>(); GraphObject graphObject = response.getGraphObject(); responseMap = graphObject.asMap(); Log.i("FbLogin", "Response Map KeySet - " + responseMap.keySet()); // TODO : Get Email responseMap.get("email"); fb_id = user.getId(); fb_email = null; user.getBirthday(); fb_userName = user.getUsername(); fb_fullname = user.getFirstName() +" "+user.getLastName(); String name = (String) responseMap.get("name"); if (responseMap.get("email")!=null) { fb_email = responseMap.get("email").toString(); Log.i("TEST", "FB_ID="+fb_id +"email="+fb_email+"name="+name+"user_name="+user.getUsername()+"birthday="+user.getBirthday()); Session session = Session.getActiveSession(); tokenKey = session.getAccessToken(); SharedPreferenceStoring myPrefsClass = new SharedPreferenceStoring(); myPrefsClass.storingFBToken(FBActivity.this, tokenKey); finish(); } else { //Clear all session info & ask user to login again Session session = Session.getActiveSession(); if(session != null) { session.closeAndClearTokenInformation(); } } } } }); } else { session.requestNewPublishPermissions(new Session.NewPermissionsRequest(FBActivity.this, permissions)); } } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.i("TEST","Activity result"); super.onActivityResult(requestCode, resultCode, data); Log.d("FbLogin", "Result Code is - " + resultCode +""); Session.getActiveSession().onActivityResult(FBActivity.this, requestCode, resultCode, data); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Save current session super.onSaveInstanceState(outState); Session session = Session.getActiveSession(); Session.saveSession(session, outState); } 

}

Я также получаю хэш-ключ. Вот код для хэш-ключа

 private void printHashKey() { try { PackageInfo info = getPackageManager().getPackageInfo( "com.myapp", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } } 

Я также добавляю Internet Permission в AndroidManifest.xml и meta-data для Facebook.

Надеюсь, что вся эта информация будет достаточной, если потребуется что-то еще, наверняка обновит мой вопрос.

Пожалуйста, дайте мне любую ссылку или подсказку.

Solutions Collecting From Web of "Facebook после входа не возвращается, но снова спрашивает логин"

U нужна библиотека easyfacebookandroidsdk.jar и создайте ее в проекте ur

Используйте этот код:

 public class MainActivity extends Activity implements LoginListener{ EditText et1; private FBLoginManager fbLoginManager; Button b; //replace it with your own Facebook App ID public final String FacebookTesting="218874471621782"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et1=(EditText)findViewById(R.id.editText1); b=(Button)findViewById(R.id.button1); connectToFacebook(); } public void connectToFacebook(){ //read about Facebook Permissions here: //http://developers.facebook.com/docs/reference/api/permissions/ String permissions[] = { // "user_about_me", // "user_activities", // "user_birthday", // "user_checkins", // "user_education_history", // "user_events", // "user_groups", // "user_hometown", // "user_interests", // "user_likes", // "user_location", // "user_notes", // "user_online_presence", // "user_photo_video_tags", // "user_photos", // "user_relationships", // "user_relationship_details", // "user_religion_politics", // "user_status", // "user_videos", // "user_website", // "user_work_history", // "email", // // "read_friendlists", // "read_insights", // "read_mailbox", // "read_requests", // "read_stream", // "xmpp_login", // "ads_management", // "create_event", // "manage_friendlists", // "manage_notifications", // "offline_access", // "publish_checkins", "publish_stream", // "rsvp_event", // "sms", //"publish_actions", // "manage_pages" }; fbLoginManager = new FBLoginManager(this, R.layout.activity_main, FacebookTesting, permissions); if(fbLoginManager.existsSavedFacebook()){ fbLoginManager.loadFacebook(); } else{ fbLoginManager.login(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override protected void onActivityResult(int requestCode, int resultCode, android.content.Intent data){ fbLoginManager.loginSuccess(data); } public void loginSuccess(Facebook facebook) { // GraphApi graphApi = new GraphApi(facebook); new getDataBackgroundThread().execute(facebook); // User user = new User(); // try{ // user = graphApi.getMyAccountInfo(); // // //update your status if logged in // graphApi.setStatus("Hello, world!"); // } catch(EasyFacebookError e){ // Log.d("TAG: ", e.toString()); // } // fbLoginManager.displayToast("Hey, " + user.getFirst_name() + "! Login success!"); } @Override public void logoutSuccess() { // TODO Auto-generated method stub } @Override public void loginFail() { // TODO Auto-generated method stub } class getDataBackgroundThread extends AsyncTask<Facebook, Void, String> { private Exception exception; protected String doInBackground(Facebook... urls) { try{ GraphApi graphApi = new GraphApi(urls[0]); User user = new User(); try{ // user = graphApi.getMyAccountInfo(); //update your status if logged in //graphApi.setStatus("My android App "+"VivekAppTest"); graphApi.setStatus("Hello "+"VivekAppTest"); } catch(EasyFacebookError e){ Log.d("TAG: ", e.toString()); } return "posted"; } catch (Exception e) { // TODO: handle exception return null; } } protected void onPostExecute(String ipr) { // TODO: check this.exception // TODO: do something with the feed // // Intent i=new Intent(getApplicationContext(),MainActivity.class); // startActivity(i); // finish(); // Toast toast=Toast.makeText(getApplicationContext(),"Post Successful !", 1); // toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,0, 130); // toast.show(); // } } } 

Получите ваш идентификатор приложения Facebook и замените его в коде. Я всегда использую этот код всякий раз, когда мне приходится публиковать текст на FB.

В манифесте дается разрешение на доступ в Интернет
<uses-permission android:name="android.permission.INTERNET"/>

Это все

ура

Итак, что я хотел вам рассказать, вам нужно будет найти значения хэшей ключей и поместить их в консоль facebook. Используйте ниже код для получения значений ключевого хэша:

 try { PackageInfo info = getPackageManager().getPackageInfo("com.key", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); TextView tvmyName = (TextView)findViewById(R.id.KeyText); tvmyName.setText(Base64.encodeBytes(md.digest())); Log.d("KEY_HASH", Base64.encodeBytes(md.digest())); } } catch (NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } 

Значение KeyHash 1: tvmyName.setText (Base64.encodeBytes (md.digest ()));

Значение KeyHash 2: Log.d («KEY_HASH», Base64.encodeBytes (md.digest ()));

См. Изображение ниже для передачи значений keyhash в консоли facebook: Введите описание изображения здесь

Прежде всего, избегайте копирования Facebook SDK в текущую рабочую область, держите ее где-то и просто добавляйте рабочий набор Facebook SDK для Facebook SDK в рабочее пространство.

Я попробовал простое приложение и получил некоторые разрешения от пользователя. Вот код, который я попробовал, он работал с нами совершенно отлично, без приложения Facebook, установленного на устройстве.

 public class MainActivity extends Activity implements StatusCallback { final Context context = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { // Do whatever u want. User has logged in } else if (!currentSession.isOpened()) { // Ask for username and password OpenRequest op = new Session.OpenRequest((Activity) context); op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK); op.setCallback(null); List<String> permissions = new ArrayList<String>(); permissions.add("user_likes"); permissions.add("email"); permissions.add("user_birthday"); permissions.add("user_location"); permissions.add("user_interests"); permissions.add("friends_birthday"); op.setPermissions(permissions); Session session = new Builder(MainActivity.this).build(); Session.setActiveSession(session); session.openForRead(op); } } public void call(Session session, SessionState state, Exception exception) { } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println("Here"); super.onActivityResult(requestCode, resultCode, data); if (Session.getActiveSession() != null) Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); Session currentSession = Session.getActiveSession(); if (currentSession == null || currentSession.getState().isClosed()) { Session session = new Session.Builder(context).build(); Session.setActiveSession(session); currentSession = session; } if (currentSession.isOpened()) { Session.openActiveSession(this, true, new Session.StatusCallback() { @SuppressWarnings("deprecation") @Override public void call(final Session session, SessionState state, Exception exception) { if (session.isOpened()) { Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { System.out.println(user.getName()); System.out.println(session .getAccessToken()); System.out.println(user .getFirstName()); } } }); } } }); } } } 

В onActivityResult я попытался напечатать некоторую базовую информацию. Просто попробуйте код и прокомментируйте, если у вас возникнут проблемы с этим текущим кодом.

Что-то не так с вашим SDK / процессом / кодом?

Просто попробуйте этот код и сообщите мне, работает ли он нормально или имеет ту же проблему, что и вы упомянули.

Кликните сюда.