通过 Webview 卡在 Linkedin 登录中

Roh*_*ami 5 android exception linkedin linkedin-api

实际上,我的应用程序是通过linkedin 应用程序和webview 使用linkedin 登录的。使用linkedin 登录工作正常,但如果linkedin 应用程序不可用,我将使用webview 来处理登录。这也工作正常,但今天它突然卡在了一些代码异常中。我在我的 Linkedin 对话框类中获得了空访问令牌,所以我喜欢放置 try catch 但之后它会显示空白的 webview 我不知道该怎么做知道。这是我的linkedin对话框代码

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);
}
}
Run Code Online (Sandbox Code Playgroud)

这是登录按钮上的函数调用

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();
}
Run Code Online (Sandbox Code Playgroud)

所有 jar 依赖项:

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'}
Run Code Online (Sandbox Code Playgroud)

我在第一次点击时遇到的异常:

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)
Run Code Online (Sandbox Code Playgroud)

然后我按后退按钮再次登录然后得到这样的新异常:

W/System.err? java.lang.NoClassDefFoundError: com.google.code.linkedinapi.client.constant.LinkedInApiUrls
Run Code Online (Sandbox Code Playgroud)

Roh*_*ami 0

我自己解决了这个问题...我只清除了构建包装器,然后删除了 linkedin 的现有 jar 文件,例如 linkedin-j 、signpost-core、commons-codec 并再次导入相同的文件,然后构建项目...现在它正在运行出色地。