2016-12-26 2 views
1

J'essaie de me connecter via Facebook login dans mon application Android, mais il me donne toujours un hachage de clé non valide. J'ai généré la clé de hachage correctement par le terminal sur mon Mac en utilisant la commande donnée sur le site développeur de facebook et aussi utilisé mon id application facebook properly.Here est mon code pour la classe d'activité de connexion:Pourquoi le fragment de connexion facebook affiche-t-il toujours une clé invalide dans Android?

LoginActivity.java

package com.titmus.worldscope; 

import android.content.Context; 
import android.content.Intent; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.Signature; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Base64; 
import android.util.Log; 
import android.webkit.WebView; 
import android.widget.Toast; 

import com.facebook.AccessToken; 
import com.titmus.worldscope.model.WorldScopeUser; 
import com.titmus.worldscope.utility.WorldScopeAPIService; 
import com.titmus.worldscope.utility.WorldScopeRestAPI; 

import java.security.MessageDigest; 

import fragment.FacebookLoginFragment; 

import retrofit2.Call; 
import retrofit2.Callback; 
import retrofit2.Response; 

public class LoginActivity extends AppCompatActivity implements FacebookLoginFragment.OnFragmentInteractionListener { 

    private static final String TAG = "LoginActivity"; 
    private static final String WELCOME_GIF_LINK = "file:///android_asset/welcomeGifAssets/welcome.html"; 
    private static final String APP_SERVER_AUTH_FAILED_MSG = "Authentication with WorldScope's server has failed, please check that you have internet connections and try again."; 
    private static Context context; 
    private FacebookLoginFragment facebookLoginFragment; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_facebook_login); 

     context = this; 

     loadGifIntoWebView(); 
    } 

    @Override 
    public void onFacebookLoginSuccess(AccessToken accessToken) { 
     // Successful login -> Redirect to Main activity 
     Log.d(TAG, "Login Success!"); 
     Log.d(TAG, "AccessToken: " + accessToken.getToken()); 

     // Instantiate and make a call to login user into WorldScope servers 
     Call<WorldScopeUser> call = new WorldScopeRestAPI(context).buildWorldScopeAPIService().loginUser(new WorldScopeAPIService.LoginUserRequest(accessToken.getToken())); 
     call.enqueue(new Callback<WorldScopeUser>() { 
      @Override 
      public void onResponse(Response<WorldScopeUser> response) { 
       if(response.isSuccess()) { 
        Log.d(TAG, "Success!"); 
        Log.d(TAG, "" + response.body().toString()); 

        WorldScopeUser user = response.body(); 
        WorldScopeAPIService.setUser(user); 
        // Redirect to MainActivity if successful 
        redirectToMainActivity(); 

       } else { 
        Log.d(TAG, "Failure" + response.code() + ": " + response.message()); 
        // Logout of Facebook 
        logoutOfFacebook(); 
       } 
      } 

      @Override 
      public void onFailure(Throwable t) { 
       Log.d(TAG, "Failure: " + t.getMessage()); 
       // Logout of Facebook 
       logoutOfFacebook(); 
      } 
     }); 
    } 

    //Redirects to MainActivity 
    protected void redirectToMainActivity() { 
     Intent intent = new Intent(context, MainActivity.class); 
     intent.putExtra("activity", TAG); 
     startActivity(intent); 
    } 

    // Called to logout of Facebook when attempt to authenticate with App server fails 
    private void logoutOfFacebook() { 

     if(facebookLoginFragment == null) { 
      // Get FacebookLoginFragment if missing 
      facebookLoginFragment = (FacebookLoginFragment) getSupportFragmentManager().findFragmentById(R.id.facebookLoginButtonFragment); 
     } 

     // Toast to inform user 
     Toast toast = Toast.makeText(context, APP_SERVER_AUTH_FAILED_MSG, Toast.LENGTH_LONG); 
     toast.show(); 
     facebookLoginFragment.logoutFromFacebook(); 

    } 

    // Method to load Gif's html data into WebView 
    private void loadGifIntoWebView() { 
     WebView welcomeGifWebView = (WebView) findViewById(R.id.welcomeGifWebView); 
     welcomeGifWebView.loadUrl(WELCOME_GIF_LINK); 
    } 
} 

activity_facebook_login.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/loginActivity" 
    tools:context="com.titmus.worldscope.LoginActivity"> 

    <WebView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:id="@+id/welcomeGifWebView" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" /> 

    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/facebookLoginButtonFragment" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="48dp"> 

     <ImageView 
      android:layout_width="32dp" 
      android:layout_height="match_parent" 
      android:id="@+id/imageView" 
      android:src="@drawable/ic_logo" 
      android:layout_alignBottom="@+id/textView4" 
      android:layout_toStartOf="@+id/textView4" 
      android:layout_marginEnd="4dp" 
      android:paddingTop="6dp" 
      android:paddingBottom="5dp" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:text="WorldScope" 
      android:id="@+id/textView4" 
      android:textColor="#ffffff" 
      android:textStyle="bold" 
      android:textSize="32sp" 
      android:layout_above="@+id/facebookLoginButtonFragment" 
      android:layout_centerHorizontal="true" /> 
    </LinearLayout> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="By logging in you agree to WorldScope&apos;s Privacy Policy and Terms of Use." 
     android:id="@+id/textView6" 
     android:textColor="#eeeeee" 
     android:textSize="14dp" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     android:textAlignment="center" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginBottom="57dp" /> 

    <fragment 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:name="fragment.FacebookLoginFragment" 
     android:id="@+id/facebookLoginButtonFragment" 
     tools:layout="@layout/fragment_facebook_login" 
     android:layout_marginBottom="14dp" 
     android:layout_above="@+id/textView6" 
     android:layout_alignParentStart="true" /> 

</RelativeLayout> 

Répondre

1

la keyhash générée à l'aide cmd fonctionne très bien pour la première alors il ne fonctionne pas.

Il faut donc utiliser cette méthode pour générer keyHash dans une classe de vous

public void printHashKey(){ 
     // Add code to print out the key hash 
     try { 
      PackageInfo info = getPackageManager().getPackageInfo(
        "net.simplifiedcoding.androidlogin", 
        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 (PackageManager.NameNotFoundException e) { 

     } catch (NoSuchAlgorithmException e) { 

     } 
    } 

Copiez ensuite le hachage de clé genrated, et collez-le où vous avez ajouté keyhash généré par cmd dans facebook console développeur.

Il fonctionnera, et ne pas limiter l'application à un seul appareil dans la console développeur facebook

+0

facebook console développeur, les options a changé. Il ne me donne plus la possibilité de faire de l'application en direct –

+0

Pas de problème juste genrer hashcode ci-dessus mentionné et l'ajouter dans la console. Il fonctionnera – Mrinmoy

+0

oui, en l'essayant. il suffit de me donner un moment –