IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 联想,雷电,mumu,游戏饭(长尾)游戏联运SDK接入 -> 正文阅读

[移动开发]Android 联想,雷电,mumu,游戏饭(长尾)游戏联运SDK接入

最近国内做买量的游戏有点点多,顺便分享这几个渠道接入流程,还有要注意的一些坑,提供给同学们学习下!

一.联想SDK

官网:联想开放平台
接入SDK的版本号:V3.0.0

接口代码:


public class LenovoProxy {
    private static final String TAG = LenovoProxy.class.getSimpleName();
    private static LenovoProxy lenovoProxy = null;

    private static final String SDK_VERSION = "3.0.0";

    private static final String appId = "xxxxxx";

    public static LenovoProxy getInstance() {
        if (null == lenovoProxy) {
            lenovoProxy = new LenovoProxy();
        }
        return lenovoProxy;
    }

    /**
     * 初始化
     *
     * @param activity
     */
    public void init(Activity activity) {
        LenovoGameApi.doInit(activity, appId);
        /**
         * 防沉迷,默认不开启
         * true 开启未成年时长限制,时长到期后,弹出限制弹窗,强制引导退出游戏。
         * false 不开启未成年时长限制,时长到期后,不做任何处理
         */
        LenovoGameApi.isLimitLoginTime(true);
    }

    /**
     * 登录
     *
     * @param activity
     */
    public void login(Activity activity) {
        LenovoGameApi.doAutoLogin(activity, new IAuthResult() {
            @Override
            // 登录回调,处理登录结果
            public void onFinished(boolean ret, String data) {
                /**
                 * 返回值 ret:true 成功,false 失 败
                 * 返回值 data:登录 ST(token)
                 */
                if (ret) {
                    // 登录成功
                    String token = data;
                    /**
                     * 获取到渠道token
                     * 请求自己的服务端进行验证
                     */
                } else {
                    // 登录失败(失败原因开启飞行模式、 网络不通等)

                }
            }
        });
    }

    /**
     * 储值
     *
     * @param activity
     * @param map      可改用其它数据模型进行传入
     */
    public void pay(Activity activity, Map map) {
        GamePayRequest payRequest = new GamePayRequest();
        // 请填写商品自己的参数
        payRequest.addParam("notifyurl", "");// 当前版本暂时不用,传空String
        payRequest.addParam("appid", appId);
        payRequest.addParam("waresid", "waresid");//商品id
        payRequest.addParam("quantity", "quantity");//商品数量
        /**
         * 游戏方生成的订单号
         * 请求自己服务端生成订单号,返回给客户端
         * 由客户端传到渠道方法,拉起储值
         *
         * 如果没有服务端,那就客户端随机生成,如下
         */
        payRequest.addParam("exorderno", "sample" + System.currentTimeMillis());
        payRequest.addParam("price", "price");//商品价格
        payRequest.addParam("cpprivateinfo", "123456");//附加信息,最大长度128

        LenovoGameApi.doPay(activity, "", payRequest, new IPayResult() {

            @Override
            public void onPayResult(int resultCode, String signValue, String resultInfo) {// resultInfo =
                // 应用编号&商品编号&外部订单号

                if (LenovoGameApi.PAY_SUCCESS == resultCode) {
                    // 支付成功
                    Log.i(TAG, "sample:支付成功 ");

                } else if (LenovoGameApi.PAY_CANCEL == resultCode) {
                    Log.i(TAG, "sample:取消支付 ");
                    // 取消支付处理,默认采用finish(),请根据需要修改
                } else {
                    // 计费失败处理,默认采用finish(),请根据需要修改
                    Log.i(TAG, "sample:支付失败 ");
                }
            }
        });
    }

    /**
     * 查询实名认证
     * CP 可以调用该接口获取当前登录用户实名认证的年龄;如用户未进行实名认证,
     * 会先弹出实名认证的界面;如用户已认证,会返回年龄(age)可以通过年龄来判断用
     * 户是否成年.
     *
     * @param activity
     * @param token    渠道登录成功返回的ST
     */
    public void registerRealName(Activity activity, String token) {
        LenovoGameApi.doCheckRealAuth(activity, token, new OnAuthVerifyListener() {
            @Override
            public void onBackSuccess(boolean isAuthened, int age, String pi) {
                if (isAuthened) {
                    //实名
                    if (age >= 18) {
                        //成年
                    }
                } else {
                    //未实名
                }
            }

            @Override
            public void onBackFailed(int code, String message) {

            }
        });
    }

    /**
     * 返回键
     *
     * @param activity
     */
    public void onBackPressed(Activity activity) {
        LenovoGameApi.doQuit(activity, new IAuthResult() {
            @Override
            public void onFinished(boolean result, String data) {
                Log.i(TAG, "onFinished:" + data);
                if (result) {
                    activity.finish();
                    System.exit(0);
                } else {
                    // "用户点击底部返回键或点击弹窗close键"
                }
            }
        });
    }
}

联想的接入比较简单,到这结束。

二.雷电SDK

此处不包含闪屏代码,请同学自行处理。
接入SDK版本号:V2.4.4_5

接口代码:


public class ThunderProxy {
    private static final String TAG = ThunderProxy.class.getSimpleName();
    private static ThunderProxy thunderProxy = null;

    private String mUid;
    private static final String SDK_VERSION = "2.4.4_5";
    //接入参数由雷电提供的
    private static final String GAME_ID = "xxx";  //游戏ID
    private static final String CHANNEL_ID = "xxx"; //渠道ID
    private static final String SUN_CHANNEL_ID = "xxx"; //子渠道,分渠道
    private static final String APP_SECRET_ID = "xxx";  //app密钥

    public static ThunderProxy getInstance() {
        if (null == thunderProxy) {
            thunderProxy = new ThunderProxy();
        }
        return thunderProxy;
    }

    /**
     * 初始化
     *
     * @param activity
     */
    public void init(Activity activity) {

        LdInfo info = new LdInfo();
        info.gameId = GAME_ID;
        info.channel = CHANNEL_ID;
        info.sunChannel = SUN_CHANNEL_ID;
        info.appSecret = APP_SECRET_ID;

        /**
         * 注意:gameId 、channel、sunChannel还需在AndroidManifests中配置,详见上方 配置信息
         * appSecret 是我方提供的AppKey,需要和ServerKey区分开
         */
        LdSdkManger.getInstance().init(activity, info, new InitCallBack() {

            @Override
            public void callback(int code, String desc) {
                String result = "初始化返回--code: " + code + " ,desc: " + desc;
                Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
                switch (code) {
                    case 0:
                        //初始化成功
                        break;
                    case 1://初始化失败
                    default:
                        break;
                }
            }
        });
    }

    public void login(Activity activity) {
        /**
         * 注意:
         * 1、悬浮窗内部退出登录与游玩超时下线都是在此接口返回,code = 2 (需要厂商处理退出账号的逻辑)
         * 2、注销账号功能,在此接口返回,code = 3 (需要厂商处理注销账号的逻辑)
         * code:0.登录成功;1.登录失败;2.退出登录界面;3.注销游戏账号
         */
        LdSdkManger.getInstance().showLoginView(activity, new LoginCallBack() {

            @Override
            public void callback(int code, String uid, String timestamp, String sign, String decs) {
                /**
                 * code:0.登录成功;1.登录失败;2.退出登录界面;3.注销游戏账号
                 * uid:平台的用户 ID
                 * timestamp:时间戳
                 * sign:签名串(user_token)
                 * desc:描述
                 */
                mUid = uid;
                switch (code) {
                    case 0:
                        /**
                         * 登录成功
                         * 获取uid,user_token等上传到服务器验证登录
                         */
                        Log.i(TAG, "登录成功:" + code + " ;decs: " + decs);
                        break;
                    case 2:
                        //退出登录界面
                        Log.i(TAG, "登出成功:" + code + " ;decs: " + decs);
                        break;
                    case 3:
                        //注销游戏账号
                        Log.i(TAG, "注销游戏账号:" + code + " ;decs: " + decs);
                        break;
                    case 1:
                    default:
                        //登录失败
                        Log.i(TAG, "登录失败:" + code + " ;decs: " + decs);
                        break;
                }
            }
        });
    }

    /**
     * 退出游戏
     *
     * @param activity
     */
    public void exitGame(final Activity activity) {
        LdSdkManger.getInstance().showExitView(activity, new ExitCallBack() {

            @Override
            public void onFinish(int i, String s) {
                //code 0.退出游戏;1.继续游戏;
                if (i == 0) {
                    //销毁资源的方法
                    LdSdkManger.getInstance().DoRelease(activity);
                    Log.i(TAG, "确认退出应用");
                } else if (i == 1) {
                    Log.i(TAG, "取消退出应用");
                }
            }
        });
    }

    /**
     * 储值
     *
     * @param activity
     */
    public void pay(Activity activity) {

        /**
         * 注意:以下所有参数都不能为空,否则会支付失败,没有的参数用任意值代替
         */
        LdPayInfo ldPayInfo = new LdPayInfo();

        ldPayInfo.orderId = "12345"; //游戏的支付订单号

        //支付金额(单位:分)
        //注意:如果返回的Price包含小数点,必须要截取,否则支付失败
        //例如:返回的是100.0,此时直接传入是支付失败;处理变成100,正常
        ldPayInfo.amount = "1";//支付金额(单位:分)
        ldPayInfo.productId = "12";  //定额的产品支付,暂时没用到,默认值

        ldPayInfo.productDesc = "充值金币";//商品描述
        ldPayInfo.productName = "金币";//商品名称
        ldPayInfo.roleId = "10086";// 角色id
        ldPayInfo.roleName = "张三";// 角色名字
        ldPayInfo.serverId = "23";// 服务器id
        ldPayInfo.serverName = "内测服";//服务器名字;


        LdSdkManger.getInstance().showChargeView(activity, ldPayInfo, new PayCallback() {
            @Override
            public void callback(int code, String uid, String billno, String timestamp, String decs) {
                /**
                 * code 0.支付成功;1.支付失败;2.取消支付,退出支付界面
                 * uid 平台的用户 ID
                 * billno 充值订单id
                 */
                switch (code) {
                    case 0:
                        //支付成功
                        Log.i(TAG, "支付成功");
                        break;
                    case 2://取消支付,退出支付界面
                        Log.i(TAG, "取消支付");
                        break;
                    case 1://支付失败
                    default:
                        Log.i(TAG, "支付失败");
                        break;
                }
            }
        });
    }

    /**
     * isForce  是否强制实名,true该弹窗在实名认证成功前不可关闭
     */
    public void registerRealName() {

        LdSdkManger.getInstance().verifyIdCard(true, new VerifyIdCardListener() {
            @Override
            public void callback(int code, String birthday, boolean isAdult) {
                /**
                 * code;       		0.不可用; 1.成功; 2.验证中; 3.验证不通过;
                 * birthday;       	用户出生日期(19990909)
                 * isAdult;			是否成年
                 */
                switch (code) {
                    case 1:
                        if (isAdult) {
                            //成年

                        } else {
                            //未成年

                        }
                        break;
                    case 0:
                    case 2:
                    case 3:
                    default:

                        break;
                }
            }
        });
    }

    /**
     * 上传角色信息
     *
     * @param activity
     */
    public void updateRoleInfo(Activity activity) {


        LdGameInfo ldGameInfo = new LdGameInfo();
        ldGameInfo.uid = mUid;
        ldGameInfo.serverId = "23";// 服务器id
        ldGameInfo.serverName = "内测服";//服务器名字
        ldGameInfo.roleId = "10086";// 角色id
        ldGameInfo.roleName = "张三";// 角色名字
        ldGameInfo.roleType = ""; //角色类型,例如:战士,魔法师,弓箭手
        ldGameInfo.level = "99"; //等级
        ldGameInfo.money = "10000000000000"; //游戏的金币数
        ldGameInfo.partyName = "工会";//公会
        ldGameInfo.powerNum = 10000;//角色战斗力
        ldGameInfo.vipLevel = 12;//VIP等级


        LdSdkManger.getInstance().enterGame(activity, ldGameInfo, new EntryCallback() {
            @Override
            public void callback(int code, String desc) {
                if (code == 0) {
                    //上传成功

                }
            }
        });
    }


    /**
     * 获取用户信息
     *
     * @param activity
     * @return
     */
    public LdUserInfo getUserInfo(Activity activity) {
        /**
         * uid;            	用户id
         * username;       	用户账号
         * password;			用户密码
         * nickName;			用户昵称
         * phoneNumber;		用户手机号码
         * email;			用户邮箱
         * realName;			用户实名认证姓名
         * birthday;			用户实名认证出生日期(格式:20190101)
         * isAuthenticated;	用户是否实名认证
         */
        LdUserInfo ldUserInfo = LdSdkManger.getInstance().getUserInfo();
        return ldUserInfo;
    }

    /**
     * 浮窗
     *
     * @param activity
     */
    public void onResume(Activity activity) {
        LdSdkManger.getInstance().showFloatView(activity);
    }

    public void onPause(Activity activity) {
        LdSdkManger.getInstance().hideFlowView(activity);
    }

    public void onDestroy(Activity activity) {
        //释放SDK
        LdSdkManger.getInstance().DoRelease(activity);
    }
}

雷电SDK接入到此结束!

三.网易MUMU SDK

  • 确保minSdkVersion要大于等于15
  • targetSdkVersion目前最高支持到26

注意:

  • SDK提供的三种闪屏方式,必须接入任意一种,否则后面的功能都无法使用。
  • 使用非AndroidX

接口代码:


public class MuMuProxy {
    private static final String TAG = MuMuProxy.class.getSimpleName();
    private static MuMuProxy muMuProxy = null;

    private static final String SDK_VERSION = "1.0.6";
    private HubAction hubAction;

    public static MuMuProxy getInstance() {
        if (null == muMuProxy) {
            muMuProxy = new MuMuProxy();
        }
        return muMuProxy;
    }

    /**
     * 初始化
     *
     * @param activity
     */
    public void init(Activity activity) {
        hubAction = new HubAction() {
            @Override
            public void onInit(int i, String s) {
            }

            @Override
            public void onSplash() {

            }

            @Override
            public void onLogin(int code, String msg, UserInfo info) {
                if (code == HubCode.OK) {
                    /**
                     * 登录成功
                     * info.getUid()
                     * info.getToken()
                     * 上传服务端验证
                     */
                } else {
                    //登录失败
                }
            }

            @Override
            public void onPay(int code, String msg, PayInfo info) {
                // 请处理支付的结果
                if (code == HubCode.OK) {
                    //支付成功

                } else {
                    //支付失败
                }
            }

            @Override
            public void onLogout() {
                // 请处理账户登出事件
                // 注意:此接口触发条件为两种:
                // 1.主动调用退出登录接口
                // 2.菜单中点击切换账号。
                // 切换账号导致的接口回调会重新触发登录操作
                // 所以请不要再在此接口处调用SDK的退出操作

            }

            @Override
            public void onQuit(boolean realQuit) {
                // 请处理关闭游戏的逻辑
                if (realQuit) {
                    //确认退出应用
                } else {
                    //取消退出应用
                }
            }
        };
        Api.getInstance().register(hubAction);
        Api.getInstance().splashCreate(activity);
    }

    /**
     * 登录
     *
     * @param activity
     */
    public void login(Activity activity) {
        Api.getInstance().login(activity);
    }

    /**
     * 登出
     *
     * @param activity
     */
    public void logout(Activity activity) {
        Api.getInstance().logout(activity);
    }

    /**
     * 退出
     *
     * @param activity
     */
    public void exitGame(Activity activity) {
        Api.getInstance().quit(activity);
    }

    /**
     * 储值
     *
     * @param activity
     */
    public void pay(Activity activity) {

        PayInfo info = new PayInfo();
        //请求服务端创单 或者其它方式生成订单号
        info.setGameOrderId("hub_test_" + System.currentTimeMillis());
        info.setGoodsId("product_01");//商品id
        info.setGoodsName("一堆钻石");//商品名称
        info.setGoodsCount(1);//商品数量
        /**
         * 注意:以下3个价格参数均为同一参数
         * 单位:分
         */
        info.setGoodsPrice(1);
        info.setOrderPrice(1);
        info.setActualPrice(1);
        info.setCurrency("CNY");//币种
        //储值回调
        info.setNotifyUrl("xxxxx");
        try {
            /**
             * 需要出入更多的参数,可以按一下方式传入
             */
            JSONObject reserveInfo = new JSONObject();
            reserveInfo.put("key1", "value1");
            reserveInfo.put("key2", "value2");
            reserveInfo.put("key3", "value3");
            info.setReserved(reserveInfo.toString());
        } catch (Exception e) {/*ignore it*/}
        Api.getInstance().pay(activity, info);
    }
}

MUMU SDK接入到此结束!

四.游戏饭(长尾)SDK

注意事项:

  1. 健康游戏忠告(8句)
  2. SDK所有接口都必须调用且在主线程中调用
  3. apk的签名只能使用V1签名

接口代码:


public class YXFProxy {
    private static final String TAG = YXFProxy.class.getSimpleName();
    private static YXFProxy yxfProxy = null;

    private static final String SDK_VERSION = "6.4";

    private GameInfo gameInfo;
    private ICallback callback;
    private boolean isPaySuccess = false;

    public static YXFProxy getInstance() {
        if (null == yxfProxy) {
            yxfProxy = new YXFProxy();
        }
        return yxfProxy;
    }


    public void init(Activity activity) {
        callback = new ICallback() {

            @Override
            public void onError(int type, String message) {
                switch (type) {
                    case ICallback.INIT:
                        //初始化失败
                        break;
                    case ICallback.LOGIN:
                        //登陆失败
                        break;
                    case ICallback.CREATE_ROLE:
                        //创建角色失败
                        break;
                    case ICallback.UPLOAD_GAME_INFO:
                        //更新角色信息失败
                        break;
                    case ICallback.PAY:
                        //支付失败
                        break;
                    case ICallback.PAY_FINISH:
                        /**
                         * 这是坑,记得好好踩
                         * 注意:支付弹窗点击外部消失  和  支付成功都会回调这个接口
                         * 默认回调成功,是否真正成功由原厂判断,提示语用比较婉转的文案
                         */
                        if (!isPaySuccess) {
                            //取消支付
                        }
                        isPaySuccess = false;
                        break;
                    case ICallback.LOGOUT:
                        //登出失败
                        break;
                    case ICallback.EXIT:
                        //取消退出应用
                        break;
                    default:
                        Log.i(TAG, "onError type = " + type + "  , message = " + message);
                        break;
                }
            }

            @Override
            public void logoutSuccess() {
                //登出成功
            }

            @Override
            public void paySuccess(String orderId) {
                //支付成功
                isPaySuccess = true;
            }

            @Override
            public void initSuccess() {
                //初始化成功
            }

            @Override
            public void loginSuccess(UserInfoModel userInfoModel) {
                //
                /**
                 * 登陆验证 token的有效时间为2分钟
                 * 获取pid,userInfoModel.sessionId
                 * 进行登录验证
                 */
                String pid = userInfoModel.pid;
                String sessionId = userInfoModel.sessionId;
            }

            @Override
            public void setGameInfoSuccess(String loginTime) {
            }

            @Override
            public void exitSuccess() {
                // 推荐退出方法
                Intent startMain = new Intent(Intent.ACTION_MAIN);
                startMain.addCategory(Intent.CATEGORY_HOME);
                startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                activity.startActivity(startMain);
                Process.killProcess(Process.myPid());
            }

            @Override
            public void createRoleSuccess() {
            }
        };

        YYReleaseSDK.getInstance().sdkInit(activity, callback);
    }


    public void login(Activity activity) {
        YYReleaseSDK.getInstance().sdkLogin(activity, callback);
    }

    public void logout(Activity activity) {
        YYReleaseSDK.getInstance().onSdkLogOut(activity, gameInfo, callback);
    }

    public void exitGame(Activity activity) {
        YYReleaseSDK.getInstance().onSdkExit(activity, gameInfo, callback);
    }

    public void pay(Activity activity) {
        //所有参数不能为空,否则报错
        GamePayInfo payInfo = new GamePayInfo();
        GameInfo gameInfo = getGameInfo();
        //自定义参数
        payInfo.setExtInfo("cusompay");
        //支付金额(只支持定额支付,以分为单位,值不能 少于 100 分)
        payInfo.setMoney("100");
        //充值回调
        payInfo.setNotifyUrl("xxxxx");
        //订单号,请求服务端创单 或 其它方式创单
        String orderId = "jh_" + System.currentTimeMillis();
        payInfo.setCpOrderId(orderId);
        //商品数量
        payInfo.setProductCount(10);
        //商品id
        payInfo.setProductId("001");
        //商品名称
        payInfo.setProductName("钻石");
        //秘钥,服务端生成返回
        payInfo.setSign(sign);

        YYReleaseSDK.getInstance().doPay(activity, gameInfo, payInfo, callback);
    }


    private GameInfo getGameInfo() {
        /**
         * 注意:这个渠道会分应用宝的包
         * setZoneId 和setServerId 传的值应该相同
         */
        String 区服ID = "123";
        String 角色名称 = "哈哈哈";
        gameInfo = new GameInfo();
        gameInfo.setRoleId("111111");
        gameInfo.setRoleLevel("11");
        gameInfo.setRoleName(角色名称);
        gameInfo.setZoneId(区服ID);
        gameInfo.setServerId(区服ID);
        gameInfo.setZoneName("big");
        gameInfo.setVipLevel("1");
        gameInfo.setRolePower("7465");
        return gameInfo;
    }

    /**
     * 创角
     *
     * @param activity
     */
    public void createRole(Activity activity) {
        YYReleaseSDK.getInstance().createRole(activity, gameInfo, callback);
    }

    /**
     * 角色升级
     *
     * @param activity
     */
    public void levelUpdate(Activity activity) {
        YYReleaseSDK.getInstance().levelUpdate(activity, gameInfo);
    }

    /**
     * 角色信息上报
     *
     * @param activity
     */
    public void updateRoleInfo(Activity activity) {
        getGameInfo();
        YYReleaseSDK.getInstance().setGameInfo(activity, gameInfo, true, callback);
    }


    public void onCreate(Activity activity) {
        YYReleaseSDK.getInstance().onCreate(activity);
    }

    public void onStart(Activity activity) {
        YYReleaseSDK.getInstance().onSdkStart(activity);
    }

    public void onRestart(Activity activity) {
        YYReleaseSDK.getInstance().onRestart(activity);
    }

    public void onResume(Activity activity) {
        YYReleaseSDK.getInstance().onSdkResume(activity);
    }

    public void onPause(Activity activity) {
        YYReleaseSDK.getInstance().onSdkPause(activity);
    }

    public void onStop(Activity activity) {
        YYReleaseSDK.getInstance().onSdkStop(activity);
    }

    public void onDestroy(Activity activity) {
        YYReleaseSDK.getInstance().onSdkDestory(activity);
    }

    public void onNewIntent(Intent intent) {
        YYReleaseSDK.getInstance().onNewIntent(intent);
    }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        //必须接入
        YYReleaseSDK.getInstance().onActivityResult(requestCode, resultCode, data);
    }
}

游戏饭(长尾) SDK接入到此结束!

所有demo下载:demo下载地址
如无法下载,可私信获取。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:20:14  更:2022-05-24 18:21:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:34:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码