MVP ,Okhttp,Universal-Image-Loader或Glide,RecyclerView,属性动画,Umeng完成QQ第三方登录和分享

1MVP分包分层:ModelViewPresenter三层

2Okhttp二次封装,OkhttpClient使用单例模式封装并封装GETPOST请求方法

3、 使用Universal-Image-LoaderGlide图片加载框架

4、属性动画完成图一翻牌的效果,图片自定义,定义动画时间为3秒钟,动画结束后自动跳转到图二界面

5、集成Umeng第三方登录功能,并实现QQ登录,登录成功后显示用户信息

6、使用RecyclerView显示数据并设置点击事件,点击后跳转到图四界面并使用WebView显示页面内容,点击分享按钮,使用Umeng分享功能,成功把该页面的链接分享到QQ朋友圈

http://api.tianapi.com/startup/?key=71e58b5b2f930eaf1f937407acde08fe&num=10

1.旋转动画的MainActivity

package com.example.yuekaomoni;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

    private ImageView my_img1,my_img2;

    //旋转动画
    private ScaleAnimation sa1 = new ScaleAnimation(1,0,1,1,
            Animation.RELATIVE_TO_PARENT,0.5f,Animation.RELATIVE_TO_PARENT,0.5f);
    private ScaleAnimation sa2 = new ScaleAnimation(0,1,1,1,Animation.RELATIVE_TO_PARENT,0.5f,
            Animation.RELATIVE_TO_PARENT,0.5f);

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

        //初始化数据
        init();

        //启动动画
        my_img1.startAnimation(sa1);
    }

    //初始化数据
    private void init() {

        //找到资源控件的ID
        my_img1 = findViewById(R.id.my_img1);
        my_img2 = findViewById(R.id.my_img2);

        //设置两张图片显示与隐藏的切换
        img1Visible();

        //设置动画执行的时间
        sa1.setDuration(1500);
        sa2.setDuration(1500);

        //sa2设置动画监听事件
        sa2.setAnimationListener(new Animation.AnimationListener() {
            //动画效果开始执行前
            @Override
            public void onAnimationStart(Animation animation) {}
            //动画效果执行完毕
            @Override
            public void onAnimationEnd(Animation animation) {
                //创建一个意图,实现跳转
                Intent intent = new Intent(MainActivity.this,LoginActivity.class);
                //执行跳转
                startActivity(intent);
                //关闭页面
                finish();
            }

            //动画效果重复执行
            @Override
            public void onAnimationRepeat(Animation animation) {}
            
        });

        //sa1设置动画监听事件
        sa1.setAnimationListener(new Animation.AnimationListener() {
            //动画效果开始执行前
            @Override
            public void onAnimationStart(Animation animation) {}

            //动画效果执行完毕
            @Override
            public void onAnimationEnd(Animation animation) {
                if(my_img1.getVisibility()==View.VISIBLE){
                    //把图片1的动画设置为空,现在图片1的不需要
                    my_img1.setAnimation(null);
                    my_img2.setAnimation(sa2);
                    img2Visible();
                }else{
                    my_img2.setAnimation(null);
                    my_img1.setAnimation(sa2);
                    img1Visible();
                }
            }

            //动画效果重复执行
            @Override
            public void onAnimationRepeat(Animation animation) {}

        });
    }

    //设置两张图片显示与隐藏的切换
    private void img1Visible() {
        //图片1进行显示V 图片二进行隐藏I
        my_img1.setVisibility(View.VISIBLE);
        my_img2.setVisibility(View.INVISIBLE);
    }

    private void img2Visible() {
        //图片1进行隐藏I 图片二进行显示V
        my_img1.setVisibility(View.INVISIBLE);
        my_img2.setVisibility(View.VISIBLE);
    }
}

2.M层接口

package com.example.yuekaomoni.model;
import com.example.yuekaomoni.presenter.DataPresenter;

//创建接口
public interface DataModel {

    //定义请求数据的方法
    //参数:1.数据接口 2.P层接口(用于将获取的数据返回给P)
    void getData(String url,DataPresenter presenter);
}

3.M层接口的实现类

package com.example.yuekaomoni.model;
import com.example.yuekaomoni.presenter.DataPresenter;
import com.example.yuekaomoni.utils.OkhtttpUtils;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

//接口实现类
public class MyDataModel implements DataModel{

    //查询请求数据的方法
    @Override
    public void getData(String url, final DataPresenter presenter) {

        //使用get进行请求
        OkhtttpUtils.daGet(url, new Callback() {
            //失败
            @Override
            public void onFailure(Call call, IOException e) {}
            //成功
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //获取服务器返回的json
                String json = response.body().string();

                //使用Gson进行解析
                Gson gson = new Gson();
                MyDataBean myDataBean = gson.fromJson(json, MyDataBean.class);

                //得到解析后的集合
                List<MyDataBean.NewslistBean> list = myDataBean.getNewslist();

                //调用P层的成功方法 将集合传回P                presenter.Success(list);
            }
        });
    }
}

4.P层接口

package com.example.yuekaomoni.presenter;
import com.example.yuekaomoni.model.MyDataBean;
import java.util.List;

//创建接口
public interface DataPresenter {

    //定义成功与失败的方法
    void Success(List<MyDataBean.NewslistBean> list);
    void Error();
}

5.P层接口的实现类

package com.example.yuekaomoni.presenter;
import com.example.yuekaomoni.model.MyDataBean;
import com.example.yuekaomoni.model.MyDataModel;
import com.example.yuekaomoni.view.DataView;
import java.util.List;

//接口实现类
public class MyDataPresenter implements DataPresenter{

    //创建构造器 接收传来的V层,并实例化出M    DataView dataView;
    private final MyDataModel model;
    public MyDataPresenter(DataView dataView) {
        this.dataView=dataView;
        //实例化M        model = new MyDataModel();
    }

    //重写成功的方法
    @Override
    public void Success(List<MyDataBean.NewslistBean> list) {
            //调用V层接收数据的方法,将数据传给V            dataView.toBackHome(list);
    }
    //重写失败的方法
    @Override
    public void Error() {}

    //创建接收V层传来url的方法
    public void netWork(String url){

        //调用M层的请求方法
        model.getData(url,this);
    }
}

6.V层的接口

package com.example.yuekaomoni.view;
import com.example.yuekaomoni.model.MyDataBean;
import java.util.List;

//创建接口
public interface DataView {

    //定义接收数据的方法
    void toBackHome(List<MyDataBean.NewslistBean> list);
}

7.V层接口的实现类

package com.example.yuekaomoni.view;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.example.yuekaomoni.R;
import com.example.yuekaomoni.WebViewActivity;
import com.example.yuekaomoni.adapter.MyAdapter;
import com.example.yuekaomoni.model.MyDataBean;
import com.example.yuekaomoni.presenter.MyDataPresenter;
import java.util.List;

//接口实现类
public class RecyclerViewActivity extends AppCompatActivity implements DataView,MyAdapter.OnClickListener{

    //数据接口
    String url = "http://api.tianapi.com/startup/?key=71e58b5b2f930eaf1f937407acde08fe&num=10";
    private RecyclerView my_rcv;
    private MyAdapter myAdapter;
    private List<MyDataBean.NewslistBean> list;

    //创建
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            //接收handler传来的数据 (需强转)
            list = (List<MyDataBean.NewslistBean>) msg.obj;

            //创建适配器
            myAdapter = new MyAdapter(RecyclerViewActivity.this, list);
            my_rcv.setAdapter(myAdapter);

            //调用适配器中方法,将V层传给P            myAdapter.OnClick(RecyclerViewActivity.this);

        }
    };


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

        //找到资源控件的ID
        my_rcv = findViewById(R.id.my_rcv);

        //设置布局管理器
        my_rcv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

        //实例化P层,将urlV层传给P        MyDataPresenter presenter = new MyDataPresenter(this);
        presenter.netWork(url);

    }


    //重写接收数据的方法
    @Override
    public void toBackHome(List<MyDataBean.NewslistBean> list) {

        //创建Message对象 将集合保存其中
        Message msg  = new Message();
        msg.obj=list;

        //发送给handler
        handler.sendMessage(msg);
    }

    //重写点击条目事件 实现跳转页面 展示WebView
    @Override
    public void itemOnClick(int position) {
        //实现跳转到WebView页面
        Intent intent = new Intent(RecyclerViewActivity.this,WebViewActivity.class);
        //传入相应的页面url title dp
        intent.putExtra("url",list.get(position).getUrl());
        intent.putExtra("title",list.get(position).getTitle());
        intent.putExtra("dp",list.get(position).getDescription());
        //跳转
        startActivity(intent);
    }
}

8.OkHtpp的Get、Post封装

package com.example.yuekaomoni.utils;
import android.os.Environment;
import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;

public class OkhtttpUtils {

    //单例模式,把构造方法进行私有化
    public OkhtttpUtils(){};
    static OkHttpClient client;
    public static OkHttpClient getInstance(){
            if(client==null){
                //添加同步锁,更加安全
                synchronized (OkHttpClient.class){
                    //缓存的地方
                    File file = new File(Environment.getExternalStorageDirectory(),"cache11");

                    client=new OkHttpClient().newBuilder()
                            .readTimeout(3000, TimeUnit.SECONDS)//设置读取的超时时间
                            .connectTimeout(3000,TimeUnit.SECONDS)//设置连接的超时时间
                            .cache(new Cache(file,10*1024))
                            .build();
                }
            }

        return client;
    }

    //创建一个get请求的方法
    public static void daGet(String url, Callback callback){

        //1.拿到OkHttpClient客户端对象
        OkHttpClient client=getInstance();

        //2.进行请求的操作
        Request request = new Request.Builder()
                .url(url)
                .build();
        client.newCall(request).enqueue(callback);
    }


    //创建一个post请求的方法
    public static void daPost(String url, Map<String,String> parms, Callback callback){

        //1.拿到OkHttpClient客户端对象
        OkHttpClient client=getInstance();

        FormBody.Builder body = new FormBody.Builder();

        for (String key:parms.keySet()){
            body.add(key,parms.get(key));
        }

        Request request = new Request.Builder()
                .url(url)
                .post(body.build())
                .build();
            client.newCall(request).enqueue(callback);
    }
}

9.适配器

package com.example.yuekaomoni.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.yuekaomoni.R;
import com.example.yuekaomoni.model.MyDataBean;
import java.util.List;

public class MyAdapter extends RecyclerView.Adapter{
    
    Context context;
    List<MyDataBean.NewslistBean> list;
    public MyAdapter(Context context, List<MyDataBean.NewslistBean> list) {
        this.context=context;
        this.list=list;
    }
    
    //创建一个实现类
    OnClickListener listener;
    public void OnClick(OnClickListener listener){
        this.listener=listener;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //引入条目布局
        View view = View.inflate(context, R.layout.rcv_item, null);

        //创建MyViewHolder view传过去
        MyViewHolder myViewHolder = new MyViewHolder(view);

        //返回myViewHolder
        return myViewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        final MyViewHolder myViewHolder = (MyViewHolder) holder;

        myViewHolder.rcv_title.setText(list.get(position).getTitle());
        myViewHolder.rcv_dp.setText(list.get(position).getDescription());
        myViewHolder.rcv_sj.setText(list.get(position).getCtime());
        String url = list.get(position).getPicUrl();

        Glide.with(context).load(url).into(myViewHolder.rcv_img);

        //给条目设置点击事件
        myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //获取条目的下标
                int layoutPosition = myViewHolder.getLayoutPosition();
                //将下标设置给点击事件
                listener.itemOnClick(layoutPosition);
            }
        });

    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        private final ImageView rcv_img;
        private final TextView rcv_title;
        private final TextView rcv_dp;
        private final TextView rcv_sj;

        public MyViewHolder(View view) {
            super(view);

            //找到布局中的资源控件
            rcv_img = view.findViewById(R.id.rcv_img);
            rcv_title = view.findViewById(R.id.rcv_title);
            rcv_dp = view.findViewById(R.id.rcv_dp);
            rcv_sj = view.findViewById(R.id.rcv_sj);
        }
    }

    //创建接口
    public interface OnClickListener{

        //定义条目的点击事件
        void itemOnClick(int position);
    }
}

10.数据Bean

package com.example.yuekaomoni.model;
import java.util.List;

public class MyDataBean {

    /**
     * code : 200
     * msg : success
     * newslist : [{"ctime":"2017-06-06 16:00","title":"模式思考:为什么星巴克成了印钞机?","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/2017060614515724.jpg","url":"http://www.chinaz.com/start/2017/0606/720004.shtml"},{"ctime":"2017-06-06 16:00","title":"佛学文化社群平台,\u201c般若\u201d要连接寺庙、僧人、善信","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/6363235766401474079822974.jpeg","url":"http://www.chinaz.com/start/2017/0606/720017.shtml"},{"ctime":"2017-06-06 16:00","title":"短视频不再是东北人的天下 \u201c川军\u201d已崛起","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/6363235842103727035736068.png","url":"http://www.chinaz.com/start/2017/0606/720028.shtml"},{"ctime":"2017-06-06 11:00","title":"中国文青创业者的最大金主:远离风口,专注慢公司","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/2017060610250221.jpg","url":"http://www.chinaz.com/start/2017/0606/719534.shtml"},{"ctime":"2017-06-06 10:00","title":"给程序员当经纪人,程序员客栈完成300万元天使轮融资","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/201706060900398654.jpg","url":"http://www.chinaz.com/start/2017/0606/719406.shtml"},{"ctime":"2017-06-06 10:00","title":"经历多次押宝失败的TOM网,可能要因政策原因而彻底断了挣扎","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0606/6363233672258475907689785.jpeg","url":"http://www.chinaz.com/start/2017/0606/719411.shtml"},{"ctime":"2017-06-05 17:00","title":"网易蜗牛读书:突破付费模式 敲碎纸电隔阂","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/201706051550205463.jpg","url":"http://www.chinaz.com/start/2017/0605/718537.shtml"},{"ctime":"2017-06-05 17:00","title":"五年之后,网易新闻为什么彻底放弃了\u201c有态度\u201d","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/201706051600289006.jpg","url":"http://www.chinaz.com/start/2017/0605/718557.shtml"},{"ctime":"2017-06-05 17:00","title":"一年赚了知性女青年7000万元,它却是行业不擅长挣钱的公司","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/201706051619455958.jpg","url":"http://www.chinaz.com/start/2017/0605/718595.shtml"},{"ctime":"2017-06-05 15:00","title":"从兴起到洗牌仅用一年!谁让这场全民狂欢戛然而止?","description":"创业新闻","picUrl":"http://pic.chinaz.com/thumb/2017/0605/6363226806028247287344888.jpg","url":"http://www.chinaz.com/start/2017/0605/718364.shtml"}]
     */

    private int code;
    private String msg;
    private List<NewslistBean> newslist;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<NewslistBean> getNewslist() {
        return newslist;
    }

    public void setNewslist(List<NewslistBean> newslist) {
        this.newslist = newslist;
    }

    public static class NewslistBean {
        /**
         * ctime : 2017-06-06 16:00
         * title : 模式思考:为什么星巴克成了印钞机?
         * description : 创业新闻
         * picUrl : http://pic.chinaz.com/thumb/2017/0606/2017060614515724.jpg
         * url : http://www.chinaz.com/start/2017/0606/720004.shtml
         */

        private String ctime;
        private String title;
        private String description;
        private String picUrl;
        private String url;

        public String getCtime() {
            return ctime;
        }

        public void setCtime(String ctime) {
            this.ctime = ctime;
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public String getPicUrl() {
            return picUrl;
        }

        public void setPicUrl(String picUrl) {
            this.picUrl = picUrl;
        }

        public String getUrl() {
            return url;
        }

        public void setUrl(String url) {
            this.url = url;
        }
    }
}

11.第三方登录的页面

package com.example.yuekaomoni;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.example.yuekaomoni.view.RecyclerViewActivity;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.bean.SHARE_MEDIA;
import java.util.Map;

public class LoginActivity extends AppCompatActivity {

    private Button login;
    private Button skip;
    private TextView name;
    private TextView gender;
    private TextView province;
    private ImageView iconurl;
    private LinearLayout ll_data;

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

        //找到资源控件的ID
        login = findViewById(R.id.btn_login);//第三方登录
        skip = findViewById(R.id.btn_skip);//跳转
        name = findViewById(R.id.log_name);//姓名
        gender = findViewById(R.id.log_gender);//性别
        province = findViewById(R.id.log_province);//地址
        iconurl = findViewById(R.id.log_iconurl);//头像
        ll_data = findViewById(R.id.ll_data);//总布局
        
        //点击进行第三方登录
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //1.获取用户资料可以使用如下接口:SHARE_MEDIA.QQ (此处可以更改QQ扣扣/SINA新浪/WEIXIN微信)
                UMShareAPI.get(LoginActivity.this).getPlatformInfo(LoginActivity.this,
                        SHARE_MEDIA.QQ, authListener);
            }
        });
        
        //点击跳转按钮跳转到RecyclerView显示页面
        skip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(LoginActivity.this,RecyclerViewActivity.class);
                //启动
                startActivity(intent);
                //关闭页面
                finish();
            }
        });
    }
    
    //3.定义此方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data);
    }
    
    //2.设置监听
    UMAuthListener authListener = new UMAuthListener() {
        /**
         * @desc 授权开始的回调
         * @param platform 平台名称
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {
        }
        /**
         * @desc 授权成功的回调
         * @param platform 平台名称
         * @param action 行为序号,开发者用不上
         * @param data 用户资料返回
         */
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            Toast.makeText(LoginActivity.this, "成功了", Toast.LENGTH_LONG).show();

            if(data!=null){
                //未开具进行赋值(数据存在Map集合中)
                name.setText(data.get("name"));//姓名
                gender.setText(data.get("gender"));//性别
                province.setText(data.get("province"));//地址
                Glide.with(LoginActivity.this).load(data.get("iconurl")).into(iconurl);//头像
                ll_data.setVisibility(View.VISIBLE);
            }else{
                ll_data.setVisibility(View.INVISIBLE);
            }
            
        }
        /**
         * @desc 授权失败的回调
         * @param platform 平台名称
         * @param action 行为序号,开发者用不上
         * @param t 错误原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            Toast.makeText(LoginActivity.this, "失败:" + t.getMessage(),                                     Toast.LENGTH_LONG).show();
        }
        /**
         * @desc 授权取消的回调
         * @param platform 平台名称
         * @param action 行为序号,开发者用不上
         */
        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {
            Toast.makeText(LoginActivity.this, "取消了", Toast.LENGTH_LONG).show();
        }
    };
    
}

12.Wed页面的分享

package com.example.yuekaomoni;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.Toast;
import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMShareListener;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMWeb;

public class WebViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        
        //找到资源控件的ID
        WebView wv = findViewById(R.id.wv);
        Button share = findViewById(R.id.share);

        //接收条目传来的url
        Intent intent = getIntent();
        String url = intent.getStringExtra("url");
        final String title = intent.getStringExtra("title");
        final String dp = intent.getStringExtra("dp");

        //设置支持与JavaScript进行交互
        wv.getSettings().setJavaScriptEnabled(true);

        //url设置在WebView        wv.loadUrl(url);

        //设置自己的浏览器
        wv.setWebViewClient(new WebViewClient(){

            //覆盖shouldOverrideUrlLoading 方法
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        //给分享按钮设置点击事件
        share.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View view) {

                //创建分享的标题描述等
                UMWeb web = new UMWeb("http:www.baidu.com");
                web.setTitle(title);//标题
                web.setDescription(dp);//描述

                //9.使用分享面板的分享,用户可以调用我们的打开分享面板的方法,点击分享面板的对应平台进行分享
                // (不使用分享面板的分享,用户可以自己写分享按钮,或者触发事件,然后调用我们的分享方法,进行分享)
                new ShareAction(WebViewActivity.this).withMedia(web)
                        .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN)
                        .setCallback(shareListener).open();
            }
        });

    }
    
    //手动集成
    //1.下载SDK2.main文件夹以及platform(选择你想使用的平台即可)文件下,对应的资源文件和jar放入你的工程!
    //3.在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivityactivity继承WXCallbackActivity(限用于微信)
    //4.QQ与新浪不需要添加Activity,但需要在使用QQ分享或者授权的Activity中,添加:(也可省略)


//    @Override
//    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//        super.onActivityResult(requestCode, resultCode, data);
//        UMShareAPI.get(this).onActivityResult(requestCode,resultCode,data);
//    }

    //10.其中umShareListener为回调监听,构建如下:
    private UMShareListener shareListener = new UMShareListener() {
        /**
         * @descrption 分享开始的回调
         * @param platform 平台类型
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {
        }
        /**
         * @descrption 分享成功的回调
         * @param platform 平台类型
         */
        @Override
        public void onResult(SHARE_MEDIA platform) {
            Toast.makeText(WebViewActivity.this,"成功了",Toast.LENGTH_LONG).show();
        }
        /**
         * @descrption 分享失败的回调
         * @param platform 平台类型
         * @param t 错误原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
            Toast.makeText(WebViewActivity.this,"失败"+t.getMessage(),Toast.LENGTH_LONG).show();
        }
        /**
         * @descrption 分享取消的回调
         * @param platform 平台类型
         */
        @Override
        public void onCancel(SHARE_MEDIA platform) {
            Toast.makeText(WebViewActivity.this,"取消了",Toast.LENGTH_LONG).show();
        }
    };
}

13.application用于初步配置第三方

package com.example.yuekaomoni;
import android.app.Application;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;

public class application extends Application{

    //三方的key
    {
        PlatformConfig.setWeixin("wx967daebe835fbeac","5bb696d9ccd75a38c8a0bfe0675559b3");
        PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
        PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com");
    }

    @Override
    public void onCreate() {
        super.onCreate();

        /**
         * 初始化common         * 参数1:上下文,不能为空
         * 参数2:设备类型,UMConfigure.DEVICE_TYPE_PHONE为手机、UMConfigure.DEVICE_TYPE_BOX为盒子,默认为手机
         * 参数3:Push推送业务的secret
         */

        //8.初始化需要在您的Application中调用我们的初始化接口:
        UMConfigure.init(this,"5a12384aa40fa3551f0001d1",
                "umeng", UMConfigure.DEVICE_TYPE_PHONE,"");//58edcfeb310c93091c000be2 5965ee00734be40b580001a0

    }
}

14.清单文件的配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yuekaomoni">

    <!-- 必须的权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 推荐的权限 -->
    <!-- 添加如下权限,以便使用更多的第三方SDK和更精准的统计数据 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:name=".application"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".LoginActivity" />
        <activity android:name=".view.RecyclerViewActivity" />
        <activity android:name=".WebViewActivity" />

        <activity android:name=".wxapi.WXEntryActivity"></activity>


        <!-- 配置文件方式初始化appkeychannel -->
        <meta-data android:name="UMENG_APPKEY" android:value="5ac599ccf43e4822c00003ba" />
        <meta-data android:name="UMENG_CHANNEL" android:value="Channel ID" />


        <!--5.新浪-->
        <activity
            android:name="com.umeng.socialize.media.WBShareCallBackActivity"
            android:configChanges="keyboardHidden|orientation"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:exported="false"
            android:screenOrientation="portrait" >
        </activity>
        <activity android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"
            android:configChanges="keyboardHidden|orientation"
            android:exported="false"
            android:windowSoftInputMode="adjustResize"
            >
        </activity>
        <activity
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
            android:launchMode="singleTask"
            android:name="com.sina.weibo.sdk.share.WbShareTransActivity">
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>


        <!--6.QQ-->
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="tencent100424468" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:configChanges="orientation|keyboardHidden|screenSize"/>

        <!--微信(暂不可用)-->
        <!--<activity-->
            <!--android:name=".wxapi.WXEntryActivity"-->
            <!--android:configChanges="keyboardHidden|orientation|screenSize"-->
            <!--android:exported="true"-->
            <!--android:screenOrientation="portrait"-->
            <!--android:theme="@android:style/Theme.Translucent.NoTitleBar"/>-->

    </application>

</manifest>

15.条目布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.yuekaomoni.MainActivity">

    <ImageView
        android:id="@+id/my_img1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/img1"/>
    <ImageView
        android:id="@+id/my_img2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/img2"
        android:visibility="invisible" />

</FrameLayout>
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.example.yuekaomoni.LoginActivity">

        <Button
            android:id="@+id/btn_login"
            android:layout_width="match_parent"
            android:layout_height="100px"
            android:text="第三方登录" />
        <LinearLayout
            android:id="@+id/ll_data"
            android:layout_width="match_parent"
            android:layout_height="0px"
            android:layout_weight="1"
            android:orientation="vertical"
            android:visibility="invisible"
            android:layout_marginLeft="100px">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10px"
            android:layout_marginTop="20px">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="昵称:"/>
            <TextView
                android:id="@+id/log_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20px"
                android:text="进一步没资格"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10px"
            android:layout_marginTop="20px">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="性别:"/>
            <TextView
                android:id="@+id/log_gender"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20px"
                android:text=""/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10px"
            android:layout_marginTop="20px">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="地址:"/>
            <TextView
                android:id="@+id/log_province"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20px"
                android:text="退一步舍不得"/>
        </LinearLayout>


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="10px"
            android:layout_marginTop="20px">

            <ImageView
                android:id="@+id/log_iconurl"
                android:layout_width="300px"
                android:layout_height="300px"
                android:layout_marginLeft="20px"
                android:src="@mipmap/ic_launcher"/>
        </LinearLayout>

    </LinearLayout>
    <Button
        android:id="@+id/btn_skip"
        android:layout_width="match_parent"
        android:layout_height="100px"
        android:text="跳转" />

</LinearLayout>
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.yuekaomoni.view.RecyclerViewActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="80px"
        android:text="标题"
        android:layout_gravity="center"
        android:gravity="center"
        android:textSize="28px"
        android:textStyle="bold"
        android:background="#ff0"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_rcv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.yuekaomoni.WebViewActivity">

    <Button
        android:id="@+id/share"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="440px"
        android:text="分享"/>

    <WebView
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </WebView>

</LinearLayout>
 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="20px">
        <ImageView
            android:id="@+id/rcv_img"
            android:layout_width="100px"
            android:layout_height="100px"
            android:src="@mipmap/ic_launcher"/>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20px">

            <TextView
                android:id="@+id/rcv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="短视频不再是东北人的天下"/>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:paddingTop="20px">
                <TextView
                    android:id="@+id/rcv_dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="创业新闻"/>
                <TextView
                    android:id="@+id/rcv_sj"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="2017-06-06 16:00"/>

            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

OkHttp是一个流行的开源的HTTP客户端,它可以用于发送和接收HTTP请求。要实现GitHub第三方登录,我们可以使用OkHttp向GitHub的认证服务器发送请求,并获取授权码或访问令牌。 下面是一个用OkHttp实现GitHub第三方登录的简单的步骤: 1. 首先,我们需要在GitHub开发者平台注册一个应用程序,获得Client ID和Client Secret。这些凭证将用于向GitHub认证服务器证明我们的应用程序的身份。 2. 在应用程序中,创建一个OkHttpClient实例并实例化一个Request对象。Request对象应该包含登录请求的URL、请求方法(一般是GET或POST)、请求头(包括Accept和User-Agent等)以及需要的参数(如Client ID、Client Secret和一些其他参数)。 3. 调用OkHttpClient的newCall方法并传入Request对象来创建Call对象。 4. 调用Call对象的execute方法来发送请求并获取响应。得到的响应是一个Response对象。 5. 从Response对象中获取响应的内容,可能是JSON格式的数据。如果响应中包含授权码或访问令牌,我们可以将其用于后续的访问。 6. 进行登录验证和其他操作。根据响应内容和需要,可以使用OkHttp继续发送请求并处理响应。 需要注意的是,此处的步骤是简化的,并且可能因GitHub的认证流程而有所不同。在实际的应用程序中,还需要处理认证过程中的错误、重试机制、OAuth协议的授权流程等相关问题。 总结来说,使用OkHttp实现GitHub第三方登录需要创建OkHttpClient和Request对象,发送请求并获取响应,然后根据需要处理响应,获取授权码或访问令牌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值