zoukankan      html  css  js  c++  java
  • 安卓仿制新浪微博(一)之OAuth2授权接口

    这里需要用到请求授权(authorize)以及获取授权(access_token)

    第一步:

    将新浪的sdk放在src/libs下面

    二:

    //创建方法实现authorize
    public void getauthorize(){
    //获取实例
    //实例化的方法一般有三种
    //1.最常见的通过new;2.通过getinstence;3.通过工厂(Facetory)
    Weibo weibo=Weibo.getInstence();//里面有三个参数.String appKey, String redirectUrl, String aScope,
    //分别是你应用的appKey,网址,想要获取的权限可以把这些属性写在一个类里面设置成静态
    //这里需要两个参数,一个为context,一个listenr
    //context很好解决放的就是this,而listener需要的是WeiboAuthListener类型,我们没有所有就直接new一个
    weibo.aututhorize(this,new WeiboAuthListener(){
    //WeiboAuthListener里面自动生成4个方法
    //抛出异常时
                @Override
                public void onWeiboException(WeiboException arg0) {
                    Log.d(TAG, "onWeiboException" + arg0);
    
                }
    
                // 出错时
                @Override
                public void onError(WeiboDialogError arg0) {
                    Log.d(TAG, "onError" + arg0);
    
                }
    
                // 成功时
                @Override
                public void onComplete(Bundle arg0) {//这里的Bundle arg0就是返回的code数据
                    Log.d(TAG, "onComplete" + arg0);
                    String code = arg0.getString("code");
                    //这是获得Toak的方法,在下面会写到
                    getToken(code);
                }
    
                // 取消时
                @Override
                public void onCancel() {
                    Log.d(TAG, "onCancel=====");
    
                }
    
    });
    }

    现在已经获得code,现在我们需要通过code得到Token

    //实现access_token获取已经授权的Access_token
    
    public void getToken(){
    //现在来填充参数
    String url="https://api.weibo.com/oauth2/access_token";//注意这里不能有空格
    WeiboParameters params=new WeiboParameters();
    //params的中文就是参数的意思,所有将参数放在里面,所需的请求参数新浪API里面都有http://open.weibo.com/wiki/OAuth2/access_token
    params.add("client_id", staticname.AppKey);//第一个是key,第二个是value
    params.add("client_secret", staticname.App_Secret);
    params.add("grant_type", "authorization_code");
    params.add("code", code);
    params.add("redirect_uri", staticname.RedirectUrl);
    
    //第一步先写下面这个
    AsyncWeiboRunner.request(url,params,"POST",new RequestListener(){
    //自动生成四个方法
    @Override
                public void onIOException(IOException arg0) {
                    Log.d(TAG, "onIOException------" + arg0);
    
                }
    
                @Override
                public void onError(WeiboException arg0) {
                    Log.d(TAG, "onError------" + arg0);
    
                }
    
                @Override
                public void onComplete4binary(ByteArrayOutputStream arg0) {
                    Log.d(TAG, "onComplete4binary------" + arg0);
    
                }
    
                @Override
                public void onComplete(String js) {// 得到Toak的就是js
                    Log.d(TAG, "onComplete------" + js);
                    //这里json解析的作用下面会讲到
                    Json json = new Json();
                    try {
                        json.pramas(js, Welcom.this);
                        handler.sendEmptyMessage(CODE_VIEWPAGER);
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
    
    
    
    )};//这里需要四个参数分别是String url, WeiboParameters params, String httpMethod, RequestListener listener
                                //第一个参数代表是新浪API里的所给网站,第二,四个参数没有和上面的方法一样new出来,第三个参数新浪API同样给出了是POST
    
    }
    View Code

    现在已经获得Token了,那我们要实现如果用户已经授权过了之后,在token的有效期之前都不用重新授权的效果

    这就需要将获得的Token解析并且使用SharedPreferences来存储

     1 //新建一个类
     2 //Token的返回数据请查看新浪微博API
     3 public class Json{
     4 //需要获取数据源,所以在方法上加了一个String js,至于为什么还要加一个context在Sharde会讲到
     5 public void json(String js,Context context){
     6 JsonObject json=new JsonObject(js);
     7 //这里我们只需三个数据
     8 String access_token = jsonObject.getString("access_token");
     9 long expires_in = jsonObject.getLong("expires_in");//有效期
    10 String uid = jsonObject.getString("uid");//用户id
    11 Sharder sharder = new Sharder();
    12 //将解析得到的数据存入SharedPreferences
    13 sharder.putToke(context, access_token, expires_in);
    14 sharder.putuid(context, uid);
    15 }
    16 
    17 }
    Json.class
     1 //新建一个类来存储数据
     2 public class Sharde(){
     3 
     4 public void putToken(Context context,String token,long expires_in){
     5 //要使用context调用get来获取SharedPreferences,而json里要使用此方法,所以json里面也要有context
     6 SharedPreferences preferences=context.getSharedPreferences("token",SharedPreferences.Moden_PRI);//第一个是SharedPreferences的名字,第二个是数据存储形式
     7 Editor editor= preferences.edit();
     8 editor.putString("token",token);//因为这要放token的值所以要在方法里写上
     9 editor.putLong("expires_in",expires_in);
    10 //这个不要忘了
    11 editor.commt;
    12 }
    13 public void putuid(Context context,String uid){
    14 SharedPreferences preferences=context.getSharedPreferences("uid",SharedPreferences.Moden_PRI);
    15 Editor editor= preferences.edit();
    16 editor.putString("token",token);
    17 //这个不要忘了
    18 editor.commt;
    19 }
    20 //将SharedPreferences,的数据拿出来,以供判断使用
    21 public Oauth2AccessToken getToken(){
    22 SharedPreferences preferences=context.getSharedPreferences("token",SharedPreferences.Moden_PRI);
    23 String token = preferences.getString("token", null);//第二个参数是默认值的意思
    24 long expires_in = preferences.getLong("expires_in", 0);
    25 return  new    Oauth2AccessToken(token,expires_in+"") ;//返回Token,里面不能放long型所以要转成String型
    26 }
    27 
    28 public String getuid(){
    29 SharedPreferences preferences = context.getSharedPreferences("uid",
    30                 context.MODE_PRIVATE);
    31         String uid = preferences.getString("uid", null);
    32         return uid;
    33 }
    34 
    35 
    36 }
    Sharde.class

    现在我们要在主Activty里面判断

     1 public void onClick(View v) {
     2     if (sharder.getToke(Welcom.this).isSessionValid()) {
     3         Intent intent=new Intent(Welcom.this,Viewpager.class);
     4         startActivity(intent);//这是实现跳转的,下篇文章再说
     5         return;
     6     }
     7     getcode();
     8 
     9 }
    10 });

    最后不要忘记注册Activty和权限

     <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

     这并不是一篇教程,仅仅是我给老师教的作业,代码也不是在eclipse里面打的,里面可能有很多错误,希望大家多多见谅,源代码明天再上传,今天太累了

  • 相关阅读:
    每日一题-mysql(持续更新)
    http面试问题集锦
    存储测试简析
    横向越权测试—安全漏洞
    性能数据的准备-Jmeter
    获取当天七天时间
    vue生命周期
    vue的全选与反选
    filter兼容问题
    Http与Https
  • 原文地址:https://www.cnblogs.com/foreverstudent/p/3271739.html
Copyright © 2011-2022 走看看