Android之MediaStore

本文详细介绍如何利用Android系统中的MediaStore访问手机上的音频、图片和视频信息,包括获取音频元数据、图片元数据及视频缩略图的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在日常开发中,我们经常会使用MediaStore来获取手机的音频、图片、视频等相关信息。下面3个是常见的内部类:

MediaStore.Audio获取音频信息的类

MediaStore.Images获取图片信息

MediaStore.Video获取视频信息

1、MediaStore.Audio

在这个类中我们可以获取音频的专辑、艺术家、流派等等,通过 MediaStore.Audio.AlbumColumns 可以查阅专辑表的字段信息,我们也可以通过Uri来查询手机上的

专辑表的字段信息。主要是用 MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI 的Uri来查询。其中EXTERNAL_CONTENT_URI 为查询外置内存卡的,内置内存卡

为 INTERNAL_CONTENT_URI

[java]  view plain  copy
  1. private Uri albumUri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;  

[java]  view plain  copy
  1. // 配置<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>权限  
  2.     private void getUriColumns(Uri uri){  
  3.         Cursor cursor = getContentResolver().query(uri, nullnullnullnull);  
  4.         cursor.moveToFirst();   
  5.         String[] columns = cursor.getColumnNames();  
  6.         for (String string : columns) {  
  7.             System.out.println(cursor.getColumnIndex(string)+" = "+string);  
  8.         }  
  9.     }  

结果为:

06-24 01:05:44.979: I/System.out(1529): 0 = _id
06-24 01:05:44.983: I/System.out(1529): 1 = album
06-24 01:05:44.987: I/System.out(1529): 2 = album_key
06-24 01:05:44.987: I/System.out(1529): 3 = minyear
06-24 01:05:44.987: I/System.out(1529): 4 = maxyear
06-24 01:05:44.987: I/System.out(1529): 5 = artist
06-24 01:05:44.987: I/System.out(1529): 6 = artist_id
06-24 01:05:44.987: I/System.out(1529): 7 = artist_key
06-24 01:05:44.987: I/System.out(1529): 8 = numsongs
06-24 01:05:44.987: I/System.out(1529): 9 = album_art

可以看到相应的字段和下标是什么。

[java]  view plain  copy
  1. // 艺术家  
  2.     private Uri artUri = MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI;  
  3.     // 流派  
  4.     private Uri genresUri = MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI;  

也可以通过上面的Uri来查询音频的艺术家和流派相应的信息。

音频信息比较全的是这个类 MediaStore.Audio.Media 可以通过Uri来看下字段有什么:

[java]  view plain  copy
  1. private Uri mediaUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  


字段为:

06-24 01:25:51.656: I/System.out(5292): 0 = _id  
06-24 01:25:51.656: I/System.out(5292): 1 = _data  音频路径
06-24 01:25:51.656: I/System.out(5292): 2 = _display_name音频名称包括后缀名
06-24 01:25:51.656: I/System.out(5292): 3 = _size  音频大小
06-24 01:25:51.656: I/System.out(5292): 4 = mime_type音频类型
06-24 01:25:51.656: I/System.out(5292): 5 = date_added
06-24 01:25:51.656: I/System.out(5292): 6 = is_drm
06-24 01:25:51.656: I/System.out(5292): 7 = date_modified
06-24 01:25:51.656: I/System.out(5292): 8 = title  音频名称不包括后缀名
06-24 01:25:51.656: I/System.out(5292): 9 = title_key
06-24 01:25:51.664: I/System.out(5292): 10 = duration音频时长
06-24 01:25:51.664: I/System.out(5292): 11 = artist_id
06-24 01:25:51.664: I/System.out(5292): 12 = composer
06-24 01:25:51.664: I/System.out(5292): 13 = album_id
06-24 01:25:51.672: I/System.out(5292): 14 = track
06-24 01:25:51.672: I/System.out(5292): 15 = year
06-24 01:25:51.672: I/System.out(5292): 16 = is_ringtone
06-24 01:25:51.672: I/System.out(5292): 17 = is_music
06-24 01:25:51.672: I/System.out(5292): 18 = is_alarm
06-24 01:25:51.672: I/System.out(5292): 19 = is_notification
06-24 01:25:51.672: I/System.out(5292): 20 = is_podcast
06-24 01:25:51.672: I/System.out(5292): 21 = bookmark
06-24 01:25:51.700: I/System.out(5292): 22 = album_artist
06-24 01:25:51.700: I/System.out(5292): 23 = artist_id:1
06-24 01:25:51.700: I/System.out(5292): 24 = artist_key
06-24 01:25:51.700: I/System.out(5292): 25 = artist
06-24 01:25:51.700: I/System.out(5292): 26 = album_id:1
06-24 01:25:51.700: I/System.out(5292): 27 = album_key
06-24 01:25:51.700: I/System.out(5292): 28 = album

字段很多,就对比较常用的注释了下,有字段是和其他表关联的如 artist_id、album_id等等,其中比较常用的是  _data、 _display_name、 _size、mime_type、 title、duration等字段

可以通过常用的字段来查询手机下相应的音频文件:

[java]  view plain  copy
  1. private Uri mediaUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;  

[java]  view plain  copy
  1. private void getUriData(Uri uri){  
  2.           
  3.         String[] projection = {"_data","_display_name","_size","mime_type","title","duration"};  
  4.         Cursor cursor = getContentResolver().query(uri, projection, nullnullnull);  
  5.         cursor.moveToFirst();  
  6.         do {  
  7.             System.out.println("_data = "+cursor.getString(cursor.getColumnIndex("_data")));  
  8.             System.out.println("_display_name = "+cursor.getString(cursor.getColumnIndex("_display_name")));  
  9.             System.out.println("_size = "+cursor.getString(cursor.getColumnIndex("_size")));  
  10.             System.out.println("mime_type = "+cursor.getString(cursor.getColumnIndex("mime_type")));  
  11.             System.out.println("title = "+cursor.getString(cursor.getColumnIndex("title")));  
  12.             System.out.println("duration = "+cursor.getString(cursor.getColumnIndex("duration")));  
  13.         } while (cursor.moveToNext());  
  14.     }  

结果如下:

06-24 13:40:12.445: I/System.out(4610): _data = /mnt/sdcard/kgmusic/download/孙楠、神话、韩红 - 美丽的神话.mp3
06-24 13:40:12.445: I/System.out(4610): _display_name = 孙楠、神话、韩红 - 美丽的神话.mp3
06-24 13:40:12.445: I/System.out(4610): _size = 4635648
06-24 13:40:12.445: I/System.out(4610): mime_type = audio/mpeg
06-24 13:40:12.445: I/System.out(4610): title = 美丽的神话
06-24 13:40:12.445: I/System.out(4610): duration = 289712

06-24 13:40:12.445: I/System.out(4610): _data = /mnt/sdcard/kgmusic/download/那英、孙楠 - 只要有你.mp3
06-24 13:40:12.445: I/System.out(4610): _display_name = 那英、孙楠 - 只要有你.mp3
06-24 13:40:12.445: I/System.out(4610): _size = 4012536
06-24 13:40:12.445: I/System.out(4610): mime_type = audio/mpeg
06-24 13:40:12.445: I/System.out(4610): title = 只要有你( 少年包青天 片尾曲)
06-24 13:40:12.446: I/System.out(4610): duration = 250784

由于音频过多就列举了两个,可以看到通过字段的查询获取到音频的详细信息。


2、MediaStore.Images

在该类中有一个借口和两个class ,分别为:

MediaStore.Images.ImageColumns可以查看图片的字段信息

MediaStore.Images.Media可以获取图片的相关信息

MediaStore.Images.Thumbnails可以获取图片的缩略图

关于MediaStore.Images.ImageColumns 可以查看api ,下面通过MediaStore.Images.Media 查询手机上的图片。

[java]  view plain  copy
  1. private Uri imageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;  

通过上面查看字段的代码,可以看到如下图片的字段信息:

06-24 13:52:34.018: I/System.out(4755): 0 = _id
06-24 13:52:34.018: I/System.out(4755): 1 = _data
06-24 13:52:34.018: I/System.out(4755): 2 = _size
06-24 13:52:34.018: I/System.out(4755): 3 = _display_name
06-24 13:52:34.018: I/System.out(4755): 4 = mime_type
06-24 13:52:34.018: I/System.out(4755): 5 = title
06-24 13:52:34.018: I/System.out(4755): 6 = date_added
06-24 13:52:34.018: I/System.out(4755): 7 = date_modified
06-24 13:52:34.018: I/System.out(4755): 8 = description
06-24 13:52:34.018: I/System.out(4755): 9 = picasa_id
06-24 13:52:34.018: I/System.out(4755): 10 = isprivate
06-24 13:52:34.018: I/System.out(4755): 11 = latitude
06-24 13:52:34.018: I/System.out(4755): 12 = longitude
06-24 13:52:34.018: I/System.out(4755): 13 = datetaken
06-24 13:52:34.018: I/System.out(4755): 14 = orientation
06-24 13:52:34.018: I/System.out(4755): 15 = mini_thumb_magic
06-24 13:52:34.018: I/System.out(4755): 16 = bucket_id
06-24 13:52:34.018: I/System.out(4755): 17 = bucket_display_name
06-24 13:52:34.018: I/System.out(4755): 18 = is_drm
06-24 13:52:34.018: I/System.out(4755): 19 = drm_content_uri
06-24 13:52:34.018: I/System.out(4755): 20 = drm_offset
06-24 13:52:34.018: I/System.out(4755): 21 = drm_dataLen
06-24 13:52:34.018: I/System.out(4755): 22 = drm_rights_issuer
06-24 13:52:34.018: I/System.out(4755): 23 = drm_content_name
06-24 13:52:34.018: I/System.out(4755): 24 = drm_content_description
06-24 13:52:34.018: I/System.out(4755): 25 = drm_content_vendor
06-24 13:52:34.019: I/System.out(4755): 26 = drm_icon_uri
06-24 13:52:34.019: I/System.out(4755): 27 = drm_method

可以查看和音频的字段是有些不同的。获取图片的基本信息:

[java]  view plain  copy
  1.  private void getUriData(Uri uri){  
  2.       
  3.     String[] projection = {"_data","_display_name","_size","mime_type","title","orientation"};  
  4.     Cursor cursor = getContentResolver().query(uri, projection, nullnullnull);  
  5.     cursor.moveToFirst();  
  6.     do {  
  7. System.out.println("_data = "+cursor.getString(cursor.getColumnIndex("_data")));  
  8. System.out.println("_display_name = "+cursor.getString(cursor.getColumnIndex("_display_name")));  
  9. System.out.println("_size = "+cursor.getString(cursor.getColumnIndex("_size")));  
  10. System.out.println("mime_type = "+cursor.getString(cursor.getColumnIndex("mime_type")));  
  11. System.out.println("title = "+cursor.getString(cursor.getColumnIndex("title")));  
  12. System.out.println("orientation = "+cursor.getString(cursor.getColumnIndex("orientation")));  
  13.  while (cursor.moveToNext());  
  14.  }<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>  

orientation 为图片的对其方式, 输出信息为:

06-24 13:57:59.653: I/System.out(4851): _data = /mnt/sdcard/sdcard2/Photo/IMG_20100101_081333.jpg
06-24 13:57:59.653: I/System.out(4851): _display_name = IMG_20100101_081333.jpg
06-24 13:57:59.653: I/System.out(4851): _size = 795457
06-24 13:57:59.653: I/System.out(4851): mime_type = image/jpeg
06-24 13:57:59.653: I/System.out(4851): title = IMG_20100101_081333
06-24 13:57:59.654: I/System.out(4851): orientation = 90


06-24 13:57:59.654: I/System.out(4851): _data = /mnt/sdcard/sdcard2/Photo/IMG_20100101_081344.jpg
06-24 13:57:59.654: I/System.out(4851): _display_name = IMG_20100101_081344.jpg
06-24 13:57:59.654: I/System.out(4851): _size = 673729
06-24 13:57:59.654: I/System.out(4851): mime_type = image/jpeg
06-24 13:57:59.654: I/System.out(4851): title = IMG_20100101_081344
06-24 13:57:59.654: I/System.out(4851): orientation = 90


06-24 13:57:59.654: I/System.out(4851): _data = /mnt/sdcard/QQ_Screenshot/1425453607656.png
06-24 13:57:59.654: I/System.out(4851): _display_name = 1425453607656.png
06-24 13:57:59.654: I/System.out(4851): _size = 65742
06-24 13:57:59.654: I/System.out(4851): mime_type = image/png
06-24 13:57:59.654: I/System.out(4851): title = 1425453607656
06-24 13:57:59.654: I/System.out(4851): orientation = null

MediaStore.Images.Thumbnails获取缩略图这个类和下面获取手机视频信息一起讲。


2、MediaStore.Video

该类有两个class比较常用:MediaStore.Video.Media MediaStore.Video.Thumbnails  一个是获取视频的相关信息,一个是获取视频的缩略图

MediaStore.Video.Media 用法和上面介绍的一样,不清楚它有什么字段的,可以先查询出来,再来获取视频的相关信息,和路径、名称、类型等等,这里就不介绍了。下面是获取视频的缩略图的相关操作。

  MediaStore.Video.Thumbnails 主要用到这个两个方法:

[java]  view plain  copy
  1. static Bitmap  getThumbnail(ContentResolver cr, long origId, long groupId, int kind, BitmapFactory.Options options)    
[java]  view plain  copy
  1. static Bitmap  getThumbnail(ContentResolver cr, long origId, int kind, BitmapFactory.Options options)    

这里第一个参数可以通过 getContentResolver() 来获取 、第二个参数 origId 为视频的ID ,第三个参数 groupId 我也不太清楚,大家知道的可以告诉我一下O(∩_∩)O, 第四个参数kind 有两种类型分别为:

MICRO_KIND(微型分辨率小)MINI_KIND  (迷你型)、第五个参数 为BitmapFactory.Option对象

<1> 第一种是使用上面介绍的方法:
[java]  view plain  copy
  1. public class ThumbnailActivity extends Activity {  
  2.   
  3.     private ListView listView;  
  4.       
  5.     private Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;  
  6.       
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.video_listview);  
  11.           
  12.         listView = (ListView) findViewById(R.id.mylistview1);  
  13.         new MyThumbnailAsyncTask().execute(videoUri);  
  14.           
  15.     }  
  16.   
  17.     /** 
  18.      * 异步加载 
  19.      * 
  20.      */  
  21.     private class MyThumbnailAsyncTask extends AsyncTask<Uri, Void, List<Bitmap>>{  
  22.           
  23.         @Override  
  24.         protected List<Bitmap> doInBackground(Uri... params) {  
  25.             // TODO Auto-generated method stub  
  26.             List<Bitmap> data = getBitmapFromVideo(params[0]);  
  27.             return data;  
  28.         }  
  29.           
  30.         @Override  
  31.         protected void onPostExecute(List<Bitmap> result) {  
  32.             listView.setAdapter(new MyThumbnailAdapter(result));  
  33.             super.onPostExecute(result);  
  34.         }  
  35.     }  
  36.       
  37.     /** 
  38.      * 获取手机上视频的缩略图 
  39.      * @param uri 视频的Uri 
  40.      * @return 
  41.      */  
  42.     private List<Bitmap> getBitmapFromVideo(Uri uri){  
  43.           
  44.         List<Bitmap> list = new ArrayList<Bitmap>();  
  45.         ContentResolver cr = getContentResolver();  
  46.         Cursor cursor = cr.query(uri, new String[]{Media._ID}, nullnullnull);  
  47.         cursor.moveToFirst();  
  48.         do {  
  49.             long id = cursor.getLong(0); // 取得视频的ID,因为我上行只有一个参数所以下标为0  
  50.             BitmapFactory.Options options = new Options();  
  51.             Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(cr, id, MediaStore.Video.Thumbnails.MINI_KIND, options);  
  52.             if (bitmap == null) {  
  53.                 Log.e("TAG""bitmap == null");  
  54.             }  
  55.             list.add(bitmap);  
  56.         } while (cursor.moveToNext());  
  57.               
  58.         return list;  
  59.     }  
  60.       
  61.     private class MyThumbnailAdapter extends BaseAdapter{  
  62.   
  63.         private List<Bitmap> mlist;  
  64.           
  65.           
  66.         public MyThumbnailAdapter(List<Bitmap> list) {  
  67.             this.mlist = list;  
  68.         }  
  69.   
  70.         @Override  
  71.         public int getCount() {  
  72.             // TODO Auto-generated method stub  
  73.             return mlist.size();  
  74.         }  
  75.   
  76.         @Override  
  77.         public Object getItem(int position) {  
  78.             // TODO Auto-generated method stub  
  79.             return mlist.get(position);  
  80.         }  
  81.   
  82.         @Override  
  83.         public long getItemId(int position) {  
  84.             // TODO Auto-generated method stub  
  85.             return position;  
  86.         }  
  87.   
  88.         @Override  
  89.         public View getView(int position, View convertView, ViewGroup parent) {  
  90.               
  91.             ViewHolder holder  = null;  
  92.               
  93.             if (convertView == null) {  
  94.                 holder = new ViewHolder();  
  95.                 convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.video_img, null);  
  96.                 holder.imageView = (ImageView) convertView.findViewById(R.id.my_img);  
  97.                 convertView.setTag(holder);  
  98.             }else{  
  99.                 holder = (ViewHolder) convertView.getTag();  
  100.             }  
  101.             holder.imageView.setImageBitmap(mlist.get(position));  
  102.             return convertView;  
  103.         }  
  104.           
  105.         private class ViewHolder{  
  106.             private ImageView imageView;  
  107.         }  
  108.     }  
  109.       
  110. }  

很简单XML就不贴了,就一个ListView。通过上面的方法图片缩略图的获取也是一样。

<2> 第二种通过 MediaMetadataRetriever 来获取:
[java]  view plain  copy
  1. public class MediaMetadataActivity extends Activity{  
  2.   
  3.     private ProgressDialog dialog = null;  
  4.     private Uri videoUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;  
  5.     private ListView listView;  
  6.       
  7.     @Override  
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         // TODO Auto-generated method stub  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.list_view);  
  12.           
  13.         listView = (ListView) findViewById(R.id.mylistview);  
  14.         dialog = new ProgressDialog(this);  
  15.         dialog.setMessage("加载数据中...");  
  16.         dialog.show();  
  17.         new myAsyncTask().execute(videoUri);  
  18.     }  
  19.       
  20.     private class myAsyncTask extends AsyncTask<Uri, Void,List<ListItem> >{  
  21.   
  22.         @Override  
  23.         protected List<ListItem> doInBackground(Uri... params) {  
  24.             // TODO Auto-generated method stub  
  25.             List<VideoItem> videoItems = getMediaPath(params[0]);  
  26.             List<ListItem> items = getListItem(videoItems);  
  27.             return items;  
  28.         }  
  29.           
  30.         @Override  
  31.         protected void onPostExecute(List<ListItem> result) {  
  32.             // TODO Auto-generated method stub  
  33.             if (dialog!=null) {  
  34.                 dialog.dismiss();  
  35.             }  
  36.             listView.setAdapter(new MyAdapter(result));  
  37.             super.onPostExecute(result);  
  38.         }  
  39.     }  
  40.       
  41.     private List<ListItem> getListItem(List<VideoItem> items){  
  42.           
  43.         List<ListItem> listItems = new ArrayList<ListItem>();  
  44.         for (int i = 0; i < items.size(); i++) {  
  45.               
  46.             ListItem item = new ListItem();  
  47.             item.setBitmap(getThumbnail(items.get(i).getPath()));  
  48.             item.setTitle(items.get(i).getTitle());  
  49.             listItems.add(item);  
  50.         }  
  51.           
  52.         return listItems;  
  53.     }  
  54.       
  55.     /** 
  56.      * 主要是这个方法通过为MediaMetadataRetriever 设置视频的路径来取得缩略图 
  57.      * @param path 视频的路径 
  58.      * @return 
  59.      */  
  60.     private Bitmap getThumbnail(String path){  
  61.           
  62.         MediaMetadataRetriever retriever = new MediaMetadataRetriever();  
  63.         retriever.setDataSource(path);  
  64.         Bitmap bitmap = retriever.getFrameAtTime();  
  65.         retriever.release();  
  66.         return bitmap;  
  67.     }  
  68.       
  69.     private List<VideoItem> getMediaPath(Uri uri){  
  70.           
  71.         List<VideoItem> mylist = new ArrayList<VideoItem>();  
  72.         String projection[] = {Media.DATA,Media.TITLE,Media.DURATION};  
  73.         Cursor cursor  = getContentResolver().query(uri, projection, nullnullnull);  
  74.         cursor.moveToFirst();  
  75.         int count = cursor.getCount();  
  76.         for (int i = 0; i < count; i++) {  
  77.               
  78.             VideoItem item = new VideoItem();  
  79.             item.setPath(cursor.getString(0));  
  80.             item.setTitle(cursor.getString(1));  
  81.             mylist.add(item);  
  82.             cursor.moveToNext();  
  83.         }  
  84.         return mylist;  
  85.     }  
  86.       
  87.     private class MyAdapter extends BaseAdapter{  
  88.   
  89.         List<ListItem> mlist;  
  90.           
  91.         public MyAdapter(List<ListItem> list) {  
  92.             super();  
  93.             this.mlist = list;  
  94.         }  
  95.   
  96.         @Override  
  97.         public int getCount() {  
  98.             // TODO Auto-generated method stub  
  99.             return mlist.size();  
  100.         }  
  101.   
  102.         @Override  
  103.         public Object getItem(int position) {  
  104.             // TODO Auto-generated method stub  
  105.             return mlist.get(position);  
  106.         }  
  107.   
  108.         @Override  
  109.         public long getItemId(int position) {  
  110.             // TODO Auto-generated method stub  
  111.             return position;  
  112.         }  
  113.   
  114.         @Override  
  115.         public View getView(int position, View convertView, ViewGroup parent) {  
  116.             ViewHolder holder  = null;  
  117.               
  118.             if (convertView == null) {  
  119.                 holder = new ViewHolder();  
  120.                 convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);  
  121.                 holder.imageView = (ImageView) convertView.findViewById(R.id.img);  
  122.                 holder.textView = (TextView) convertView.findViewById(R.id.tv);  
  123.                 convertView.setTag(holder);  
  124.             }else{  
  125.                 holder = (ViewHolder) convertView.getTag();  
  126.             }  
  127.             holder.imageView.setImageBitmap(mlist.get(position).getBitmap());  
  128.             holder.textView.setText(mlist.get(position).getTitle());  
  129.             return convertView;  
  130.         }  
  131.           
  132.         private class ViewHolder{  
  133.             private ImageView imageView;  
  134.             private TextView textView;  
  135.         }  
  136.     }  
  137. }  

MediaMetadataRetriever 除了通过  getFrameAtTime() 方法获取外,还可以用 getFrameAtTime(long timeUs)和 getFrameAtTime(long timeUs, int option)方法通过时长来获取,这就是获取视频缩略图的两种方式。

以上如果有错的地方,欢迎指出!!O(∩_∩)O~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值