1. 程式人生 > >Android 超簡單音樂播放器(九)搜尋網路歌曲,獲得熱門榜單(GridView)(易源api的使用)(JSON的解析)(重新整理)

Android 超簡單音樂播放器(九)搜尋網路歌曲,獲得熱門榜單(GridView)(易源api的使用)(JSON的解析)(重新整理)

首先感謝易源API!

提供了QQ音樂的介面~

咳咳...
明天要寫文件..看來..哎..我的歌詞要等假期了?

迴歸正題~

首先上一下我的介面啊實現啊啥的~





點選榜單會出現對應的歌曲~

可以搜尋網路歌曲~

可以重新整理~

先寫榜單的實現~

首先是net這個Fragment的佈局程式碼~

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android
:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="45dp" android:background="#edebeb"> <EditText android:imeOptions="actionSearch" android:maxLines="1" android:id="@+id/et_findlocal" android
:textSize="13sp" android:hint="搜尋網路歌曲" android:gravity="center" android:layout_marginRight="10dp" android:layout_marginLeft="10dp" android:background="@drawable/btn_white" android:layout_width="0dp" android:layout_weight="1" android:layout_height="30dp" android:layout_gravity="center"/> <ImageView
android:id="@+id/iv_findNet" android:layout_marginRight="5dp" android:layout_gravity="center" android:layout_width="0dp" android:layout_weight="0.1" android:layout_height="30dp" android:background="@drawable/find"/> </LinearLayout> <RelativeLayout android:id="@+id/rl_scroll" android:layout_width="match_parent" android:layout_height="wrap_content"> <GridView android:id="@+id/main_gridview" android:layout_width="match_parent" android:layout_height="240dp" android:layout_marginTop="2dp" android:gravity="center" android:horizontalSpacing="0dp" android:numColumns="3" android:scrollbars="none" android:verticalSpacing="0dp" > </GridView> </RelativeLayout> <ImageView android:id="@+id/iv_translateAnimation" android:layout_gravity="right" android:layout_width="25dp" android:layout_height="25dp" android:src="@drawable/less" /> <View android:id="@+id/vv_xian" android:layout_width="match_parent" android:layout_height="5dp" android:background="#edebeb"/> <com.scwang.smartrefresh.layout.SmartRefreshLayout android:id="@+id/sr_fragment_net" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_marginTop="5dp" android:layout_width="match_parent" android:id="@+id/rv_net_song" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </com.scwang.smartrefresh.layout.SmartRefreshLayout> </LinearLayout>

然後就是寫item_gridview_song.xml的程式碼~

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="80dp"
android:layout_margin="1dp">
    <ImageView
android:id="@+id/iv_item_main_gird"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerInParent="true"
android:src="@drawable/find" />
    <TextView
android:id="@+id/tv_item_main_grid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="center"
android:text="民謠" />
</RelativeLayout>
好啦~介面部分就大功告成~~~然後要給gridview寫一個介面卡~
package com.music.adapter;
import android.content.Context;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.music.R;
/**
 * Created by 雅倩寶寶 on 2017/9/19.
 */
public class MusicGridAdapter extends BaseAdapter{
    private SparseArray<String> gridItems;
    private ViewHolder holder = null;
    private Context context;
    private int[] ids = { R.drawable.rege26,R.drawable.gaotai6,R.drawable.kge36, 
R.drawable.liuxing4,R.drawable.neidi5,R.drawable.net28, R.drawable.oumei3,
R.drawable.xingge26,R.drawable.yinyueren32
}; //把圖片放入一個字元組
@Override
public int getCount() {
        return gridItems.size() > 0 ? gridItems.size() : 0;}
    public MusicGridAdapter (SparseArray<String>  gridItems, Context context) {
        this.gridItems = gridItems;
        this.context = context;
}
    @Override
public Object getItem(int i) {
        return gridItems.get(i);}
    @Override
public long getItemId(int i) {
        return 0;}
    @Override
public View getView(int i, View view, ViewGroup viewGroup) {
        if(view == null){
            view = LayoutInflater.from(context).inflate(
                    R.layout.item_gridview_song,viewGroup,false);
holder = new ViewHolder(view);}
        holder.tvItemMainGrid.setText(gridItems.get(i)+"");
holder.ivItemMainGird.setImageResource(ids[i]);
        return view;}
    private class ViewHolder {
        public ImageView ivItemMainGird;
        public TextView tvItemMainGrid;
        public ViewHolder(View convertView) {
            ivItemMainGird =  convertView.findViewById(R.id.iv_item_main_gird);
tvItemMainGrid = convertView.findViewById(R.id.tv_item_main_grid);
}    }}
忘記說了..

根據API給到的資料我們要建立一個musicmodle類~(補一個api地址https://www.showapi.com/api/lookPoint/213)

(哎呀 史上最亂寫博主...)

public class MusicModle implements Serializable {

    /**
     * "albumid": 1181789,
     * "downUrl": "http://tsmusic24.tc.qq.com/104778928.mp3",
     * "seconds": 265,
     * "singerid": 12744,
     * "singername": "小瀋陽",
     * "songid": 104778928,
     * "songname": "八戒八戒 (《西遊記之孫悟空三打白骨精》電影推廣曲)",
     * "url": "http://ws.stream.qqmusic.qq.com/104778928.m4a?fromtag=46"
     */
private int albumid;
    private String downUrl;
    private int seconds;
    private int singerid;
    private String singername;
    private int songid;
    private String songname;
    private String url;
    public int getAlbumid() {
        return albumid;
}

    public void setAlbumid(int albumid) {
        this.albumid = albumid;
}

    public String getDownUrl() {
        return downUrl;
}

    public void setDownUrl(String downUrl) {
        this.downUrl = downUrl;
}

    public int getSeconds() {
        return seconds;
}

    public void setSeconds(int seconds) {
        this.seconds = seconds;
}

    public int getSingerid() {
        return singerid;
}

    public void setSingerid(int singerid) {
        this.singerid = singerid;
}

    public String getSingername() {
        return singername;
}

    public void setSingername(String singername) {
        this.singername = singername;
}

    public int getSongid() {
        return songid;
}

    public void setSongid(int songid) {
        this.songid = songid;
}

    public String getSongname() {
        return songname;
}

    public void setSongname(String songname) {
        this.songname = songname;
}

    public String getUrl() {
        return url;
}

    public void setUrl(String url) {
        this.url = url;
}


}

接下來我們需要新增兩個依賴0 0.

都是第一行程式碼中提到過的~

阿里嘎多~

compile 'com.squareup.okhttp3:okhttp:3.9.0'//HTTP訪問網路
compile 'com.google.code.gson:gson:2.7'
第一個就是連線網路!(我是這樣理解的~)

第二個就是解析gson的資料~

首先0 0.建立一個HttpUtil~

由於我們用了那個啥okhttp 然後他不僅方便 還幫我們寫好了回撥的函式0 0.美滋滋 啊啊啊啊所以我們只需要呼叫callback就可以了

這應該很簡單看懂了吧~

感覺自己的密匙啊啥的~填入URL的相應位置~還有榜單的序號傳入 就可以獲得對應的資料!~

public class HttpUtil {
    public static void requestStringData(final int topid ,okhttp3.Callback callback) {
                    OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
                            .url("http://route.showapi.com/213-4?showapi_appid=46426&topid="+topid+"&showapi_sign=f908983676e94a34a11a56eb71400f79")
                            .build();
client.newCall(request).enqueue(callback);
}}

我的想法就是在回撥中解析資料!所以在這裡我又新建了一個MusicModleUtil

雖然我也不知道我為啥要這樣做...可能是後面播放起來好處理吧 我是想像我之前寫本地音樂那樣寫~喵嗚~~

package com.music.util;
import android.util.Log;
import com.music.bean.MusicModle;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Response;
/**
 * Created by 雅倩寶寶 on 2017/9/20.
 */
public class MusicModleUtil {
    public static List<MusicModle> list1;
    public static List<MusicModle> parseJOSNWithGSON (Response response){
        Log.i("TAG", "onCreate:5"+"");
list1 = new ArrayList<>();
        try{
            String ResponsData = response.body().string();
JSONObject jsonObject = new JSONObject(ResponsData);
String error = jsonObject.getString("showapi_res_error");
            if (!error.equals("")) {
                Log.i("TAG","error");}
            String body = jsonObject.getString("showapi_res_body");
JSONObject jsonObject1 = new JSONObject(body);
String pagebean = jsonObject1.getString("pagebean");
JSONObject jsonObject2 = new JSONObject(pagebean);
String songlist = jsonObject2.getString("songlist");
JSONArray jsonArray = new JSONArray(songlist);
            for (int i = 0; i < jsonArray.length() ; i++) {
                MusicModle musicModle = new MusicModle();
JSONObject jsonObject3 = jsonArray.getJSONObject(i);
musicModle.setDownUrl(jsonObject3.getString("downUrl"));
musicModle.setSingername(jsonObject3.getString("singername"));
musicModle.setSongname(jsonObject3.getString("songname"));
musicModle.setUrl(jsonObject3.getString("url"));
list1.add(musicModle);
Log.i("TAG", "onCreate:4 "+musicModle.getDownUrl());
}
        }catch (Exception e ){
            e.printStackTrace();
}
        return list1;
}
}
解析資料這裡要注意了,要一步步進行解析哦~

不要越過~否則會解析不成功的~

我覺得程式碼都很簡單了!!美滋滋~

然後我們就可以回到NetFragment中寫程式碼了~

private Dialog progressDialog;//載入條
private boolean isHide;//判斷Gridview是否隱藏

private SparseArray<String> gridItems = new SparseArray<String>();
private Map<String, Integer> maps = new HashMap<String, Integer>();
MusicGridAdapter musicGridAdapter;
第一個呢 是用來傳對應的名字~

第二個是點選事件跳轉的時候可以把對應的topid傳過去~

第三個就是宣告啦~

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_network, container, false);
initData();
musicGridAdapter = new MusicGridAdapter(gridItems, getContext());
mainGridview = view.findViewById(R.id.main_gridview);
mainGridview.setAdapter(musicGridAdapter);
mainGridview.setOnItemClickListener(new mainGridviewListener());
ButterKnife.bind(this, view);return view;
}


    public void showProgressDialog() {//請求網路的時候顯示
       if (progressDialog == null) {
            progressDialog = new Dialog(getContext(), R.style.Pro);
progressDialog.setContentView(R.layout.dialog_loading);
progressDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
TextView msg = (TextView) progressDialog.findViewById(R.id.id_tv_loadingmsg);
msg.setText("(σ'・д・)σ");
progressDialog.show();
}
        progressDialog.show();
}

   

    public void dissmiss() {  //請求網路後消失
        if (progressDialog != null) {
            progressDialog.dismiss();
}
    }
 
    private void initData() {  //把對應的榜單名字傳入
        gridItems.put(0, getString(R.string.msuic_fenlei_rege));
gridItems.put(1, getString(R.string.music_fenlei_gantai));
gridItems.put(2, getString(R.string.music_fenlei_Kge));
gridItems.put(3, getString(R.string.music_fenlei_liuxing));
gridItems.put(4, getString(R.string.music_fenlei_neidi));
gridItems.put(5, getString(R.string.music_fenlei_net));
gridItems.put(6, getString(R.string.music_fenlei_oumei));
gridItems.put(7, getString(R.string.music_fenlei_xingge));
gridItems.put(8, getString(R.string.music_fenlei_yinyueren));
getFenlei();
}

    @OnClick({R.id.iv_findNet, R.id.iv_translateAnimation})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.iv_findNet:
              
            case R.id.iv_translateAnimation:
                if (isHide) {
//對是否隱藏VIEW進行判斷 如果隱藏點選則會顯示 否則會隱藏                    
mainGridview.setVisibility(view.VISIBLE);
vvXian.setVisibility(view.VISIBLE);
ivTranslateAnimation.setImageResource(R.drawable.less);
isHide = false;
} else {
//                    
mainGridview.setVisibility(view.GONE);
vvXian.setVisibility(view.GONE);
ivTranslateAnimation.setImageResource(R.drawable.more_unfold);
isHide = true;
}
                break;
}
    }

   

    /**
     * GirdView點選事件
     */
private class mainGridviewListener implements AdapterView.OnItemClickListener {
        @Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                                long id) {
            Intent intent = new Intent(getContext(), MusicListActivity.class);
//將topid傳過去 
intent.putExtra("musictype", maps.get(gridItems.get(position)));
startActivity(intent);
}
    }

    public void getFenlei() {
        maps.put(getString(R.string.msuic_fenlei_rege), 26);
maps.put(getString(R.string.music_fenlei_gantai), 6);
maps.put(getString(R.string.music_fenlei_Kge), 36);
maps.put(getString(R.string.music_fenlei_liuxing), 4);
maps.put(getString(R.string.music_fenlei_neidi), 5);
maps.put(getString(R.string.music_fenlei_net), 28);
maps.put(getString(R.string.music_fenlei_oumei), 3);
maps.put(getString(R.string.music_fenlei_xingge), 27);
maps.put(getString(R.string.music_fenlei_yinyueren), 32);
// 熱歌 26
}

    @Override
public void onDestroyView() {
        super.onDestroyView();
ButterKnife.unbind(this);
}
}
差不多就是醬紫了

0 0.。。額 剩下的我就帖MusicListActivity 的程式碼吧0 0介面卡啊其他什麼的都是和之前的一樣的~

public class MusicListActivity extends BaseActivity {
    @Bind(R.id.tv_toolbar)
    TextView tvToolbar;
@Bind(R.id.tb_main)
    Toolbar tbMain;
    private int typeid = 5;
List<MusicModle> list;
@Bind(R.id.rv_fenlei_list)
    RecyclerView rvFenleiList;
MusicFenAdapter musicFenAdapter;
    private SparseArray<String> maps = new SparseArray<String>();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_music_list);
ButterKnife.bind(this);
initTypes();
typeid = getIntent().getIntExtra("musictype", 5);
setToolBar(R.id.tb_main);
      //設定榜單名為標題名字
tvToolbar.setText(maps.get(typeid));
        initWhiteHome();
        Log.i("TAG", "onCreate: " + typeid);
showProgressDialog();
HttpUtil.requestStringData(typeid, new Callback() {
            @Override
public void onFailure(Call call, IOException e) {
                Log.i("TAG", "onCreate:2 " + e);
dissmiss();}
            @Override
public void onResponse(Call call, Response response) throws IOException {
                musicFenAdapter = new MusicFenAdapter(MusicModleUtil.parseJOSNWithGSON(response));
//更新介面要回到主執行緒進行更新~
runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        rvFenleiList.setLayoutManager(new LinearLayoutManager(getBaseContext()));
rvFenleiList.setItemAnimator(new DefaultItemAnimator());
rvFenleiList.setAdapter(musicFenAdapter);
dissmiss();
}
                });
}
        });
}
//設定標題欄的名字為榜單
    private void initTypes() {
        maps.put(26,getString(R.string.msuic_fenlei_rege));
maps.put(6,getString(R.string.music_fenlei_gantai));
maps.put(36,getString(R.string.music_fenlei_Kge));
maps.put(4,getString(R.string.music_fenlei_liuxing) );
maps.put(5,getString(R.string.music_fenlei_neidi));
maps.put(28,getString(R.string.music_fenlei_net));
maps.put(3,getString(R.string.music_fenlei_oumei));
maps.put(27,getString(R.string.music_fenlei_xingge));
maps.put(32,getString(R.string.music_fenlei_yinyueren));
}
}
覺得自己真的寫得好沒實用...有點難過了..

那個歌曲搜尋其實和榜單實現差不多..

我就不寫了..

只是在解析的時候記得要把頁數提取出來..

直接上一下我的完整的NetFragment吧

裡面的重新整理用了開源庫..

compile 'com.android.support:appcompat-v7:25.3.1'//版本隨意
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.3'//沒有使用特殊Header,可以不加這行
public class NetFragment extends Fragment {
    @Bind(R.id.et_findlocal)
    EditText etFindlocal;
@Bind(R.id.main_gridview)
    GridView mainGridview;
@Bind(R.id.rv_net_song)
    RecyclerView rvNetSong;
@Bind(R.id.iv_findNet)
    ImageView ivFindNet;
@Bind(R.id.iv_translateAnimation)
    ImageView ivTranslateAnimation;
@Bind(R.id.vv_xian)
    View vvXian;
@Bind(R.id.rl_scroll)
    RelativeLayout rlScroll;
@Bind(R.id.
            
           

相關推薦

Android 簡單音樂播放搜尋網路歌曲獲得熱門GridViewapi的使用JSON解析重新整理

首先感謝易源API! 提供了QQ音樂的介面~ 咳咳... 明天要寫文件..看來..哎..我的歌詞要等假期了? 迴歸正題~ 首先上一下我的介面啊實現啊啥的~ 點選榜單會出現對應的歌曲~ 可以搜尋網路歌曲~ 可以重新整理~ 先寫榜單的實現~ 首先是net這個Frag

Android 簡單音樂播放歌詞的實現

關於歌詞 有下面這些: 歌詞的獲取 歌詞的解析 自定義View 歌詞的獲取 歌詞的獲取分為兩種,一種是從本地一種是通過網路上提供的API獲取。我選擇的是歌詞迷的API http://api.geci.me/en/latest/ 說實話,這

Android 簡單音樂播放拖動歌曲進度條~音量控制~

音量控制 通過接收廣播進行改變 設定全域性變數 private AudioManager mAudioManager; private ContentObserver mVoiceObserver; private MyVolum

Android實現簡單音樂播放(MediaPlayer)

工程內容 實現一個簡單的音樂播放器,要求功能有: 播放、暫停功能;進度條顯示播放進度功能拖動進度條改變進度功能;後臺播放功能;停止功能;退出功能; 程式碼實現 匯入歌曲到手機SD卡的Music目錄中,這裡我匯入了4首歌曲:仙劍六裡面的《誓言成暉》、《劍客不能說》、《鏡

Android開發6:Service的使用簡單音樂播放的實現

閱讀目錄前言基礎知識實驗內容實驗過程注意事項實驗截圖原始碼下載注回到頂部前言   啦啦啦~各位好久不見啦~博主最近比較忙,而且最近一次實驗也是剛剛結束~   好了不廢話了,直接進入我們這次的內容~   在這篇博文裡我們將學習Service(服務)的相關知識,學會使用 Service 進行後臺工作, 學會使用

Android如何實現簡單音樂播放的程式碼

想必大家在學Android的音樂播放器時肯定會遇到很多困難,不怕,在這裡我給大家分享一個很簡單的音樂播放器,絕對會對你的學習有所幫助。本例子不難,但是也確能給你帶來柳暗花明又一村的感覺。閒話少說,馬上來看看這個播放器有

Android Studio:服務與多執行緒--簡單音樂播放

一、 實驗題目   服務與多執行緒--簡單音樂播放器 【目的】 1. 學會使用 MediaPlayer; 2. 學會簡單的多執行緒程式設計,使用 Handle 更新 UI; 3. 學會使用 Service 進行後臺工作; 4. 學會使用 Service 與 Activit

Android系列之音樂播放的實現一播放手機記憶體音訊檔案

現在給大家實現的是利用手機記憶體卡里的音訊檔案去播放的,至於xml佈局檔案大家可以去看我上一篇部落格的,因為這兩篇部落格是相關聯的。現在就開始吧!xml配置檔案許可權:(一定要加上) <uses-permission android:name="android.per

Android開發---MediaPlayer簡單音樂播放

功能介紹 實現一個簡單的播放器,類似網易雲音樂形式,功能包括: 播放、暫停,停止,退出功能;後臺播放功能;進度條顯示播放進度、拖動進度條改變進度功能;播放時圖片旋轉,顯示當前播放時間功能; 介面樣式  功能實現 1.

android全功能音樂播放、基於MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + MTRVA的綜合應用、圖片濾鏡處理等原始碼

Android仿微信朋友圈檢視圖片下拽返回。 Android圖片濾鏡處理,相機濾鏡處理效果原始碼 Android自定義View原始碼:一個水平的進度條 基於MVP-Clean + Weex + RxJava2 + Retrofit + Dagger2 + M

Android大作業——音樂播放

1、團隊成員: 計算機161班  1600802010 韓   璐   部落格地址:https://www.cnblogs.com/hanlulu/ 計算機161班 1600802036 朱永霞   部落格地址:https://www.

android控制第三方音樂播放暫停 繼續

private boolean isPauseMusic = false;//全域性變數 //控制的地方 AudioManager audioManager= (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);

android程式設計例項-音樂播放之歌詞顯示

        今天分享一個歌詞顯示的專案,首先讓我們來看看一般歌詞是什麼樣的格式,就拿神曲《小蘋果》來說的,請看歌詞: [00:00.91]小蘋果 [00:01.75]作詞:王太利 作曲:王太利 [00:02.47]演唱:筷子兄弟 [00:03.32] [00:17.4

Android 自定義音樂播放實現

Android自定義音樂播放器一:首先介紹用了哪些Android的知識點:1 MediaPlayer工具來播放音樂2 Handle。因為存在定時任務(歌詞切換,動畫,歌詞進度條變換等)需要由Handle來處理Ui相關內容3 動態許可權申請(該應用程式讀取本地歌曲,並且設定音質

簡單音樂播放還有歌詞

不是來說播放器的(前面我有一篇VLC的,可以倒回去看),這篇是來分享 這個顯示歌詞的,還是用了前一篇的PickerView的原理進行放大歌詞 使用知識點 歌詞動態放大

Android開源線上音樂播放——波尼音樂

波尼音樂 系列文章 Android開源線上音樂播放器——波尼音樂 Android開源音樂播放器之播放器基本功能 Android開源音樂播放器之高仿雲音樂黑膠唱片 Android開源音樂播放器之自動滾動歌詞 Android開源音樂播放器之線上音樂列表自動載入更多

Android仿蝦米音樂播放之自定義進度條seekbar

      先上圖吧,仿照寫的進度條 很明顯不是系統的自帶的進度條,所以我們需要自定義來實現這個效果,先看看官方給的例子 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"&g

Swift 3 :基於 AVAudioPlayer 的簡單音樂播放

vat content 控制器 ets 而已 rand init pla pause 2017.05.22 17:46* 字數 1585 閱讀 5095評論 0喜歡 8贊賞 2 https://www.jianshu.com/p/4d5c257428a1 學習ios以來差不

Android 實現簡單媒體播放功能

一、概述: 因為播放視訊需要很大的記憶體,所以必須使用surfaceview , surfaceview 裡實現了雙緩衝的功能, ——————————————————————— 有需求者請加qq:136137465,非誠勿擾 (java 架構師全套教程

Android 實現視屏播放、邊播邊快取功能附原始碼

來源:http://www.apkbus.com/blog-938789-76574.html效果開源播放器選擇Android上最為人熟知的MediaPlayer,對,就是這貨,在上兩篇音訊文章中頻頻露臉的傢伙,這次又有它的身影,然而還是這次不講他,就連他的封裝類VideoV