Android 应用内更新 并且通知更新下载进度(通知栏兼容 Android 8.0)

Android 实现通知栏通知APP版本更新 前言: 我们似乎在做什么apk,都需要去做更新这个功能,那怎么去做这个功能才好呢,那当然在做的时候当然回去百度一下(除非是大神)。想我这个种没做一个比较好玩的功能的时候,第一步就是去百度大家的做法,想法。怎么去实现、怎么完成。怎样比较好看,和健壮性比较好。 一直一来自己都是小白,所以很明白小白的心情,自己写博客也会写的非常详细,希望大神勿喷。也希望小白能从中得到学习。 好了不啰嗦,马上开始我... 阅读详情

安卓8.0之后 原来的Notification 有所变动 已不满足需求

1. 首先增加了 NotificationChannel 属性 需要对其进行相关配置

    private static void createNotification(NotificationManager notificationManager) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(CALENDAR_ID, "ander drowload apk default channel.",
                    NotificationManager.IMPORTANCE_MIN);
            // 设置渠道描述
            notificationChannel.setDescription("通知更新");
            // 是否绕过请勿打扰模式
            notificationChannel.canBypassDnd();
            // 设置绕过请勿打扰模式
            notificationChannel.setBypassDnd(true);
            // 桌面Launcher的消息角标
            notificationChannel.canShowBadge();
            // 设置显示桌面Launcher的消息角标
            notificationChannel.setShowBadge(true);
            // 设置通知出现时声音,默认通知是有声音的
            notificationChannel.setSound(null, null);
            // 设置通知出现时的闪灯(如果 android 设备支持的话)
            notificationChannel.enableLights(false);

            notificationChannel.setLightColor(Color.RED);
            // 设置通知出现时的震动(如果 android 设备支持的话)
            notificationChannel.enableVibration(false);
            notificationManager.createNotificationChannel(notificationChannel);
        }
    }

2. 原来的Notification 方法已经不适用于8.0 系统

    public NotificationCompat.Builder getNotificationBuilder() {
        return new NotificationCompat.Builder(getApplicationContext(), CALENDAR_ID)
                .setWhen(System.currentTimeMillis())
                .setContentTitle("title")
                .setContentText("context...")
                .setSmallIcon(R.mipmap.ic_launcher_round)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.mipmap.ic_launcher_round))
                .setAutoCancel(true);
    }

3. 下载APK的方法 并实时更新通知栏进度

 DownloadUtil.get().download(DownloadConstant.apkDown, DownloadConstant.PATH_APK_DOWNLOAD_MANAGER, "zhaoyu.apk",
                new DownloadUtil.OnDownloadListener() {
                    @Override
                    public void onDownloadSuccess(File file) {
                        notificationBuilder .setContentText("下载成功,点击安装应用");
                        notificationBuilder.setContentIntent(pendingIntent);
                        notificationBuilder.setAutoCancel(true);
                        notification = notificationBuilder.build();
                        notificationManager.cancel(NotificationID);
                        notificationManager.notify(0, notification);
                        stopSelf();
                    }
                    @Override
                    public void onDownloading(int progress) {
                        notificationBuilder .setContentText("当前下载进度 " + progress + "%");
                        notification = notificationBuilder.build();
                        notificationManager.notify(NotificationID, notification);
                    }
                    @Override
                    public void onDownloadFailed(Exception e) {
                        notificationBuilder .setContentText("下载失败");
                        notificationBuilder.setAutoCancel(true);
                        notification = notificationBuilder.build();
                        notificationManager.cancel(NotificationID);
                        notificationManager.notify(0, notification);
                        stopSelf();
                    }
                });
                我这里用的是Okhttp3  请求的下载请求  方法有很多种  只能可以正常下载即可
public class DownloadUtil {

    private static DownloadUtil downloadUtil;
    private static OkHttpClient okHttpClient;
    public static DownloadUtil get() {
        if (downloadUtil == null) {
            downloadUtil = new DownloadUtil();
        }
        return downloadUtil;
    }
    public DownloadUtil() {
        okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(500, TimeUnit.MILLISECONDS)
                .readTimeout(500, TimeUnit.MILLISECONDS)
                .build();
    }

    public static void download( String url,  String destFileDir,  String destFileName,  OnDownloadListener listener) {
        Request request = new Request.Builder()
                .url(url)
                .build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                listener.onDownloadFailed(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                InputStream is = null;
                byte[] buf = new byte[2048];
                int len = 0;
                FileOutputStream fos = null;
                File dir = new File(destFileDir);
                if (!dir.exists()) {
                    dir.mkdirs();
                }
                File file = new File(dir, destFileName);
                try {
                    is = response.body().byteStream();
                    long total = response.body().contentLength();
                    fos = new FileOutputStream(file);
                    long sum = 0;
                    while ((len = is.read(buf)) != -1) {
                        fos.write(buf, 0, len);
                        sum += len;
                        int progress = (int) (sum * 1.0f / total * 100);
                        listener.onDownloading(progress);
                    }
                    if (null != fos){
                        fos.flush();
                        listener.onDownloadSuccess(file);
                    }
                } catch (Exception e) {
                    listener.onDownloadFailed(e);
                }finally {

                    try {
                        if (is != null) {
                            is.close();
                        }
                        if (fos != null) {
                            fos.close();
                        }
                    } catch (IOException e) {

                    }

                }


            }
        });
    }


    public interface OnDownloadListener{

        /**
         * 下载成功之后的文件
         */
        void onDownloadSuccess(File file);

        /**
         * 下载进度
         */
        void onDownloading(int progress);

        /**
         * 下载异常信息
         */

        void onDownloadFailed(Exception e);
    }
}
这里是下载方法发

4. 下载完成后可根据实际的实际需求 进行安装 另外10.0之后 安装方法也需要有所调整

  // 通过Intent安装APK文件
    public static void installApk(Context context){
        File file = new File(DownloadConstant.PATH_APK_DOWNLOAD_MANAGER+"/zhaoyu.apk");
        Intent intent = new Intent("android.intent.action.VIEW");
        //适配N
        if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.N){
            Uri contentUrl = FileProvider.getUriForFile(context,"com.zhaoyugf.zhaoyu.FileProvider",file);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.setDataAndType(contentUrl,"application/vnd.android.package-archive");
        }else{
            intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        context.startActivity(intent);
    }

最后别忘了注册service

在AndroidManifest.xml 中的 application节点下进行注册

附上完整代码

package com.zhaoyugf.zhaoyu.service;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.IBinder;

import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;

import com.zhaoyugf.zhaoyu.R;
import com.zhaoyugf.zhaoyu.base.MainActivity;
import com.zhaoyugf.zhaoyu.update.DownloadConstant;
import com.zhaoyugf.zhaoyu.update.DownloadUtil;

import java.io.File;

/**
 * Created by wangjungang
 * E-Mail:811832241@qq.com
 * on 2020/4/24
 */
public class UpdateService extends Service {
    public static String CALENDAR_ID = "channel_01";
    public static int NotificationID = 1;
    private NotificationManager notificationManager;
    private Notification notification;
    private NotificationCompat.Builder notificationBuilder;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    //通知栏跳转Intent
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        createNotification(notificationManager);
        Intent resultIntent = new Intent(getApplicationContext(), MainActivity.class);
        resultIntent.putExtra("Installapk", true);
        PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        notificationBuilder = getNotificationBuilder();
        notification = notificationBuilder.build();
        notificationManager.notify(NotificationID, notification);
        DownloadUtil.get().download(DownloadConstant.apkDown, DownloadConstant.PATH_APK_DOWNLOAD_MANAGER, "zhaoyu.apk",
                new DownloadUtil.OnDownloadListener() {
                    @Override
                    public void onDownloadSuccess(File file) {
                        notificationBuilder .setContentText("下载成功,点击安装应用");
                        notificationBuilder.setContentIntent(pendingIntent);
                        notificationBuilder.setAutoCancel(true);
                        notification = notificationBuilder.build();
                        notificationManager.cancel(NotificationID);
                        notificationManager.notify(0, notification);
                        stopSelf();
                    }
                    @Override
                    public void onDownloading(int progress) {
                        notificationBuilder .setContentText("当前下载进度 " + progress + "%");
                        notification = notificationBuilder.build();
                        notificationManager.notify(NotificationID, notification);
                    }
                    @Override
                    public void onDownloadFailed(Exception e) {
                        notificationBuilder .setContentText("下载失败");
                        notificationBuilder.setAutoCancel(true);
                        notification = notificationBuilder.build();
                        notificationManager.cancel(NotificationID);
                        notificationManager.notify(0, notification);
                        stopSelf();
                    }
                });

        return super.onStartCommand(intent, 0, 0);
    }

    public NotificationCompat.Builder getNotificationBuilder() {
        return new NotificationCompat.Builder(getApplicationContext(), CALENDAR_ID)
                .setWhen(System.currentTimeMillis())
                .setContentTitle("title")
                .setContentText("context...")
                .setSmallIcon(R.mipmap.ic_launcher_round)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.mipmap.ic_launcher_round))
                .setAutoCancel(true);
    }

    private static void createNotification(NotificationManager notificationManager) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel notificationChannel = new NotificationChannel(CALENDAR_ID, "ander drowload apk default channel.",
                    NotificationManager.IMPORTANCE_MIN);
            // 设置渠道描述
            notificationChannel.setDescription("通知更新");
            // 是否绕过请勿打扰模式
            notificationChannel.canBypassDnd();
            // 设置绕过请勿打扰模式
            notificationChannel.setBypassDnd(true);
            // 桌面Launcher的消息角标
            notificationChannel.canShowBadge();
            // 设置显示桌面Launcher的消息角标
            notificationChannel.setShowBadge(true);
            // 设置通知出现时声音,默认通知是有声音的
            notificationChannel.setSound(null, null);
            // 设置通知出现时的闪灯(如果 android 设备支持的话)
            notificationChannel.enableLights(false);

            notificationChannel.setLightColor(Color.RED);
            // 设置通知出现时的震动(如果 android 设备支持的话)
            notificationChannel.enableVibration(false);
            notificationManager.createNotificationChannel(notificationChannel);
        }
    }
}

Android下载更新(兼容7.0文件,支持5.0通知栏显示Icon) 参考文献:1.okhttp获取下载进度:https://github.com/lizhangqu/CoreProgress2.HttpURLConnection下载文件:https://github.com/feicien/android-auto-update3.5.0通知栏显示Icon:https://github.com/WVector/AppUpdate用两种方式实现了更新的效果,项目结构如 阅读详情

相关推荐

android带进度条通知,兼容android 8.0以上

如何在android的通知栏里显示进度信息?只要一个工具类就可以了。

hello____world_0109的博客 441

Android 通知栏进度更新条

Android在通知栏显示进度,实时更新进度

li_xianyuan的博客 1152

Android 实现通知栏和进度条效果(适用于Android8.0以上)

前言: 动态效果图就不展示了,因为我的安卓模拟器是Android3.几的,在模拟器上跑不了,索性就上张图片,知道是要实现什么效果就行了。 代码如下,注释都已经在代码中给出,可以直接拿起来就用。 public class MainActivity extends AppCompatActivity { //定义notification实用的ID private static final String MESSAGES_CHANNEL = "messages"; private No

路宇的博客 3188

Android通知栏实现APP下载更新(DownloadManager和自定义Notification2种方式实现)

在Android开发应用中,我们经常会遇到软件自动下载更新功能,最简单的方法先采用HttpClient去下载apk资源,在下载的过程中我们通过计算来算出下载的进度,然后我们可以使用Dialog+ProgressBar去显示下载进度。这种实现方式有很多不完美之处,首先在Dialog+ProgressBar去实现,下载的过程中我们无法进行其他的操作,得停留在这个页面,用户体验不太好,其次,在下载的过程

lgzaaron的博客 5907

Android自定义通知栏实现动态进度条更新实战

维度易用性高,直接写业务逻辑中,需定义常量和分支判断灵活性低,每个Runnable独立高,支持参数传递与复用性能稍差(频繁创建Runnable)更优(可复用Message)控制能力弱(需保存Runnable引用)强(可通过批量取消)适用场景简单定时任务、动画帧更新多状态任务、跨模块通信综上所述,对于通知进度条这类单一、固定节奏的更新任务,足够胜任;但在大型项目或多状态交互中,推荐使用Message。

weixin_36238982的博客 1413

appdown:下载页~~~

game-appdown 电竞下载页

Android实现APP自动更新功能

现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。该小程序实现的就是这个功能。 该小程序的特点是,当有更新时,会弹出一个提示框,点击确定,则在通知来创建一个进度条进行下载,点击取消,则取消更新。 以下是详细代码: 1.创建布局文件notification_item.xml,用于在通知栏生成一个进度条和下载图标。 <Rel

记录移动开发相关的知识 6375

嵌入式学习之QT学习---14 QT跨平台运行之把QT程序交叉编译到ARM开发板

想要把qt工程放到开发板上运行,就需要用到交叉编译。由于qt是跨平台的,所以只需要换个编译器编译一下就可以。 以“定时器”的例子为例,在移植之前还需要进行一个准备工作,在windows下运行的时候,电脑屏幕很大,但是运行的窗口只有一点点大,开发板也有外接屏幕,如何让运行窗口自动适配开发板的外接屏幕呢?令其占满屏幕显示,而不是一小块。 第一步:需要设置一下,先给ui布局,如果不布局,控件就不会随着屏幕的大小的变化而变化。 第二步:利用代码来获取屏幕的大小,给widget.cpp文件下添加如下代码 #inclu

qq_42822743的博客 5456

Android之动态更新通知栏(QQ续四)

我们在QQ项目中实现了通知栏后台运行,以及来新消息提示,通常在消息通知时,我们经常用到两个组件Toast和Notification。特别是重要的和需要长时间显示的信息,用Notification就最合适不过了。当有消息通知时,状态栏会显示通知的图标和文字,通过下拉状态栏,就可以看到通知信息了,Android这一创新性的UI组件赢得了用户的一致好评,就连苹果也开始模仿了。其实有点类似于Wind...

移动开发记录 358

HybridCLR热更新全流程实操:用Addressables实现资源+代码双热更(Unity 2021版)

本文详细介绍了在Unity 2021 LTS版本中,如何结合HybridCLR代码热更新与Addressables资源管理系统,实现资源与代码的双热更解决方案。通过环境配置、技术架构设计、实战案例和性能优化,帮助开发者解决中大型项目中的依赖管理和版本协同问题,提升游戏迭代效率。

cc789的博客 845

RT-Thread与ROS2通信:micro-ROS在STM32上的移植实践

本文详细介绍了在STM32平台上使用RT-Thread实时操作系统移植micro-ROS实现与ROS2通信的实践方案。通过对比rosserial方案,重点阐述了micro-ROS基于XRCE-DDS协议栈在数据可靠性(丢包率低于1%)、双模式通信(UDP/串口)以及C/C++混合编程方面的优势,为嵌入式设备与ROS2的高效通信提供了完整解决方案。

emacs5lisp的博客 326

Android 下载apk并且通知栏更新进度(通知栏兼容 Android 8.0)

public class DownloadService extends Service { // 超时 private static final int TIMEOUT = 15 * 1000; //handler状态 public static final int DOWN_SUCCESS = 1; public static final int D...

u014434239的博客 6653

《物联网技术》课程笔记——第二章 物联网技术架构

文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心

南京大学软件工程硕士在读 2503

安卓通知栏显示下载进度(兼容安卓8.0系统)

加

qq_36356379的博客 1729

YoloV8优化:感受野注意力卷积运算(RFAConv),效果秒杀CBAM和CA等 | 即插即用系列

感受野注意力卷积运算(RFAConv),解决卷积块注意力模块(CBAM)和协调注意力模块(CA)只关注空间特征,不能完全解决卷积核参数共享的问题

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4263

系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例)

系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。

qq_41854911的博客 3051

Android开发通知栏的那些事

对于通知栏的使用,Android各个版本其实都有比较大的调整。例如老版本的不兼容,大小图标问题以及自定义通知栏适配问题,这些都是比较头大的事,当然弄懂了就清楚了,本篇就处理下这些疑惑。 通知栏的使用 显示一个普通的通知栏 public static void showNotification(Context context) { Notification notification = n...

乂星人 2314

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

TIA博途中S7-1200进行MODBUS TCP通信(作为服务器)的具体方法演示

Robot_PLC_HMI_Automation 8607

android-带进度条的系统通知栏消息

效果图: 主界面只有一个按钮就不上文件了 通知栏显示所用到的布局文件content_view.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height=

Central-Perk的专栏 1万+

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤(二)

FANUC机器人_CRX协作机器人的开机和示教器的初始化设置基本步骤

Robot_PLC_HMI_Automation 2732

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android 消息通知栏用法详解(一)

通知(Notification) 是Android 系统比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息的时,而该应用程序又处于后台,就可以借助通知来实现。比如微信弹窗。通过这篇文章,我们将学习到 Notification 的基本用法 Notification 声音、优先级、多文字和大图片的显示 自定义 Notification 的布局 适配 Android8.0 一、基本用法 ...

夏至的稻穗的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android 8.0通知权限的相关处理

之前的文章曾经介绍过Android 8.0通知适配的一些方法(详见: Android通知栏微技巧,8.0系统中通知栏的适配),本文即是在该基础上解决一个开发过程中遇到的问题,不清楚的可以先行查看之前的博客内容,了解Android 8.0之后,通知栏相关的适配内容。 问题描述: 本文所涉及的内容是,在开发过程中,我们会遇到实时更新状态栏通知信息,比如下载的时候,下载进度信息我们需要在通知栏上进行实时...

仰望星空 2798

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android通知栏进度条

项目中需要用到通知栏进度条,查找了好多资料、链接如下: Android 为Notification加上一个进度条 Android实现Service后台下载Notification进度条 Notification使用详解之三:通过服务更新进度通知&在Activity中监听服务进度 android service startService bindService Android中Bi

dellheng的专栏 8618

【Android】app应用内版本更新升级(DownloadManager下载,适配Android6.0以上所有版本)

目录前言一、实现思路二、服务端接口三、UI页面三、工具类实现1.检查版本号2.下载apk3.安装apk4.实时更新下载进度5.完整代码三、外部使用总结 前言 版本的升级和更新是一个线上App所必备的功能,App的升级安装包主要通过 应用商店 或者 应用内下载 两种方式获得,大部分app这两种方式都会具备,应用商店只需要上传对应平台审核通过即可,而应用内更新一般是通过以下几种方式: 1.集成第三方库如 appupdateX、bugly 的更新功能 2.手动实现 这里自己从网上找了一些资料,使用 Kotl

full courage的博客 1万+

android 通知栏进度_Android改造下载图片进度通知

android 通知栏进度In this tutorial, we’ll be using the Retrofit library in order to download an image from a URL. We will show the progress of the download in the notification task. We’ll be using an image...

从零开始的教程世界 384

Android通知栏和服务相关知识

Android通知栏与开启前后台服务执行下载任务 索引自定义通知栏关键点后台下载,同时打开前台服务显示进度关键点 自定义通知栏 关键点 在Android8之后,发送通知需要通知渠道,具体要求见官方文档 使用自定义通知栏需要RemoteViews,并且RemoteViews内部不支持包含有约束布局的view,支持相对布局、线下布局…具体见官方文档 对于自定义通知栏的点击事件,需要PendingIntent和广播(下一篇博客展示) 这个部分是用的模拟器运行的,所以因为某些版本和机制的问题图标和style没有

qq_43337254的博客 2264
上一篇: ## Android 适配国际化多语言开发 一键生成插件
下一篇: 记录安卓开发过程中 一些控件的使用方法
我有名有姓
博客等级 码龄10年 1粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值