Android 获取来电号码和去电号码

Android 手机来电 获取来电信息,接听/挂断电话 之前看了许多博客,结果发现,很多都是1几年的文章,很多方法都已经被废弃了,或者不适配高版本的android系统,于是去查了查开发者和stack overflow,emmmm,目前这个方法可行。说实话,现在手机系统的来电展示不错了,所以这种App需要足够做的花哨好用才行,但是这又涉及用户的敏感权限和应用市场的卡脖子。监听用户手机来电,弹起App内自定义的来电展示,并且展示来电电话,用户可以接通和挂断。小于Android9时,利用反射的原理来调用方法,因为Api接口不公开了,调用不了。第三个:接听和挂断电话。 阅读详情

转载请注明出处: http://blog.youkuaiyun.com/like_program/article/details/52662942

这篇博客将讲解 Android 如何获取来电号码和去电号码。

打开 Android Studio,新建 PhoneNumberTest 项目。

我们先实现 获取来电号码。

先修改下布局文件, activity_main.xml 代码如下:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.phonenumbertest.MainActivity">

    <Button
        android:id="@+id/btn_incoming_call"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="获取来电号码"/>

    <Button
        android:id="@+id/btn_incoming_call_cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="不获取来电号码"/>
</LinearLayout>

布局文件很简单,就是定义了两个按钮,分别用来 获取来电号码 和 不获取来电号码。

然后,我们在 MainActivity 中实例化这两个按钮,并为它们设置按键监听。MainActivty.java 代码如下:

package com.example.phonenumbertest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    /**
     * 获取来电号码
     */
    private Button btnIncomingCall;

    /**
     * 不获取来电号码
     */
    private Button btnIncomingCallCancel;

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

        // 实例化控件
        btnIncomingCall = (Button) findViewById(R.id.btn_incoming_call);
        btnIncomingCallCancel = (Button) findViewById(R.id.btn_incoming_call_cancel);

        // 设置按键监听
        btnIncomingCall.setOnClickListener(this);
        btnIncomingCallCancel.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_incoming_call:
                Intent startIncomingService = new Intent(this, IncomingCallService.class);
                startService(startIncomingService);
                Toast.makeText(this, "获取来电号码", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_incoming_call_cancel:
                Intent stopIncomingService = new Intent(this, IncomingCallService.class);
                stopService(stopIncomingService);
                Toast.makeText(this, "不获取来电号码", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

然后我们新建一个 IncomingCallService.java ,继承自 Service。在这个 Service 中,我们将实现获取来电号码的逻辑。IncomingCallService.java 代码如下:

package com.example.phonenumbertest;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

/**
 * 获取来电号码服务
 */
public class IncomingCallService extends Service {

    /**
     * 电话服务管理器
     */
    private TelephonyManager telephonyManager;

    /**
     * 电话状态监听器
     */
    private MyPhoneStateListener myPhoneStateListener;

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

    @Override
    public void onCreate() {
        super.onCreate();
        // 获取来电号码
        getIncomingCall();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 不获取来电号码
        getIncomingCallCancel();
    }

    /**
     * 获取来电号码
     */
    private void getIncomingCall() {
        // 获取电话系统服务
        telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        myPhoneStateListener = new MyPhoneStateListener();
        telephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    /**
     * 不获取来电号码
     */
    private void getIncomingCallCancel() {
        telephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE);
    }

    /**
     * 电话状态监听器
     */
    class MyPhoneStateListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
                // 如果电话铃响
                case TelephonyManager.CALL_STATE_RINGING:
                    Toast.makeText(IncomingCallService.this, "来电号码是:" + incomingNumber, Toast
                            .LENGTH_LONG).show();
            }
        }
    }
}

我们可以看到,实现获取来电号码的逻辑并不复杂,在 onCreate() 方法中,我们调用了 getIncomingCall() 来获取来电号码,我们再到 getIncomingCall() 方法里看看,在 getIncomingCall() 中,我们先获取了电话系统服务(TelephonyManager),然后给电话系统服务(TelephonyManager)设置了一个监听器,这里我们设置的监听器是我们自定义的监听器,继承自 PhoneStateListener ,并且我们重写了 onCallStateChanged() 这个方法,当电话状态发生变化的时候就会回调这个方法。

注意:onCallStateChanged() 方法里有一个参数:incomingNumber 这个参数就是 来电号码,知道了这个,就好办了。

在 onCallStateChanged() 方法里,我们对当前的电话状态进行判断,如果当前的电话状态是 电话铃响 ,就弹出 Toast 提示,并把 来电号码(incomingNumber)显示出来。

还要注意一点,获取来电号码需要 READ_PHONE_STATE 权限:

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

以上就是获取来电号码的逻辑,我们再看下 不获取来电号码 的逻辑。在 onDestroy() 方法中,我们调用了 getIncomingCallCancel() 来 不获取来电号码,这个方法里只有一句代码,telephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE) ,这句代码的作用是 取消注册监听器,也就是把我们刚刚设置的电话状态监听器取消掉。这样,自然就获取不到来电号码了。

运行一下程序:

获取来电号码

不获取来电号码

实现了获取来电号码后,我们再来实现获取去电号码。

先修改布局文件,activity_main.xml 代码如下:

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

    ......

    <Button
        android:id="@+id/btn_outgoing_call"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="获取去电号码"/>

    <Button
        android:id="@+id/btn_outgoing_call_cancel"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="不获取去电号码"/>
</LinearLayout>

在布局里,我们新增了两个按钮,分别是 获取去电号码 和 不获取去电号码 。

然后,我们在 MainActivity 中实例化新增的两个按钮,并为它们设置按键监听。MainActivty.java 代码如下:

package com.example.phonenumbertest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    ......

    /**
     * 获取去电号码
     */
    private Button btnOutgoingcall;

    /**
     * 不获取去电号码
     */
    private Button btnOutgoingCallCancel;

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

        // 实例化控件
        ......
        btnOutgoingcall = (Button) findViewById(R.id.btn_outgoing_call);
        btnOutgoingCallCancel = (Button) findViewById(R.id.btn_outgoing_call_cancel);

        // 设置按键监听
        ......
        btnOutgoingcall.setOnClickListener(this);
        btnOutgoingCallCancel.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_incoming_call:
                ......
                break;
            case R.id.btn_incoming_call_cancel:
                ......
                break;
            case R.id.btn_outgoing_call:
                Intent startOutgoingService = new Intent(this, OutgoingCallService.class);
                startService(startOutgoingService);
                Toast.makeText(this, "获取去电号码", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_outgoing_call_cancel:
                Intent stopOutgoingService = new Intent(this, OutgoingCallService.class);
                stopService(stopOutgoingService);
                Toast.makeText(this, "不获取去电号码", Toast.LENGTH_SHORT).show();
                break;
        }
    }
}

然后我们新建一个 OutgoingCallService.java ,继承自 Service。在这个 Service 中,我们将实现获取去电号码的逻辑。OutgoingCallService.java 代码如下:

package com.example.phonenumbertest;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.widget.Toast;

/**
 * 获取去电号码服务
 */
public class OutgoingCallService extends Service {

    /**
     * 去电 Action
     */
    private static final String OUTGOING_ACTION = "android.intent.action.NEW_OUTGOING_CALL";

    /**
     * 去电广播接收器
     */
    private MyPhoneStateReceiver myPhoneStateReceiver;

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

    @Override
    public void onCreate() {
        super.onCreate();
        // 获取去电号码
        getOutgoingCall();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        // 不获取去电号码
        getOutgoingCallCancel();
    }

    /**
     * 获取去电号码
     */
    private void getOutgoingCall() {
        IntentFilter intentFilter = new IntentFilter();
        // 监听去电广播
        intentFilter.addAction(OUTGOING_ACTION);
        myPhoneStateReceiver = new MyPhoneStateReceiver();
        // 动态注册去电广播接收器
        registerReceiver(myPhoneStateReceiver, intentFilter);
    }

    /**
     * 不获取去电号码
     */
    private void getOutgoingCallCancel() {
        // 取消注册去电广播接收器
        unregisterReceiver(myPhoneStateReceiver);
    }

    /**
     * 监听去电广播
     */
    class MyPhoneStateReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // 获取去电号码
            String outgoingNumber = getResultData();
            Toast.makeText(context, "去电号码是:" + outgoingNumber, Toast.LENGTH_LONG).show();
        }
    }
}

在 onCreate() 方法中,我们调用 getOutgoingCall() 来获取去电号码,我们再到 getOutgoingCall() 方法里看看,在这个方法里,我们动态注册了 去电广播接收器 ,我们注册的广播接收器 MyPhoneStateReceiver 是我们自定义的广播接收器,在 MyPhoneStateReceiver 的 onReceive() 方法中,调用了 getResultData() 方法,这个方法返回的就是 去电号码。在 intentFilter 中,添加了一个值为 android.intent.action.NEW_OUTGOING_CALL 的 Action,表示我们的 去电广播接收器 想要接收去电广播。

获取来电号码需要权限,获取去电号码也需要权限:

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

这样,获取去电号码的逻辑就完成了。我们再看下 不获取去电号码。在 onDestroy() 方法中,调用了 getOutgoingCallCancel() 来 不获取去电号码,再到 getOutgoingCallCancel() 方法里看看,只有一句代码,unregisterReceiver(myPhoneStateReceiver),这句代码的作用是 取消注册去电广播接收器,取消注册了之后,自然也就获取不到去电号码了

再运行一下程序:

获取去电号码

不获取去电号码

源码下载

Android实现获取来电号码和去电号码 在onReceive()方法中,我们使用TelephonyManager.EXTRA_INCOMING_NUMBER常量获取来电号码,并通过Toast显示在屏幕上。在Android开发中,我们经常需要获取来电号码和去电号码,以便进行相应的处理。本文将介绍如何在Android应用程序中获取来电号码和去电号码,并提供相应的源代码。通过以上代码,我们可以轻松地在Android应用程序中获取来电号码和去电号码。请确保在使用这些代码时,遵守相关的隐私规定,并在获取电话号码时进行适当的处理和保护。 阅读详情

相关推荐

Android之电话状态的监听(来电和去电)

实现手机电话状态的监听,主要依靠两个类:TelephoneManger和PhoneStateListener。 TelephonseManger提供了取得手机基本服务的信息的一种方式。因此应用程序可以使用TelephonyManager来探测手机基本服务的情况。应用程序可以注册listener来监听电话状态的改变。我们不能对TelephonyManager进行实例化,只能通过获取服务的形式:

码莎拉蒂 5572

Android 获取手机号码

Android 获取手机号码

qq_27494201的博客 1722

来电获取来电号码

获取来电号码,未接来电,和黑名单,实现广播在后台运行的服务

Android 使用前台服务 获取通话状态和来电号码

产品提出一个需求:在来电或通话时获取来电号码(因为内部使用的是虚拟号,需要调接口查询对方的身份)并展示相关信息 先上个效果图 解决方案:在前台服务中注册通话状态的监听,在响铃和通话时可以获取到手机号码,做完相关的逻辑处理后,在前台服务中使用对话框显示 声明权限 监听手机的状态肯定是危险权限的 ,需要我们配置清单中声明后再运行中申请 <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /><!-

WXYDX的博客 3603

android 读取电话号码

都读取手机电话号码,实现拨打电话功能。

Android获取本机电话号码的简单方法

如何在Android上获取本机电话号码,目前Android上提供了一个API可以读取早期SIM卡上固化的号码, 代码如下:private String getPhoneNumber(){       TelephonyManager mTelephonyMgr;       mTelephonyMgr = (TelephonyManager)  getSystemService(Context.TELEPHONY_SERVICE);        return mTelephonyMgr.getLine1Number();   }    上面的getPhoneNumber方法返回当前手机的电话

android获取去电的号码,android – 获取当前来电和去电的电话号码

根据Krutix的建议,呼叫LOG是完成电话呼叫的日志,在呼叫结束后由拨号器应用程序写入.因此,您将无法找到当前在内容提供商中拨打的号码.这是一个实现,它允许您检索电话号码,如果它是来电号码,也是呼叫完成时 – 请注意Handler()代码.private class PhoneCallListener extends PhoneStateListener {private boolean isP...

weixin_29137997的博客 570

Android实现获取联系人电话号码功能

本篇文档主要记录一下获取联系人的电话号码的一种方式。 1、选择联系人 ............ //构造一个隐式的Intent,拉起联系人界面 final Intent pickIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); mSuspectButton = (Button)v.findViewById(R.id.crime_suspect); mSuspectButton.setOnClickListener(new View.OnClickListener() { @Ov

在Android中监控来电和去电

作者:温尚书,华清远见嵌入式培训中心讲师。 在Android中,有的时候我们需要监控拨出电话和拨入电话,在Android中,可以使用其提供的API来实现这2个功能。 如果要实现监控来电电话,可以通过Android中提供的TelephonyManager这个类,这是一个系统服务,其中提供了对手机状态、手机通话状态以及运营商信息等的访问方法。我们这里主要来看如何通过它来获得拨入电话号码。 获得来

farsightliuht的专栏 702

基于用户的协同过滤算法(userCF)

1.定义 userCF:当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。 基于用户的协同过滤算法主要包括两个步骤: 2.第一步:找到和目标用户兴趣相似的用户集合。 利用行为的相似度计算兴趣的相似度。给定用户u和用户v,令N(u)表示用户u曾经有过正反馈的物品集合,令N(v)为用户v曾经有过...

jiangdongxiaobawang的博客 1万+

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5767

Android实现来电和去电的监听(附带源码)

Android实现来电和去电的监听(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1223

密码学系列3-Elgamal加密及其IND-CPA安全性证明

但这没有任何影响,敌手本身就只能知道公钥,他并没有能力知道挑战者是否知道对应的私钥。所以上述整个游戏就是一个模拟实验,敌手无法区分挑战者运行的是这个模拟实验,还是真正的按照第一节的算法构造的实验(挑战者知道私钥…为什么合起来的时候有1/2:因为T既可能是随机的也可能是g^{ab},这两种情况概率为1/2。能够攻破Elgamal加密方案,那么挑战者利用敌手的能力构建下面游戏,来求解困难性问题DDH。就是挑战者选的随机数,虽然挑战者自己也不知道。),否则挑战者输出0,作为DDH的回答。

qq_41359358的博客 1249

android做到监听来电,和监听去电

1 监听来电不用注册广播接收者,只需自定义一个监听类继承PhoneStateListener 代码如下 首先要添加权限           private TelephonyManager tm;     private MyListener listener;               tm = (TelephonyManager) getSystemServ

syb666eee的博客 632

js逆向-逆向部分技巧总结

js逆向-逆向部分技巧总结

Deng872347348的博客 2130

Windows Docker Desktop部署MaxKB详细教程

MaxKB(Max Knowledge Base)是一款基于大语言模型(LLM)和检索增强生成(RAG)技术的开源知识库问答系统,旨在帮助企业、教育机构及研究组织高效管理知识并提供智能问答服务。

猿小白的博客 1371

Android 监听来电广播

一、添加监听电话状态所需权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 二、接受电话状态的广播 public class PhoneStateReceiver extends BroadcastReceiver { pr

小钟的博客 4159

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

以河东地区为例,介绍CMIP6数据下载及处理

WW、forever的博客 4930

Android来电、去电监听

Android手机中添加手机来电的状态,使用PhoneStateListener来监听。 TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(TELEPHONY_SERVICE); // 开始监听 PhoneStateListener phoneListener = new MyPho...

weixin_30594001的博客 202

EMB电子机械制动执行器五大核心部件选型解析

本文介绍了EMB电子机械制动执行器五大核心部件的选型方案:采用无刷直流电机作为驱动源,兼具高扭矩和快速响应特性;选用滚珠丝杠传动机构,实现高效旋转-直线转换;行星齿轮减速器满足紧凑空间内的增扭需求;QT450-QT550材质的钳体确保刚度要求;应变片式压力传感器实现夹紧力精确测量。各部件选型综合考虑了性能、可靠性和空间限制,为EMB系统设计提供了完整解决方案。

m0_59012156的博客 1731

【PowerBI专栏】PowerBI导入MYSQL数据库

本文介绍了在PowerBI中连接MySQL数据库的方法。首先需要下载并安装MySQL官方.NET连接驱动(推荐8.4.0版本),安装完成后重启PowerBI。连接时需填写服务器IP和数据库名称等必填参数。文章详细说明了连接配置步骤,包括账户设置、数据表选择以及可能遇到的数据格式转换问题处理。最后指导用户完成数据清洗后进入PowerPivot进行后续计算。特别提醒最新9.4版本可能存在兼容性问题,建议使用稳定的8.4版本连接器。

技术与管理的平衡木- 689

android 9.0监听来电,android9.0来电无法获取处理

https://developer.android.com/about/versions/pie/android-9.0-changes-all?hl=zh-cn这个连接说了。android 必须添加新权限,官网说:限制访问电话号码在未首先获得 READ_CALL_LOG 权限的情况下,除了应用的用例需要的其他权限之外,运行于 Android 9 上的应用无法读取电话号码或手机状态。与来电和去电关...

weixin_42395498的博客 909

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

仿手机卫士打电话弹出归属地

所要实现的功能如下图 no tu no bb 实现此功能需要解决一下问题 1,来电号码所在地址怎么解决?答:从数据库里面获取,数据库从哪来?从百度,google。soga! 2,怎么知道什么时候来电or去电?答:监听系统广播 3,怎么知道来电or去电人的姓名和号码归属地答:通过内容提供者来获取! 4,弹出的窗口怎么来做?答:用popupwindow ? 否 我们经常...

dgyibo2014的博客 497

OV9734 DATASHEET,完整规格书

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android:[9]电话状态的监听

有时候我们需要监听手机是来电 去电  这里上传一片断代码, 可以监听到是来电还是去电、来电已接听 和来电已挂断等状态,并且可以获得来电的电话号码。 首先要在AndroidManifest.xml注册广播接收器:          然后添加权限     demo代码见http://jingyan.baidu.com/

1367

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 手机录音功能实现

package org.homeway.phonerecorder; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.Med...

天何言哉 742
上一篇: Android ExpandableListView 中完美嵌套 GridView
下一篇: Android ListView 实现分批加载
like_program
博客等级 码龄10年 88粉丝 18原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值