Stuck on Linkedin login via Webview

In fact, my application uses linkedin login through the linkedin app and webview. Logging in with linkedin works fine, but if in case the linkedin application is not available, I use webview to log in. This also works great, but today it suddenly got stuck in some lines of code exceptions. I get a zero access token in my Linkedin dialog, so I like to put a try catch, but after that it shows an empty webview, I don’t know what to do. here is my code in the dialog

public class LinkedinDialog extends Dialog
{
private ProgressDialog progressDialog = null;

public static LinkedInApiClientFactory factory;
public static LinkedInOAuthService oAuthService;
public static LinkedInRequestToken liToken;
private WebView mWebView;
private Context mContext;

public LinkedinDialog(Context context, ProgressDialog progressDialog) 
{
    super(context);
    mContext = context;
    this.progressDialog = progressDialog;
}

@Override
protected void onCreate(Bundle savedInstanceState) 
{
    requestWindowFeature(Window.FEATURE_NO_TITLE);// must call before super.
    super.onCreate(savedInstanceState);
    setContentView(R.layout.ln_dialog);
    setWebView();
}

/**
 * set webview.
 */
private void setWebView()
{
    mWebView = (WebView) findViewById(R.id.webkitWebView1);
    mWebView.getSettings().setJavaScriptEnabled(true);
    try {
        LinkedinDialog.oAuthService = LinkedInOAuthServiceFactory.getInstance().createLinkedInOAuthService(AppConstants.LINKEDIN_CONSUMER_KEY, AppConstants.LINKEDIN_CONSUMER_SECRET);
        LinkedinDialog.factory = LinkedInApiClientFactory.newInstance(AppConstants.LINKEDIN_CONSUMER_KEY, AppConstants.LINKEDIN_CONSUMER_SECRET);
        LinkedinDialog.liToken = LinkedinDialog.oAuthService.getOAuthRequestToken(AppConstants.OAUTH_CALLBACK_URL);

        mWebView.loadUrl(LinkedinDialog.liToken.getAuthorizationUrl());
        mWebView.setWebViewClient(new HelloWebViewClient());

        mWebView.setPictureListener(new PictureListener() {
            @Override
            public void onNewPicture(WebView view, Picture picture) {
                if (progressDialog != null && progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }

            }
        });
    }catch (ExceptionInInitializerError e){
        AppLogs.printLogs("ExceptionInInitializerError :: " , " err ::");
        LinkedinDialog.this.dismiss();
        mWebView.goBack();
    }catch (NoClassDefFoundError ex){
        AppLogs.printLogs("NoClassDefFoundError :: " , " err ::");
        ex.printStackTrace();
        LinkedinDialog.this.dismiss();
        mWebView.goBack();
    }catch (Exception ee){
        LinkedinDialog.this.dismiss();
        mWebView.goBack();
    }
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(event.getAction() == KeyEvent.ACTION_DOWN){
        switch(keyCode)
        {
            case KeyEvent.KEYCODE_BACK:
                    if (mWebView.canGoBack()) {
                        mWebView.goBack();
                    } else {
                        cancel();
                    }

                return true;
        }

    }
    return super.onKeyDown(keyCode, event);
}

class HelloWebViewClient extends WebViewClient 
{
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    {
        if (url.contains(AppConstants.OAUTH_CALLBACK_URL))
        {
            Uri uri = Uri.parse(url);
            String verifier = uri.getQueryParameter("oauth_verifier");

            cancel();

            for (OnVerifyListener d : listeners) 
            {
                // call listener method
                d.onVerify(verifier);
            }
        } 
        else if (url.contains("https://www.google.co.in/")) 
        {
            cancel();
        } 
        else 
        {
            Log.e("LinkedinSample", "url: " + url);
            view.loadUrl(url);
        }

        return true;
    }
}

/**
 * List of listener.
 */
private List<OnVerifyListener> listeners = new ArrayList<OnVerifyListener>();

/**
 * Register a callback to be invoked when authentication have finished.
 * 
 * @param data
 *            The callback that will run
 */
public void setVerifierListener(OnVerifyListener data)
{
    listeners.add(data);
}

/**
 * Listener for oauth_verifier.
 */
public interface OnVerifyListener 
{
    /**
     * invoked when authentication have finished.
     * 
     * @param verifier
     *            oauth_verifier code.
     */
    public void onVerify(String verifier);
}
}

these are function calls at login

private void linkedInLogin()
{
    mProgressDialog = new ProgressDialog(LoginActivity.this);
    mProgressDialog.setMessage(AppConstants.sLoadingMsg);
    mProgressDialog.setCancelable(true);
    mProgressDialog.show();

    d = new LinkedinDialog(LoginActivity.this,mProgressDialog);
    d.show();

    d.setVerifierListener(new LinkedinDialog.OnVerifyListener() {

        @SuppressLint("NewApi")
        @Override
        public void onVerify(String verifier) {

            try {
                accessToken = LinkedinDialog.oAuthService.getOAuthAccessToken(LinkedinDialog.liToken, verifier);
                LinkedinDialog.factory.createLinkedInApiClient(accessToken);
                client = factory.createLinkedInApiClient(accessToken);

                AppLogs.printLogs("LinkedinSample", "ln_access_token: " + accessToken.getToken());
                mAccessTokenLogin = accessToken.getToken();

                com.google.code.linkedinapi.schema.Person p = null;

                p = client.getProfileForCurrentUser(EnumSet.of(
                        ProfileField.ID, ProfileField.FIRST_NAME,
                        ProfileField.LAST_NAME, ProfileField.HEADLINE,
                        ProfileField.SUMMARY, ProfileField.PUBLIC_PROFILE_URL,
                        ProfileField.INDUSTRY, ProfileField.PICTURE_URL,
                        ProfileField.LOCATION, ProfileField.LOCATION_NAME, ProfileField.EMAIL_ADDRESS));
                AppLogs.printLogs("linkedin id"," :: "+p.getId());
                UserLinkedInData userLinkedInData = UserLinkedInData.getInstance();
                try {
                    if (p.getEmailAddress() == null | p.getEmailAddress().isEmpty()) {
                        userLinkedInData.setmEmailAddress(AppConstants.sNotAvailable);

                    } else {
                        userLinkedInData.setmEmailAddress(p.getEmailAddress());
                    }
                }catch (Exception e){
                    userLinkedInData.setmEmailAddress(AppConstants.sNotAvailable);
                }

                try {
                    if (!p.getFirstName().isEmpty()) {
                        userLinkedInData.setmFirstName(p.getFirstName());
                    } else {
                        userLinkedInData.setmFirstName(AppConstants.sNotAvailable);
                    }
                }catch (Exception e){
                    userLinkedInData.setmFirstName(AppConstants.sNotAvailable);
                }

                }                         
        }
    });

    mProgressDialog.dismiss();
}

All jar dependencies:

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile project(':linkedin-sdk')
compile files('libs/linkedin-j-android.jar')
compile files('libs/commons-codec-1.3.jar')
compile files('libs/signpost-core-1.2.1.1.jar')
compile files('libs/signpost-commonshttp4-1.2.1.2.jar')
compile files('libs/signpost-jetty6-1.2.1.1.jar')
compile 'com.github.bumptech.glide:glide:3.5.2'
compile 'com.android.support:support-v4:22.0.0'
compile 'com.googlecode.libphonenumber:libphonenumber:7.0.4'
compile "com.google.android.gms:play-services:8.1.0"
compile 'org.apache.directory.studio:org.apache.commons.io:2.4'
compile 'com.android.support:multidex:1.0.0'}

The exception I get the first time I click:

W/System.err﹕ java.lang.ExceptionInInitializerError
W/System.err﹕ at com.google.code.linkedinapi.client.oauth.LinkedInOAuthServiceImpl.getOAuthProvider(LinkedInOAuthServiceImpl.java:230)
W/System.err﹕ at com.google.code.linkedinapi.client.oauth.LinkedInOAuthServiceImpl.getOAuthRequestToken(LinkedInOAuthServiceImpl.java:170)
W/System.err﹕ at com.app.util.LinkedinDialog.setWebView(LinkedinDialog.java:64)
W/System.err﹕ at com.app.util.LinkedinDialog.onCreate(LinkedinDialog.java:51)
W/System.err﹕ at android.app.Dialog.dispatchOnCreate(Dialog.java:373)
W/System.err﹕ at android.app.Dialog.show(Dialog.java:274)
W/System.err﹕ at com.app.circles.LoginActivity.linkedInLogin(LoginActivity.java:228)
W/System.err﹕ at com.app.circles.LoginActivity.access$100(LoginActivity.java:72)
W/System.err﹕ at com.app.circles.LoginActivity$1.onClick(LoginActivity.java:158)

and then I press the button again to login, and then I get a new exception:

W/System.err﹕ java.lang.NoClassDefFoundError: com.google.code.linkedinapi.client.constant.LinkedInApiUrls
+4
1

... , jar , linkedin-j, signpost-core, commons-codec , ... .

0

Source: https://habr.com/ru/post/1616681/


All Articles