Android仿人人客户端(v5

        }



        public void onPageFinished(WebView view, String url) {

            Log.i(TAG, "onPageFinished() url = " + url);

            super.onPageFinished(view, url);

        }

    });



                 d. Back键事件处理



@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

        if (mWebView != null) {

            mWebView.stopLoading();

        }

    }

    return super.onKeyDown(keyCode, event);

}



        应用授权界面,完整代码:



package com.everyone.android.ui;

import android.graphics.Bitmap;

import android.os.Bundle;

import android.text.TextUtils;

import android.util.Log;

import android.view.KeyEvent;

import android.view.View;

import android.webkit.SslErrorHandler;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import com.everyone.android.AppBaseActivity;

import com.everyone.android.R;

import com.everyone.android.utils.Constant;

import com.everyone.android.widget.TopNavbar;

/**

  • 功能描述:应用授权界面

  • @author android_ls

*/

public class AuthActivity extends AppBaseActivity {

/**

 * 打印Log的标签

 */

private static final String TAG = "AuthActivity";



private WebView mWebView;



private TopNavbar mTopNavbar;



@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);



    // 顶部返回按钮事件处理

    mTopNavbar.llBack.setOnClickListener(new View.OnClickListener() {



        @Override

        public void onClick(View v) {

            onBackPressed();

        }

    });

    

}



@Override

protected void setupView() {

    mTopNavbar = (TopNavbar) findViewById(R.id.rl_top_navbar);

    mWebView = (WebView) findViewById(R.id.wv_auth);

    mWebView.setVerticalScrollBarEnabled(false);

    mWebView.setHorizontalScrollBarEnabled(false);

    mWebView.getSettings().setJavaScriptEnabled(true);

}



@Override

protected int getLayoutId() {

    return R.layout.auth;

}



@Override

protected void initializedData() {

    // 组拼请求参数

    StringBuilder authorizeUrl = new StringBuilder(Constant.AUTHORIZE_URL);

    authorizeUrl.append("?");

    authorizeUrl.append("client_id=").append(Constant.API_KEY);

    authorizeUrl.append("&redirect_uri=").append(Constant.DEFAULT_REDIRECT_URI);

    authorizeUrl.append("&response_type=").append("token");

    authorizeUrl.append("&display=").append("touch");

    String scope = TextUtils.join(" ", Constant.HAVE_PERMISSIONS);

    authorizeUrl.append("&scope=").append(scope);

    Log.i(TAG, "authorizeUrl = " + authorizeUrl.toString());

    

    mWebView.loadUrl(authorizeUrl.toString());

    

    // 以POST方式请求

    // mWebView.postUrl(Constant.AUTHORIZE_URL, EncodingUtils.getBytes(sb.toString(), "BASE64"));

    mWebView.setWebViewClient(new WebViewClient() {



        public boolean shouldOverrideUrlLoading(WebView webView, String url) {

            Log.i(TAG, "shouldOverrideUrlLoading() Redirect URL = " + url);



            if (url.startsWith(Constant.DEFAULT_REDIRECT_URI + "#error=login_denied")) {

                AuthActivity.this.onBackPressed();

            } else if(url.startsWith("http://graph.renren.com/oauth/login_success.html#access_token")) {

                String accessToken = url.substring(url.indexOf("="), url.indexOf("&"));

                Log.i(TAG, "accessToken = " + accessToken);

                

                AuthActivity.this.onBackPressed();

                return false;

            }

            

            webView.loadUrl(url);

            return true;

        }



        public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError errorCode) {

            // 在默认情况下,通过loadUrl(String url)方法,可以顺利load。

            // 但是,当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,

            // 而并不会像PC浏览器中那样跳出一个风险提示框。因此,我们必须针对这种情况进行处理。(这个证书限于2.1版本以上的Android 系统才可以)

            

            // 默认的处理方式,WebView变成空白页

            // handler.cancel(); 

            

            // 接受证书   

            handler.proceed();

        }



        @Override

        public void onReceivedError(WebView view, int errorCode,

                String description, String failingUrl) {

            super.onReceivedError(view, errorCode, description, failingUrl);

            AuthActivity.this.onBackPressed();

        }



        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            Log.i(TAG, "Webview loading URL: " + url);

            super.onPageStarted(view, url, favicon);

        }



        public void onPageFinished(WebView view, String url) {

            Log.i(TAG, "onPageFinished() url = " + url);

            super.onPageFinished(view, url);

        }

    });

}



@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

        if (mWebView != null) {

            mWebView.stopLoading();

        }

    }

    return super.onKeyDown(keyCode, event);

}

}




TopNavbar类:



package com.everyone.android.widget;

import android.content.Context;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.widget.FrameLayout;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.TextView;

import com.everyone.android.R;

/**

  • 功能描述:自定义顶部工具栏

  • @author android_ls

  • 创建日期:2013-03-26

*/

public class TopNavbar extends FrameLayout {

public TextView tvTitle;



public LinearLayout llBack;



public TopNavbar(Context context) {

    super(context);

    setupViews();

}



public TopNavbar(Context context, AttributeSet attrs) {

    super(context, attrs);

    setupViews();

}



private void setupViews() {

    final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());

    RelativeLayout rlTopNavbar = (RelativeLayout) mLayoutInflater.inflate(R.layout.top_navbar, null);

    addView(rlTopNavbar);



    llBack = (LinearLayout) rlTopNavbar.findViewById(R.id.ll_back);

    tvTitle = (TextView) rlTopNavbar.findViewById(R.id.tv_title);

}

}




常量类:



package com.everyone.android.utils;

/**

  • 功能描述:常量类

  • @author android_ls

*/

public class Constant {

/**

 * 人人登录和授权的地址

 */

public static final String AUTHORIZE_URL = "https://graph.renren.com/oauth/authorize";



/**

 * 默认重定向URL

 */

public static final String DEFAULT_REDIRECT_URI = "http://graph.renren.com/oauth/login_success.html";



/**

 * 第三方应用所拥有的权限

 */

public static final String[] HAVE_PERMISSIONS = { "publish_feed", "create_album", "photo_upload", "read_user_album", "status_update",

        "read_user_blog", "read_user_checkin", "read_user_feed", "read_user_guestbook", "read_user_invitation", "read_user_like_history",

        "read_user_message", "read_user_notification", "read_user_photo", "read_user_status", "read_user_comment", "read_user_share",

        "read_user_request", "publish_blog", "publish_checkin", "publish_feed", "publish_share", "write_guestbook", "send_invitation", 

        "send_request", "send_message", "send_notification", "photo_upload", "create_album", "publish_comment", "operate_like", "admin_page" };



/**

 * API_KEY

 */

public static final String API_KEY = "661ea1ba2d6b49859be197d77fe361f1";



/**

 * Secret Key

 */

public static final String SECRET_KEY = "a088d31cd5d341819bfc75ac0208b5e1";



/**

 * 应用ID

关于面试的充分准备

一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,我能明显感觉到国庆后多了很多高级职位,所以努力让自己成为高级工程师才是最重要的。

好了,希望对大家有所帮助。

接下来是整理的一些Android学习资料,有兴趣的朋友们可以关注下我免费领取方式

①Android开发核心知识点笔记

②对标“阿里 P7” 40W+年薪企业资深架构师成长学习路线图

③面试精品集锦汇总

④全套体系化高级架构视频

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

mg-UUZBbpHp-1714361255958)]

④全套体系化高级架构视频

**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

[外链图片转存中…(img-nazzQ8UA-1714361255958)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值