Android四大组件之ContentResolver

【Android】ContentResolver的使用 无论是访问内置的提供者(如联系人、媒体库等),还是与第三方应用共享的数据进行交互,掌握 ContentResolver 的使用都是至关重要的。在 Android 中,ContentResolver 是一个非常重要的类,它提供了与 ContentProvider 进行交互的方法。ContentProvider 是用于在不同应用程序之间共享数据的标准接口,而 ContentResolver 则是从客户端(如 Activity 或 Service)访问这些数据的途径。putInt的调用,是对。 阅读详情

      在Android平台上,应用程序之间是相对独立的,分别运行在自己的进程中,如果应用程序之间相互共享数据是需要借助ContentResolver类。ContentResolver用于保存和检索数据,应用程序之间可以提供数据的访问操作,ContentResolver是实现程序数据共享的重要途径。

      ContentResolver(内容提供器)主要有两个用法:一.使用现有的内容提供器来读取和操作相应程序中的数据,二.创建自己内容提供器的对外接口(就是通过这个接口来实现外部应用程序共享数据的)。

      在使用ContentResolver之前,需要脑补一下运行时权限,什么是运行时权限,简单的说就是自我保护(应用程序保护用户的隐私信息);记得QQ空间有个设置,并非好友不可访问QQ空间对吧!这是权限,比如,你注册APP成为用户的时候,它是不是有提醒说:你是需要注册一个APP账号还是用手机号码快速注册,如果你是用手机号码注册的,它会给你发一条验证码短信,那请问你希望它给你短信吗?这个权限要开放吗?好,注册好之后,是不是需要完备自己的资料,头像设置一个吧!图片是不是从图库里来选呀!那问题来了,图库这个应用希望别的应用软件来访问它且共享它的资源吗(一般这个权限都是开放的)?在Android6.0之后,权限有了新的变化;当你注册好进入软件应用里面,它会提示你本应用需要访问你的电话薄,拒绝还是同意?本应用需要访问你的媒体库,拒绝还是同意?脑补到这吧!

      使用ContentResolver不复杂,因为,前面学过SQL语句、学过SQLite数据库,ContentResolver和他们的用法一样,ContentResolver同样也提供了对数据的增删改查操作,只是参数不同而已。参数用Uri来代替,称为内容URI,内容URI给内容提供器中的数据建立了唯一标识符,主要由三部分组成:content://包名/表名(数据路径),提示:URI字符串开头必须加上协议声明content://。URI不能直接使用,需要将它解析成Uri对象才可以作为参数传入,调用Uri.parse()方法即可。例:Uri uri= Uri.parse("content://包名/表名(数据路径)")。

     使用ContentResolver要通过Context中的getContentResolver方法获得该类的实例。常用方法如下:

查询:query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder),

uri:指定查询某个应用程序下的某一张表,

projection:指定查询的列名,

selection:指定where的约束条件,

selectionArgs:为where中的占位符提供具体的值,

sortOrder:指定查询结果的排序方式。

插入:insert(Uri uri,ContentValues values)

更新:update(Uri uri,ContentValues values,String selection,String[] selectionArgs)

删除:delete(Uri uri,String selection,String[] selectionArgs)

getType(Uri uri):获取MIME数据类型,  onCreate():创建ContentResolver时调用

ContentResolver用法一:查询系统ContentResolver(查询手机联系人例子)

package com.xhm.demo.myandroidsql;
import android.Manifest;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;

public class ContentResolverActivity extends AppCompatActivity {

    ArrayAdapter<String> adapter;
    List<String> contactsList=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_content_resolver);
        ListView contactsView=(ListView) findViewById(R.id.contacts_view);
        adapter=new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,contactsList);
        contactsView.setAdapter(adapter);
        if (ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_CONTACTS)!=
                PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{
                    Manifest.permission.READ_CONTACTS},1);
        }else {
            readContacts();
        }
    }
    private void readContacts(){
        Cursor cursor=null;
        try {
            //查询联系人的数据
            cursor=getContentResolver().query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null,null,null,null);
            if (cursor!=null){
                while (cursor.moveToNext()){
                    //获取联系人姓名
                    String displayName=cursor.getString(cursor.getColumnIndex
                            (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    //获取联系人手机号码
                    String number=cursor.getString(cursor.getColumnIndex
                            (ContactsContract.CommonDataKinds.Phone.NUMBER));
                    //添加数据
                    contactsList.add(displayName+"\n"+number);
                }
                adapter.notifyDataSetChanged();
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (cursor!=null){
                cursor.close();//关闭数据连接
            }
        }
    }
    @Override
    public void onRequestPermissionsResult(
            int requestCode,String[] permissions,int[] grantResults) {
        switch (requestCode){
            case 1:
                if (grantResults.length>0&&grantResults[0]==
                        PackageManager.PERMISSION_GRANTED){
                    readContacts();
                }else {
                    Toast.makeText(ContentResolverActivity.this,
                            "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }
}

布局:

<?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">

    <ListView
        android:id="@+id/contacts_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </ListView>

</LinearLayout>

记得申请权限:

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

效果图

ContentResolver用法二:创建一个ContentResolver

这里还需要再深入的了解URL:

内容URL的格式主要有两种,1.以路径结尾的表示访问该表中的所有路径,2.以ID结尾的表示访问表中拥有相应ID的数据。

  1. URI代表要操作的数据,由scheme、authorites、path三部分组成  
  2.             eg:  
  3.                 content://com.jxn.provider/person 
  4.                 scheme   |   authorites   | path  
  5.   
  6.         1,schema:表明要访问ContentProvider。固定为:"content://"  
  7.         2,Authority(主机名或授权):定义了是哪个ContentProvider提供这些数据(一般都用当前包名)。  
  8.         3,path:路径,可根据业务逻辑自定义。eg: person、person/insert、person/insert/10等等  
  9.         4,ID:通常定义URI时使用"#"号占位符代替, 使用时替换成对应的数字  
  10.             "content://com.jxn.provider/ table/# 匹配表中任意一行数据内容的URI格式(#代表任意长度的数字)  
  11.             "content://com.jxn.provider/* 匹配任意表的内容RUI格式(*表示匹配任意长度的任意字符  )

Android系统提供了两个用于操作Uri的工具类:UriMatcher 和 ContentUris   

  1. 1,UriMatcher类用于匹配Uri,用法如下:  
  2.               
  3.             第一步:把你需要匹配的Uri路径全部给注册上,如下:  
  4.               
  5.                 //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码  
  6.                 UriMatcher  matcher = new UriMatcher(UriMatcher.NO_MATCH);  
  7.                 //如果match()方法匹配content://com.jxn.provider.personprovider/person路径,返回匹配码为1  
  8.                 matcher.addURI("com.jxn.provider.personprovider", "person", 1);//添加需要匹配uri,如果匹配就会返回匹配码  
  9.                 //如果match()方法匹配content://com.jxn.provider.personprovider/person/230路径,返回匹配码为2  
  10.                 matcher.addURI("com.jxn.provider.personprovider", "person/#", 2);//#号为通配符  
  11.               
  12.             第二步:使用matcher.match(uri)方法对输入的Uri进行匹配,如果匹配成功就返回匹配码  
  13.                 switch (matcher.match(Uri.parse("content://com.jxn.provider.personprovider/person/10"))) {   
  14.                     case 1  
  15.                         // 相应的业务操作  
  16.                         break;  
  17.                     case 2  
  18.                         // 相应的业务操作  
  19.                         break;  
  20.                     default:  
  21.                         // 相应的业务操作  
  22.                         break;  
  23.                 }  
  24.           
  25.         2,ContentUris类用于为路径加上ID和获取路径的ID  
    1.                 给Uri加上id:   ContentUris.withAppendedId(uri, id)   
    2.                 获取id:       ContentUris.parseId(uri)  

注意getType()方法,它是所有的内容提供器都必须提供的一个方法,用于获取Uri对应的MIME数据类型,一个内容RUI所对应的MIME字符串主要由三部分组成:1.必须以vnb开头,2.如果内容RUI以路径结尾,则后接android.cursor.dir/,如果内容RUI以ID结尾,则后接android.cursor.item/,3.后部接上vnb.<authority>.<path>。

 

package com.xhm.demo.myandroidsql;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.net.Uri;
import android.support.annotation.Nullable;
/**
 * Created by Dell on 2017/3/31.
 * 一个完整的ContentProvider
 */
public class MyContentResolver extends ContentProvider {
    public static final int TABLE1_DIR=0;
    public static final int TABLE1_ITEM=1;
    public static final int TABLE2_DIR=2;
    public static final int TABLE2_ITEM=3;
    private static UriMatcher uriMatcher;
    static {
        uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI("com.example.app.provider","table1",TABLE1_DIR);
        uriMatcher.addURI("com.example.app.provider","table1/#",TABLE1_ITEM);
        uriMatcher.addURI("com.example.app.provider","table2",TABLE2_DIR);
        uriMatcher.addURI("com.example.app.provider","table2/#",TABLE2_ITEM);
    }
    @Override
    public boolean onCreate() {
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        switch (uriMatcher.match(uri)){
            case TABLE1_DIR:
                //查询table1表中的所有数据
                break;
            case TABLE1_ITEM:
                //查询table1表中的单条数据
                break;
            case TABLE2_DIR:
                //查询table2表中的所有数据
                break;
            case TABLE2_ITEM:
                //查询table2表中的单条数据
                break;
            default:
                break;
        }
        return null;
    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){
            case TABLE1_DIR:
                return "vnd.android.cursor.dir/vnb.com.example.app.provider.table1";
            case TABLE1_ITEM:
                return "vnd.android.cursor.item/vnb.com.example.app.provider.table1";
            case TABLE2_DIR:
                return "vnd.android.cursor.dir/vnb.com.example.app.provider.table2";
            case TABLE2_ITEM:
                return "vnd.android.cursor.item/vnb.com.example.app.provider.table2";
            default:
                break;
        }
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        return 0;
    }
}

 

 

 

 

 

 

 

Android ContentResolver的使用 本文介绍了ContentResolver的使用方法,包括查询数据、插入数据、更新数据和删除数据。通过ContentResolver,我们可以方便地与ContentProvider进行数据交互,实现数据的读取和修改。它提供了一组方法,用于查询、插入、更新和删除ContentProvider中的数据。本文将详细介绍ContentResolver的使用方法,并提供相应的源代码示例。首先,需要构建一个Uri对象,指定要查询的数据的位置和条件。除了使用Uri查询数据外,还可以使用SQL语句来查询数据。 阅读详情

相关推荐

Android中ContentProvider和ContentResolver详解

主要介绍了Android中ContentProvider和ContentResolver详解的相关资料,需要的朋友可以参考下

Android基础——ContentProvider和contentResolver

ContentProviderContentProvider是什么?权限运行时权限 ContentProvider是什么? 利用ContentProvider可实现在不同应用程序之间的数据共享,并保证被访问数据的安全性。 权限 普通权限:不会直接威胁到用户安全和隐私的权限,这部分权限会自动授权,不再需要手动操作 危险权限:可能会触及用户隐私或对设备安全性造成影响的权限,必须要由用户手动授权,否则无法使用。危险权限需要进行运行时权限处理 运行时权限 ...

松仔Log的博客 1万+

PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南

在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人

weixin_29741447的博客 408

android contentResolver的使用

今天,简单讲讲android 如何使用contentResolver。 这个contentResolver其实是属于ContentProvider 的内容,我之前一直没有用到android的ContentProvider ,所以昨天看到contentResolver时,居然不知道contentResolver怎么使用,后来,在网上查找了资料,最终解决了问题。这里记录一下。 在A

谢岩的博客 2万+

Modelsim10.5_se安装(Win11)

modelsim是Mentor公司开发的优秀的HDL语言仿真软件。它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速度快且编译的代码与平台无关。

m0_51186267的博客 9908

详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2201_75437633的博客 1万+

Android四大组件之一ContentProvider与ContentResolver

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过 ContentProvider对指定应用中的数据进行操作

mdf_jy的博客 985

SikuliX实战:5分钟搞定游戏挂机脚本(附防检测思路与Python集成技巧)

本文详细介绍了如何使用SikuliX快速开发游戏挂机脚本,包括环境配置、基础原理、防检测策略及Python集成技巧。通过实战案例展示如何实现自动化任务、高级防检测方案,并结合Python提升脚本性能与智能度,帮助玩家高效完成重复性游戏操作。

weixin_33228769的博客 334

Android四大组件——ContentResolver

ContentResolver完整代码请见:longlong’s github内容URI的标准格式:  content://com.example.app.provider.table1   content://com.example.app.provider.table2   内容URI主要由两部分组成:权限(authority)和路径(path),权限一般采用程序包名的方式进行命名,路径:区

longlong's blog 752

昆仑通态,自由串口通讯

软件默认无该功能,需要问客服索要扩展包。

cfqq1989的博客 1536

从MFCC到GMM:手把手教你用Python实现说话人识别(附完整代码)

本文详细介绍了如何使用Python实现说话人识别系统,从MFCC特征提取到GMM模型训练,涵盖完整的技术流程和代码示例。通过梅尔频率倒谱系数(MFCC)和高斯混合模型(GMM)的结合,构建高效的说话人识别系统,适用于身份认证和智能交互场景。文章还探讨了从传统方法到深度学习的进阶话题,如i-vector和x-vector技术。

o1p2q3r的博客 200

android四大组件之ContentResolver读取手机音乐文件

//就像查询数据库 Cursor cursor = query(RI uri,String[]projection,String selection ,String[]selectionArgs,String sortOrder) uri: 指定要查询数据库的名称表名 proection: 要查询数据库的字段名集合,null为返回所有字段信息 selection:...

懒虫翻身的博客 2079

metahuman 下载材质 脸部灰白 脸部过亮

metahuman 下载材质 脸部灰白 脸部过亮

jacke121的专栏 243

Android 四大组件——ContentProvider(内容提供者)

摘要:ContentProvider是Android四大组件之一,用于实现应用间数据共享。文章详细介绍了ContentProvider的架构与工作原理,包括核心组件ContentResolver、Uri、Cursor等。重点讲解了创建ContentProvider的步骤:定义子类、实现数据库帮助类、实现CRUD方法以及在清单文件中注册。同时介绍了如何使用ContentResolver访问其他应用的数据,如读取短信和联系人等系统数据,以及通过ContentObserver监听数据变化。文章提供了完整的代码示例

indeedes的博客 900

RT-DETR改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新260多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-4。项目介绍在大家购买专栏后,加入学习

Limiiiing的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 读取手机mp3,Android四大组件之ContentResolver读取手机音乐文件

该楼层疑似违规已被系统折叠隐藏此楼查看此楼//就像查询数据库Cursor cursor = query(RI uri,String[]projection,String selection,String[]selectionArgs,String sortOrder)uri: 指定要查询数据库的名称表名proection: 要查询数据库的字段名集合,null为返回所有字段信息selection:...

weixin_36337548的博客 753

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android四大组件之ContentProvider 全面解析,ContentResolver源码解析如何调用其它APP的ContentProvider

今天来总结下Android中的ContentProvider(以下简称CP),具体代码请见https://github.com/Mangosir/ContentProviderReview/tree/master 概述 其实相对于Acivity,Service,BroadcastReciver这三个组件,CP的使用率还是相对比较少的,除非你开发的app是要采用手机本地资源或跟其它a...

Mango先生的博客 1760

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android四大组件之ContentProvider:诞生缘由,ContentProvider内容提供者,ContentResolver内容解析器

简介 诞生缘由 功能需求: 一个应用需要访问另一个应用的数据库表数据 实际情况: 一个应用的数据库文件是应用私有的, 其它应用不能直接访问 比如最直观的的手机联系人和短信两个应用: 很多时候我们发短信,接收者不是我们自己输入的,而是从联系人里面进行读取的 但是这样就出现问题了,联系人里面的数据是私有的,其他的应用是无法读取的 但是这样的功能又是经常性的需求,所以Android就在联系人这个应用里面 增加一个ContentProvider组件,这个组件暴露接口提供其他的应用访问 然后其他的应用就使用

入梦镜 348

Android之四大组件、六大布局、五大存储

 一.四大组件:          Android四大组件分别为activity、service、content provider、broadcast receiver。 一、android四大组件详解 1、activity (1)一个Activity通常就是一个单独的屏幕(窗口)。 (2)Activity之间通过Intent进行通信。 (3)android应用中每一个Activit...

u010112268的博客 264

安卓四大组件——ContentProvider

安卓四大组件——ContentProvider通常每个应用都是独立的进程,应用创建出的数据文件只能被自身访问,其他应用无权访问。当我们需要将自身数据公布出来,让其他应用访问时,就需要使用ContentProvider组件。当我们需要访问ContentProvider共享的数据时,需要使用ContentResolver对象。也就是说ContentProvider是与ContentResolver配合使

深海大菠萝 1993

Android的四大组件、六大布局、五大存储

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp

weixin_41897234的博客 456

ContentProvider、ContentResolver、ContentObserver之间的关系

ContentProvider: 四大组件的内容提供者,主要用于对外提供数据 实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等 一个应用实现ContentProvider来提供内容给别的应用来操作,通过Cont...

倚栏静望的博客 3688

Android ContentProvider全面解析

ContentProvider 是 Android 四大组件之一(其余为 Activity、Service、BroadcastReceiver),本质是一套标准化的跨进程数据访问接口。它封装了底层数据存储的逻辑(比如 SQLite 操作、文件读写),对外提供统一的增删改查(CRUD)接口,屏蔽了数据存储的细节 —— 无论底层是 SQLite、文件还是网络数据,调用者都能用相同的方式访问。假设开发 “图书管理” 应用,对外提供图书数据的增删改查接口:步骤 1:封装 SQLite 数据库。

. 1062

Android——四大组件ContentProvider

文章目录AndroidAndroid四大组件——ContentProvider1 简介2 ContentProvider配置2.1 ContentResolver类2.2 ContentProvider类3 Uri的使用4 数据读取 Android 安卓开发者指南:https://developer.android.google.cn/guide Android常用四大组件: 1.Activity 2.Service 3.Content provider 4.Broadcast receiver Andro

weixin_45044097的博客 331

Android 四大组件之一 ContentProvider

学习自:http://blog.youkuaiyun.com/worker90/article/details/7016430 ContentProvider概述: Android四大组件之一,用于对应用程序中的数据的共享和操作,我们通过ContentProvider可以 对Android中的音频,视频,图片,联系人等 进行增删改查操作。 个人对ContentProvider的

Lu. saning 763

安卓 ContentProvider内容提供者

安卓 专高 day10 ContentProvider内容提供者ContentProvider 的使用介绍和使用 ContentProvider 的使用 介绍和使用 内容提供者,就是给其他的应用程序,提供一个访问我们sqlite的文件的机会 导入注解的包 implementation ‘androidx.annotation:annotation:+’ 1.ContentProvider内容提供...

zxsenqiu的博客 261
上一篇: Android数据存储之SQLite数据库存储
下一篇: Android网络技术之WebView
小红妹
博客等级 码龄10年 151粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值