详解 QtAndroid::requestPermissionsSync

Qt在Android开发中的跨平台实践与优化 跨平台开发框架是现代软件开发的重要技术,其中Qt作为成熟的C++框架,通过统一的代码库支持多平台原生应用构建。其核心原理在于抽象层设计,将平台差异封装在框架内部,使开发者能专注于业务逻辑实现。在移动开发领域,Qt on Android结合了Qt的跨平台优势与Android系统特性,特别适合需要同时覆盖桌面和移动端的项目。技术价值体现在开发效率提升、代码复用率提高以及维护成本降低等方面。实际应用场景包括工业控制、嵌入式设备、图形密集型应用等。本文重点探讨环境配置、平台特性适配、性能优化等实战经验,特别是针对A 阅读详情

QtAndroid::requestPermissionsSync 是 Qt 框架中用于在 Android 平台上同步请求运行时权限的函数。这个函数在 Qt for Android 的某个更新中被引入,以更好地支持 Android 6.0(API 级别 23)及以上版本引入的动态权限管理系统。下面是对该函数的详细解释:

  1. 功能、作用及使用场景:
    • 功能:QtAndroid::requestPermissionsSync 允许开发者在应用程序运行时同步请求用户授权特定的权限。这对于需要访问用户敏感信息(如相机、麦克风、位置等)的应用程序来说是非常重要的。
    • 作用:在 Android 6.0 及以上版本中,应用程序需要在运行时请求用户的权限,而不是在安装时一次性授予所有权限。这个函数就是用来处理这种动态权限请求的。
    • 使用场景:当你的应用需要执行某些需要特定权限的操作时(如拍照、录音、访问联系人等),你应该先使用这个函数来请求用户的授权。如果用户拒绝授权,你的应用将无法执行这些操作。
  1. 引入版本及背景:
    • QtAndroid::requestPermissionsSync 是在 Qt 5.7 或更高版本中引入的。这个功能的引入是为了响应 Android 6.0(Marshmallow)及以上版本对权限管理的改变。在 Android 6.0 之前,用户在安装应用时需要一次性接受所有权限请求,这引发了对隐私和用户数据安全的担忧。从 Android 6.0 开始,系统引入了运行时权限的概念,允许用户在应用运行时按需授权权限,而不是在应用安装时。Qt 框架为了支持这一新特性,引入了 QtAndroid::requestPermissionsSync 函数。
  1. 代码示例:

由于 QtAndroid::requestPermissionsSync 是一个同步函数,它会阻塞当前线程,直到用户做出响应。下面是一个简单的使用示例:

#include <QtAndroid>  
  
// ...  
  
QStringList permissions;  
permissions << "android.permission.CAMERA";  
permissions << "android.permission.RECORD_AUDIO";  
  
QtAndroid::PermissionResult result = QtAndroid::requestPermissionsSync(permissions);  
  
if (result == QtAndroid::PermissionGranted) {  
    // 权限被授予,可以继续执行需要权限的操作  
} else {  
    // 权限被拒绝,需要处理拒绝的情况  
}

在这个示例中,我们首先创建了一个包含所需权限的字符串列表,然后使用 QtAndroid::requestPermissionsSync 函数同步请求这些权限。根据用户的响应,我们可以决定是继续执行需要权限的操作,还是处理权限被拒绝的情况。

请注意,为了保持应用程序的响应性,通常建议在异步环境中处理权限请求,以避免阻塞主线程。然而,QtAndroid::requestPermissionsSync 提供了一个简单的同步解决方案,特别适用于某些需要立即获取权限的场景。

最后,由于 Qt 和 Android 平台的不断更新,建议查阅最新的 Qt 文档以获取最准确和最新的信息。

掌握 QtAndroid::requestPermissionsSync:Qt for Android 权限请求的艺术 在开发 Qt for Android 应用程序时,处理权限请求是一个至关重要的环节。特别是当应用程序需要访问设备上的敏感数据或系统资源时,如读取联系人、访问摄像头或位置信息等,正确地请求权限变得尤为重要。QtAndroid 模块提供了一种同步方式来请求权限,即函数。本文将深入探讨这个函数的工作原理、使用方法,并通过实例讲解如何在 Qt for Android 应用程序中有效地使用它。 阅读详情

相关推荐

Qt for android 静/动态权限的申请

文章目录前言正文Qt 静态申请权限Java代码动态权限申请方式Qt 代码动态权限回调方式requestPermissionsSync方式 (不建议)requestPermissions方式(强烈推荐) 前言 权限的问题,在android 是很大的问题,没有申请权限则什么都做不了,我之前没写如何申请权限,本以为是烂大街的东西了,但是今天看到有好人问我,然后我觉得有必要记录如下。 我本人一贯是使用java代码来动态申请权限的,在android6.0后官方给出的是必须要动态申请,否则只是静态申请则无效! 今天看了

波风水门 1955

qt android动态权限申请

前端时间要用qt开发一个android程序,结果发现在真机运行的时候莫名其妙无法加载写入文件,导致项目被搁置,今天重新研究了一下,终于搞定了,特此记录一下 工程中引入模块 androidextras 接下来项目中加入如下代码 #include <QtAndroid> bool MainWindow::requestPermission() { QtAndroid::PermissionResult r = QtAndroid::checkPermission("android.

fanhenghui的专栏 1647

在PyCharm中配置使用Anaconda环境

在PyCharm中配置使用Anaconda环境一、步骤1.Anaconda2.PyCharm总结 一、步骤 1.Anaconda 如未安装Anaconda可至其官网下载,学习使用个人版就可以了。 下载地址:https://www.anaconda.com/products/individual 1、打开Anaconda Navigator,点击Environments可以看到anaconda中已经有了默认的“base”环境,其中包含了大多数我们会用到的包,在PyCharm中可以直接使用该环境,而无需自行下载

TuckX的博客 19万+

Qt for android :解决requestperssion后无法马上访问设备的问题

Qt for android requestPremission调用完毕之后马上使用设备出现无法调用权限的错误。

听我一言的博客 886

WSL2 + Open3D点云可视化踩坑全记录:从GLFW报错到VcXsrv配置,一篇讲清所有‘坑’

本文详细解析了在WSL2环境中使用Open3D进行点云可视化时遇到的常见问题,特别是GLFW报错和VcXsrv配置问题。通过系统性的解决方案和高级配置技巧,帮助开发者彻底解决图形显示、驱动加载和库版本冲突等难题,实现高效的点云可视化。

weixin_30627341的博客 101

告别C盘空间焦虑!Miniforge环境路径精准配置全攻略

本文深入解析Miniforge虚拟环境默认占用C盘空间的根本原因,即未正确配置`.condarc`文件中的`envs_dirs`路径优先级。通过详细的诊断步骤与配置命令,指导用户将环境路径精准迁移至指定磁盘(如D盘),并分享禁用自动激活、使用`--prefix`参数等高阶技巧,帮助开发者彻底告别C盘空间焦虑,实现虚拟环境的整洁与可控管理。

weixin_28831399的博客 238

Qt 6.5中的权限API

一旦知道了权限状态,或者是因为我们在更早的时候被授予或拒绝了权限,或者是在从我们刚刚发起的请求中得到结果后,我们将用户重定向到一个对话框,解释为什么此时无法录制语音备忘录(如果权限被拒绝),或者继续使用麦克风(如果权限已被授予)。库可以检查权限,以确保它们具备完成工作的先决条件,但如果权限未确定或被拒绝,则应通过库的API反映,以便应用程序依次请求必要的权限。在解释对话框和使用说明中,对应用程序提供特定功能需要特定权限的原因保持透明,这样用户就可以做出明智的决定。通常需要用户同意的功能是访问设备的麦克风。

aggs1990的专栏 1351

STM32CubeMX——循迹传感器TCRT5000的使用

前言 人生如逆旅,我亦是行人。 ————苏轼《临江仙·送钱穆父》 一、介绍 TCRT5000描述:(带有晶体管输出的反射光学传感器) TCRT5000是一种反射式光学传感器,它包括一个红外发射器和一个3.5mm引线封装的光电晶体管,可阻挡可见光。还具有1mA 典型被测输出电流,2.5mm峰值工作距离,可应用传感与仪表,工业等行业。 TCRT5000具有紧凑的结构,其中发射光源和探测器布置在同一方向,通过使用来自物体的反射红外光束来感知物体的存在。工作波长为950毫米,探测器由光电晶体管组成

W_Oilpicture的博客 1万+

Qt for Android 动态申请权限

前言 Qt 随着版本的不断更新,提供了越来越多的接口用于移动端的开发,这里要说的是关于 Android 上权限动态申请的问题,直接在 C++端调用 Qt 的接口即可以实现。 正文 Qt 申请Android 权限的类是在 QtAndroid 中,要使用该类,首先需要在工程文件中声明该模块 QT += androidextras 接下来看看动态获取权限的接口。 接口 void Q...

luoyayun361的专栏 7013

深度学习笔记(3)——kernel(内核)与filter(滤波器)

本文仅仅简单介绍了kernel和filter的概念,介绍了确定filter和kernel个数的方法。

cs111211的博客 7137

txt经纬度批量转面要素(附自定义ArcGIS工具箱方法)

当涉及大量txt坐标文件需要转换成面要素的时候,逐步操作工作量较大。本文由需求出发,以ArcGIS10.2为例,采用python脚本自定义ArcGIS工具,实现批量操作的目的。

m0_59216200的博客 1818

Qt on Android开发环境搭建与性能优化指南

跨平台开发框架Qt在移动端的应用越来越广泛,特别是在Android平台上的混合开发场景。通过JNI(Java Native Interface)机制,Qt能够与Android原生API深度交互,实现包括权限管理、传感器调用等核心功能。在性能优化方面,开发者需要关注OpenGL ES渲染效率、内存管理策略以及多线程模型设计。对于需要访问蓝牙、通知系统等平台特性的应用,Qt提供了完善的封装方案。开发环境搭建涉及Qt Creator、Android SDK/NDK等工具的配置,合理的工具链设置能显著提升开发效率。

339

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

Openclaw错误排查及解决方案之:Something went wrong while processing your request. Please try again.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 3788

Qt开发入门:跨平台GUI框架核心机制与实践

跨平台开发框架是现代软件开发的重要工具,其中Qt作为基于C++的GUI框架,通过其独特的元对象系统和信号槽机制实现了高效的跨平台能力。在底层原理上,Qt构建了抽象层处理不同操作系统的差异,开发者只需调用统一API即可实现Windows、macOS和Linux等多平台兼容。这种设计不仅提升了开发效率,还确保了应用程序在不同环境下的稳定运行。Qt框架广泛应用于嵌入式系统、工业控制软件和桌面应用程序开发,其核心模块涵盖网络通信、数据库访问和多媒体处理等功能。对于初学者而言,掌握Qt的信号槽机制和内存管理模型是开发

weixin_30407613的博客 450

AutoSAR系列讲解(入门篇)4.6-BSW的Watchdog功能

BSW的看门狗功能

雪云飞星的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

亲测有效:Android权限申请简易封装带结果回调

Android权限申请封装,带结果回调

weixin_40420578的博客 3948

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Fragment 下使用easypermision onPermissionsGranted无响应的问题

今天写二维码的功能,涉及到摄像权限的动态申请。于是用到了easypermision 但是用到的是Fragment,发现onPermissionsGranted没有响应。问过同事后发现,他们用Activity时没有问题。onPermissionsGranted正常响应。 后来问了权限,逐句Log后发现了 问题所在。 @Override public void onReques...

Qin_xian_shen的博客 1561

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Qt移动开发中各种权限的设置

开发过程中不免会遇到各种个样的权限问题,我常用的权限中这里做一个备忘 一、Android常用权限: 1、http请求权限: AndroidManifest.xml中 2、照相权限: 3、写权限: 4、定位权限: 其中照相和写权限仅仅这样声明是不可以的,还得在代码中动态申请权限 #include #include “permissions.h” QtAndroid::PermissionResult r = QtAndroid::checkPermission(“android.permis

聊点代码的事 2507

一行代码搞定Android 6.0动态权限申请

从Android 6.0(API 23)开始,对系统权限做了很大的改变。这里介绍了授权机制和一个封装库-- PermissionGrantor,可以通过一行代码搞定动态权限申请。

dfqin的专栏 3万+

android 动态权限申请

android 动态权限申请

liuqinhou的博客 5213

Qt6代码程序申请Android权限

最后请求未授予的权限即可,使用到的方法是requestPermission,用于请求用户授予指定的权限,同样这个方法也会返回一个QFuture对象,通过result方法返回权限请求的结果;最近公司需要做一个项目,其中需要解决的是如何将Qt打包到安卓的程序进行阻塞式权限申请,查阅的很多资料,包括自己写Java继承QtActivity,奈何能力原因未能调试出来。首先调用 Qt 框架里的静态方法QtNative.activity(),去获取Android应用的Activity实例,定义所需要的权限。

2501_92557944的博客 723

如何打造一个 Android 编译时注解框架

前言 预览 permissions4m-annotation permissions4m-processor AnnotationProcessor ProxyInfo AnnotationProcessor 编码 ProxyInfo 编码 permissions4m-api 前言 近期笔者开源了一个 Android 编译时注解框架库——Permissions4M,一款处理 And...

Red风信子的博客 226

qt for Android数据库连接sqlite3

研究了1一天多,白天黑天的,总算努力没有白费,实现了安卓9.0手机调取sqlite3数据库 就是图标是这个玩意的尾缀是db的东东。 正文开始前先发两个连接,都是大牛的帖子,很不错的参考,一个是直接说明怎么调取数据库的,但是说的不是很详细,所以一般很难理解,并且很难实现https://bbs.youkuaiyun.com/topics/391900605 还有一个是和数据库无关的, 只是 说明如何将文件打...

kbq的博客 3551

Qt for android 动态权限申请

从Android5.0以后开始,谷歌开始限制了android中系统的运行时权限,对于涉及到用户隐私的权限则需要开发者自己动态的去申请,并做好相应的处理 由于android 队伍的壮大,延伸出了很多方便使用的第三方库,在这里就不累述,但Qt作为一个跨平台的语言针对这点的更新还是不太及时,需要我们自己是实现,主要实现方案这里列举两种 一)Qt c++ 通过jni 调用java方法 采用android

程序员吗? 3334

Qt-android---动态申请权限

/* * 动态shen'qing申请 申请权限 */ bool Widget::requestPermission(const QString &permission) { QtAndroid::PermissionResult r = QtAndroid::checkPermission(permission); if(r == QtAndroid::Permiss...

jiaju_cao的专栏 530
上一篇: wxwidget和qt开发的区别和共同点
下一篇: QMetaObject::invokeMethod 简介
低配天才
博客等级 码龄10年 277粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值