目录

开发环境

功能清单

部分源码

login.java

MainActivity.java

MyDatabase.java

build.gradle


学习安卓开发时做的一个小demo,知识点包括:intent、UI、界面切换、API调用、播放器调用、内部存储、list控件等。

具体可看视频:

简单的安卓网络音乐视频播放器app

截图:

开发环境

开发工具:Android Studio

音视频接口:网易云API,项目地址:网易云音乐 API service

功能清单

账号:注册、登录、删除、记住密码

音视频:搜索、播放/暂停音乐、播放/暂停视频、上一曲/下一曲

部分源码

当时初学,写的比较粗糙,仅供参考

login.java

package com.sxf.myapp;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteCursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;public class login extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "LOGIN";private Button button_signin;private Button button_signup;private Button button_delete;private EditText editText_pwd;private EditText editText_usr;private CheckBox checkBox_rmpwd;private SQLiteDatabase db;private Cursor cursor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);button_signin = findViewById(R.id.button_signin);button_signup = findViewById(R.id.button_signup);button_delete = findViewById(R.id.button_delete);editText_pwd = findViewById(R.id.editText_pwd);editText_usr = findViewById(R.id.editText_usr);checkBox_rmpwd = findViewById(R.id.checkBox_rmpwd);button_signin.setOnClickListener(this);button_signup.setOnClickListener(this);button_delete.setOnClickListener(this);SharedPreferences sharedPreferences = getSharedPreferences("loginFile", MODE_PRIVATE);Boolean rm = sharedPreferences.getBoolean("rm", false);if (rm){checkBox_rmpwd.setChecked(true);String temp = "";temp = sharedPreferences.getString("usr", "");editText_usr.setText(temp);temp = sharedPreferences.getString("pwd", "");editText_pwd.setText(temp);}Toast.makeText(this,"读取记录完成", Toast.LENGTH_SHORT).show();db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+"login.db", null);try {db.rawQuery("select * from users;", null);}catch (Exception e){e.printStackTrace();db.execSQL("create table users(id INTEGER PRIMARY KEY AUTOINCREMENT,usr VARCHAR(20) DEFAULT NULL,pwd VARCHAR(20) DEFAULT NULL);");}}@Overrideprotected void onDestroy() {super.onDestroy();if (!checkBox_rmpwd.isSelected()){SharedPreferences sharedPreferences = getSharedPreferences("loginFile", MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();
//            editor.putString("usr","");
//            editor.putString("pwd","");editor.putBoolean("rm",checkBox_rmpwd.isChecked());editor.apply();}Toast.makeText(this,"欢迎下次光临", Toast.LENGTH_SHORT).show();}@Overridepublic void onClick(View v) {String usr = editText_usr.getText().toString();String pwd = editText_pwd.getText().toString();if (TextUtils.isEmpty(usr) || TextUtils.isEmpty(pwd)){Toast.makeText(this,"请先输入用户名和密码", Toast.LENGTH_SHORT).show();return;}switch (v.getId()){case R.id.button_signin:  //登录try {if (!db.isOpen()){db = SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+"login.db", null);}cursor = db.rawQuery("select * from users where usr=(?) AND pwd=(?)", new String[]{usr, pwd},null);Log.i(TAG, "登录: "+cursor.getCount());if (cursor.getCount()==0){Toast.makeText(this,"用户名或密码错误", Toast.LENGTH_SHORT).show();}else {cursor.moveToFirst();String res = cursor.getString(1);Toast.makeText(this,"欢迎你,"+res, Toast.LENGTH_SHORT).show();db.close();SharedPreferences sharedPreferences = getSharedPreferences("loginFile", MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();if (checkBox_rmpwd.isChecked()){editor.putString("usr",usr);editor.putString("pwd",pwd);}else {editor.putString("usr","");editor.putString("pwd","");}editor.putBoolean("rm",checkBox_rmpwd.isChecked());editor.apply();Intent intent = new Intent(login.this, MainActivity.class);startActivity(intent);}}catch (Exception e){e.printStackTrace();}break;case R.id.button_signup:  // 注册try {cursor = db.rawQuery("select * from users where usr=(?)", new String[]{usr},null);Log.i(TAG, "注册: "+cursor.getCount());if (cursor.getCount()==0){db.execSQL("INSERT INTO users VALUES(null, ?,?)", new String[]{usr,pwd});cursor = db.rawQuery("select * from users where usr=(?)", new String[]{usr},null);if (cursor.getCount()==0){Toast.makeText(this,"注册失败", Toast.LENGTH_SHORT).show();}else {Toast.makeText(this,"注册成功", Toast.LENGTH_SHORT).show();}}else {Toast.makeText(this,"该用户已存在", Toast.LENGTH_SHORT).show();}}catch (Exception e){e.printStackTrace();}break;case R.id.button_delete:try {cursor = db.rawQuery("select * from users where usr=(?)", new String[]{usr},null);Log.i(TAG, "删户: "+cursor.getCount());if (cursor.getCount()>0){db.execSQL("DELETE FROM users WHERE usr=(?)", new String[]{usr});cursor = db.rawQuery("select * from users where usr=(?)", new String[]{usr},null);if (cursor.getCount()==0){Toast.makeText(this,"删除成功", Toast.LENGTH_SHORT).show();}else {Toast.makeText(this,"删除失败", Toast.LENGTH_SHORT).show();}}else {Toast.makeText(this,"该用户不存在", Toast.LENGTH_SHORT).show();}}catch (Exception e){e.printStackTrace();}break;default:break;}}
}

MainActivity.java

package com.sxf.myapp;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import android.annotation.SuppressLint;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "DEBUG";private Button button_search;private Button button_musicplay;private Button button_musicpause;private Button button_lastPage;private Button button_nextPage;private EditText editText_search;private TextView textView_searchResult;private Spinner spinner;private ListView listView_resultShow;private ArrayAdapter<String> adapterListView;private String rootURL = "http://121.36.68.53:3000/";private int offset = 0;private String[] idArrays;private int idArraysIndex = 0;private int checkMusicFlag = 0;private String selectedMusicUrl = null;private String selectedItem = null;private MediaPlayer mediaPlayer;private TextView textView_lrc;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button_search = findViewById(R.id.button_search);editText_search = findViewById(R.id.editText_search);textView_searchResult = findViewById(R.id.textView_searchResult);spinner = findViewById(R.id.spinner_class);listView_resultShow = findViewById(R.id.listview_resultshow);button_search.setOnClickListener(this);idArrays = new String[10];mediaPlayer = new MediaPlayer();textView_lrc = findViewById(R.id.textView_lrc);button_musicplay = findViewById(R.id.button_musicplay);button_musicpause = findViewById(R.id.button_musicpause);button_musicplay.setOnClickListener(this);button_musicpause.setOnClickListener(this);button_lastPage = findViewById(R.id.button_lastPage);button_nextPage = findViewById(R.id.button_nextPage);button_lastPage.setOnClickListener(this);button_nextPage.setOnClickListener(this);adapterListView = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1);listView_resultShow.setAdapter(adapterListView);listView_resultShow.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {button_nextPage.setVisibility(View.GONE);button_lastPage.setVisibility(View.GONE);String code = idArrays[position].split(",")[0];String vid = idArrays[position].split(",")[1];String name = idArrays[position].split(",")[2];Log.i(TAG, "onItemClick "+vid);getMusicUrl(vid, code);selectedItem = name;Log.i(TAG, "selectedItem: "+selectedItem);}});}@SuppressLint("HandlerLeak")Handler handler = new Handler(){@Overridepublic void handleMessage(@NonNull Message msg) {if (msg.what>0){String res = (String) msg.obj;if (msg.what==200){Log.i(TAG, "checkMusic: "+res);JSONObject obj = JSONObject.parseObject(res);if (obj!=null){if(obj.getBooleanValue("success")){checkMusicFlag = 1;}else {checkMusicFlag = -1;}}return;}if (msg.what==201){  // get music urlif (res!=null){System.out.println(res);JSONObject obj = JSONObject.parseObject(res);JSONArray data = obj.getJSONArray("data");if (data!=null){selectedMusicUrl = data.getJSONObject(0).getString("url");Log.i(TAG, "handleMessage201: "+selectedMusicUrl);findViewById(R.id.include_textview).setVisibility(View.VISIBLE);listView_resultShow.setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);if (selectedMusicUrl!=null){textView_lrc.setText("");textView_lrc.append(selectedItem);textView_lrc.append("\n\n");textView_lrc.append(selectedMusicUrl);
//                                playMusic(selectedMusicUrl);}else {textView_lrc.setText("没找到你要的东西");}}return;}}else if (msg.what==202){  // get mv urlif (res!=null){System.out.println(res);JSONObject obj = JSONObject.parseObject(res);JSONObject data = obj.getJSONObject("data");if (data!=null){selectedMusicUrl = data.getString("url");Log.i(TAG, "handleMessage202: "+selectedMusicUrl);findViewById(R.id.include_textview).setVisibility(View.VISIBLE);listView_resultShow.setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);if (selectedMusicUrl!=null){textView_lrc.setText("");textView_lrc.append(selectedItem);textView_lrc.append("\n\n");textView_lrc.append(selectedMusicUrl);}else {textView_lrc.setText("没找到你要的东西");}}return;}}JSONObject json = JSON.parseObject(res);JSONObject result = json.getJSONObject("result");Integer count = 0;JSONArray songs = null;switch (msg.what){case 1:count = result.getInteger("songCount");if (count>0){songs = result.getJSONArray("songs");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");JSONObject artists = item.getJSONArray("artists").getJSONObject(0);String artistName = artists.getString("name");idArrays[idArraysIndex++] = 1+","+id+","+name;Log.i(TAG, id+" - "+name+" - "+artistName);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name+" - "+artistName);}}break;case 10:count = result.getInteger("albumCount");if (count>0){songs = result.getJSONArray("albums");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");JSONObject artists = item.getJSONArray("artists").getJSONObject(0);String artistName = artists.getString("name");idArrays[idArraysIndex++] = 10+","+id+","+name;Log.i(TAG, id+" - "+name+" - "+artistName);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name+" - "+artistName);}}break;case 100:count = result.getInteger("artistCount");if (count>0){songs = result.getJSONArray("artists");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");Log.i(TAG, id+" - "+name+" - "+name);idArrays[idArraysIndex++] = 100+","+id+","+name;findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name);}}break;case 1000:count = result.getInteger("playlistCount");if (count>0){songs = result.getJSONArray("playlists");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");idArrays[idArraysIndex++] = 1000+","+id+","+name;Log.i(TAG, id+" - "+name);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name);}}break;case 1002:count = result.getInteger("userprofileCount");if (count>0){songs = result.getJSONArray("userprofiles");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("userId");String name = item.getString("nickname");idArrays[idArraysIndex++] = 1002+","+id+","+name;Log.i(TAG, id+" - "+name);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name);}}break;case 1004:count = result.getInteger("mvCount");if (count>0){songs = result.getJSONArray("mvs");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");JSONObject artists = item.getJSONArray("artists").getJSONObject(0);String artistName = artists.getString("name");idArrays[idArraysIndex++] = 1004+","+id+","+name;Log.i(TAG, id+" - "+name+" - "+artistName);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name+" - "+artistName);}}break;case 1006:count = result.getInteger("songCount");if (count>0){songs = result.getJSONArray("songs");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");JSONObject artists = item.getJSONArray("artists").getJSONObject(0);String artistName = artists.getString("name")+","+name;idArrays[idArraysIndex++] = 1006+","+id;Log.i(TAG, id+" - "+name+" - "+artistName);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name+" - "+artistName);}}break;case 1009:count = result.getInteger("djRadiosCount");if (count>0){songs = result.getJSONArray("djRadios");for (Object o :songs) {JSONObject item = (JSONObject) o;Integer id = item.getInteger("id");String name = item.getString("name");idArrays[idArraysIndex++] = 1009+","+id+","+name;Log.i(TAG, id+" - "+name);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name);}}break;case 1014:count = result.getInteger("videoCount");if (count>0){songs = result.getJSONArray("videos");for (Object o :songs) {JSONObject item = (JSONObject) o;String id = item.getString("vid");String name = item.getString("title");idArrays[idArraysIndex++] = 1014+","+id+","+name;Log.i(TAG, id+" - "+name);findViewById(R.id.include_textview).setVisibility(View.GONE);textView_searchResult.setVisibility(View.GONE);listView_resultShow.setVisibility(View.VISIBLE);adapterListView.add(name);}}break;default:break;}if (count==0){findViewById(R.id.include_textview).setVisibility(View.GONE);listView_resultShow.setVisibility(View.GONE);textView_searchResult.setText("没找到你要的东西");textView_searchResult.setVisibility(View.VISIBLE);return;}}}};public void playMusic(String url){if (url != null){try {mediaPlayer.setDataSource(url);mediaPlayer.prepare();} catch (Exception e) {e.printStackTrace();}}if (!mediaPlayer.isPlaying()){mediaPlayer.start();}}public void stopMusic(){if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}mediaPlayer.reset();}public void pauseMusic(){if (mediaPlayer.isPlaying()) {mediaPlayer.pause();}}public void destroyMusic(){if (mediaPlayer != null) {if (mediaPlayer.isPlaying()) {mediaPlayer.stop();}mediaPlayer.release();}}public Boolean isPlayMusic(){return mediaPlayer.isPlaying();}static void getWebInfoThread(final URL url, final Handler handler, final Integer what){new Thread(new Runnable() {@Overridepublic void run() {try {HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();InputStream inputStream = httpURLConnection.getInputStream();InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");BufferedReader bufferedReader = new BufferedReader(reader);StringBuilder buffer = new StringBuilder();String temp = null;while ((temp = bufferedReader.readLine())!=null){buffer.append(temp);}bufferedReader.close();reader.close();inputStream.close();handler.sendMessage(handler.obtainMessage(what, buffer.toString()));}catch (Exception e){e.printStackTrace();}}}).start();}public Boolean checkMusic(String id){try {URL url = new URL(rootURL+"check/music?id="+id);getWebInfoThread(url, handler, 200);while (checkMusicFlag==0){Thread.sleep(1000);};if (checkMusicFlag==1) return true;if (checkMusicFlag==-1) return false;}catch (Exception e){e.printStackTrace();}return false;}public void getMusicUrl(String id, String code){try {if (code.equals("1004")){URL url = new URL(rootURL+"mv/url?id="+id);getWebInfoThread(url, handler, 202);}else {URL url = new URL(rootURL+"song/url?id="+id);getWebInfoThread(url, handler, 201);}}catch (Exception e){e.printStackTrace();}}public void doSearch(int off){if (!TextUtils.isEmpty(editText_search.getText())){adapterListView.clear();stopMusic();idArraysIndex = 0;URL url = null;try {String msg = editText_search.getText().toString();String spinnerItem = spinner.getSelectedItem().toString().split(" ")[0];url = new URL(rootURL+"search?keywords="+URLEncoder.encode(msg,"utf-8")+"&limit=10&type="+spinnerItem+"&offset="+off);final URL finalUrl = url;Log.i(TAG, "URL: "+finalUrl);getWebInfoThread(finalUrl, handler, Integer.parseInt(spinnerItem));} catch (Exception e) {e.printStackTrace();}}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_search:offset = 0;button_nextPage.setVisibility(View.VISIBLE);button_lastPage.setVisibility(View.VISIBLE);adapterListView.clear();doSearch(0);break;case R.id.button_musicplay:if(!isPlayMusic()) {if (selectedMusicUrl.contains(".mp4")){Intent intent = new Intent(Intent.ACTION_VIEW);Uri uri = Uri.parse(selectedMusicUrl);intent.setDataAndType(uri, "video/3gp");startActivity(intent);}else {playMusic(selectedMusicUrl);}}break;case R.id.button_musicpause:if(isPlayMusic()){pauseMusic();}break;case R.id.button_lastPage:if (offset<10) offset=10;offset -= 10;doSearch(offset);break;case R.id.button_nextPage:offset += 10;doSearch(offset);break;default:break;}}
}

MyDatabase.java

package com.sxf.myapp;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;import androidx.annotation.Nullable;public class MyDatabase extends SQLiteOpenHelper {public MyDatabase(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

build.gradle

apply plugin: 'com.android.application'android {compileSdkVersion 29buildToolsVersion "29.0.3"defaultConfig {applicationId "com.sxf.myapp"minSdkVersion 21targetSdkVersion 29versionCode 1versionName "1.0"testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'androidx.constraintlayout:constraintlayout:1.1.3'implementation 'com.google.android.material:material:1.0.0'implementation 'androidx.annotation:annotation:1.1.0'implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'testImplementation 'junit:junit:4.12'androidTestImplementation 'androidx.test.ext:junit:1.1.1'androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'implementation 'com.android.support:localbroadcastmanager:29.0.0'implementation files('libs/fastjson-1.2.66.jar')
}

简单的安卓网络音乐视频播放器app相关推荐

  1. android 播放手机音乐播放器,推荐六款安卓手机音乐视频播放器软件

    安卓手机音乐视频播放器软件合辑推荐:因为安卓平台的开源性,导致安卓平台上有很多好玩的手机软件.其中,安卓手机音乐播放器软件与安卓手机视频播放器软件是非常受安卓用户欢迎的两大类别.今天,凌少就将音乐与视 ...

  2. android 取色器_音乐剪辑器手机版下载-音乐剪辑器app下载v9.10.15 安卓免费版

    音乐剪辑器app是非常棒的剪辑软件,大家可以使用它对各种彩铃铃声,原版音乐进行剪辑编辑处理,功能强大完全免费,而且操作非常简单,有需要的朋友赶快下载试试吧! 音乐剪辑器手机版介绍 有时候想把多首歌曲合 ...

  3. 安卓音乐播放器app开发(一)---功能分析及启动页的制作

    音乐播放器app-功能分析及启动页的制作 现如今的音乐播放器的app种类繁多,让有选择困难症的同胞们难以抉择.现在,让Ryan带你打造一款属于自己的音乐播放器app. 功能介绍 实现本地音乐及在线音乐 ...

  4. 简单几步实现网络音乐播放器(Python爬虫版百度FM)

    Python入门之爬取百度音乐 先说一下为什么会有这篇文章,首先肯定是有这个需求了,本人出差在外地,这里的网速卡到爆,根本支撑不了在线听歌的要求,所以就想下载到本地来慢慢听.这可是python的绝活, ...

  5. android网络音乐播放器

    ** 网络音乐播放器 ** 转载请指明博客网址 作者:WangYouHu我的主页网址 链接:https://www.jianshu.com/p/855659f266ae 著作权归作者所有,任何形式的转 ...

  6. 在线音乐播放器app

    在线音乐播放器app 前言 该app是安卓课程的大作业,旷了一学期的课,代码有点乱. 使用的API:网易云音乐 API 代码地址:https://github.com/xjhqre/music-pla ...

  7. 基于android的网络音乐播放器-添加viewpager和fragment实现滑动切换多个界面(二)

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

  8. 个人项目---音乐视频播放器

    项目背景:一个公共的音乐视频播放器,用户通过上传歌曲或视频分享自己喜欢的音乐和视频,也可以把列表中的音乐或视频添加为喜欢,支持模糊查询等功能. 基本功能: 新用户注册 老用户登录 主界面中能看到当前系 ...

  9. 基于QT的网络音乐播放器(一)

    自学Qt已经有一段时间了,但是始终感觉自己还是很弱(其实并不是感觉自己很弱,是自己本来就很弱,哈哈).自己也照着书上敲了几个例子,但觉得还是要写点东西才能真正运用起来.所以,前段时间就写了个很简单的音 ...

  10. android 无损播放器,山灵公布M6 Pro 安卓无损音乐播放器:骁龙430+4GB内存

    IT之家3月18日消息  今天,山灵在微博中公布了M6 Pro 安卓无损音乐播放器,搭载骁龙 430 CPU和4GB内存,全新屏内R角,AG磨砂钢化玻璃,AK4497EQ DAC *2解码芯片,价格尚 ...

最新文章

  1. CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义
  2. Linux 0.11 实验环境搭建与调试
  3. vue项目使用sass-loader
  4. SAP License:SAP实施Roll out项目经验谈(二)
  5. 【python笔记】:字典类型详解
  6. 实战篇-六十六行完成简洁的Rss输出类
  7. OpenCV --- CAMShift对象跟踪
  8. Unreal Engine UE4虚幻引擎,创建Sky天空球,球天材质,自制天空球(HDR高动态范围贴图)
  9. 无法登录 mysql 服务器_无法登录 MySQL服务器/无法开启 MySQL服务
  10. 克转换成千克怎么算python_斤公斤千克的换算(克和公斤怎么转换)
  11. 苹果手机软件升级密码_苹果iPhone出现闪退解决办法
  12. ThreeJS自带网格线
  13. 服务器硬盘热插拔检测不到,用过这么多年才知道, 原来有的设备是真的不能热插拔的!...
  14. 华为认证HCIA-云服务工程师正式发布
  15. Java之HashTab基本用法
  16. 漫威java_10年漫威,到底有多少角色。
  17. Scala语言学习:Scala是什么?
  18. 简历信息提取二:PaddleNLP完成简历信息抽取
  19. add voom plugin , it's better than tlist
  20. 建筑工程进度的计算机管理,项目进度计划管理软件_项目进度管理系统_建筑工程施工项目管理软件系统_建米软件...

热门文章

  1. python 统计excel表格_利用python对excel计数,并输出结果 python返回excel中sheet的数量...
  2. 单片机中段程序_单片机程序延时方法详细介绍
  3. Qos服务质量与IntServ和DiffServ
  4. 大学生川菜网页制作教程 学生HTML静态美食菜品网页设计作业成品 简单网页制作代码 学生美食网页作品免费设计
  5. 残差分析(残差原理与标准化残差分析)
  6. html5课程总结500字,体育课心得体会500字(精选6篇)
  7. android n 下载地址,android N镜像文件下载地址
  8. ssci源刊里有开源期刊吗_2020年SCI期刊影响因子重磅发布!你投过的期刊涨了吗?...
  9. python蓝牙连接测试_基于python实现蓝牙通信代码实例
  10. linux时区文件格式,干货|理解Linux系统的时区、夏令时