Android开发之音乐播放器

  • 一、效果图
  • 二、主布局文件(activity_music)
  • 三、布局文件(main_music)
  • 四、布局文件(music_list)
  • 五、布局文件(item_layout)
  • 六、drawable中新建btn_bg_selector.xml
  • 七、MusicView1
  • 八、MusicService
  • 九、MusicActivity:通过onClick方法控制着音乐的播放、暂停、继续播放和退出功能。它和MusicService进行绑定连接。在音乐播放时显示歌曲总时长,还有歌曲当前播放时长,控制歌曲进度条的移动。
  • 十、frag1
  • 十一、res包下新建raw包,将准备好的音乐文件复制粘贴到raw中。注意:选择几首自己下载好的音乐文件,命名为music0、music1、music2等,这里歌曲都要是mp3类型的,数量随意。歌曲名的下标是从0开始的,因为代码中我设置的url地址是从0开始的,否则会闪退!!!

我们大家平时长时间打代码的时候肯定会感到疲惫和乏味,这个时候一边播放自己喜欢的音乐,一边继续打代码,心情自然也愉快很多。音乐带给人的听觉享受是无可比拟的,动听的音乐可以愉悦人的身心,让人更加积极地去热爱生活。接下来就教大家如何用Android Studio自己制作一个音乐播放器。

一、效果图

二、主布局文件(activity_music)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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:gravity="center"android:background="@drawable/qb1"android:orientation="vertical"><com.example.CircleImageViewandroid:id="@+id/iv_music"android:layout_width="240dp"android:layout_height="240dp"android:layout_gravity="center_horizontal"android:layout_margin="15dp" /><TextViewandroid:id="@+id/song_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="歌曲名"android:textSize="20sp"/><SeekBarandroid:id="@+id/sb"android:layout_width="match_parent"android:layout_height="wrap_content" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:paddingLeft="8dp"android:paddingRight="8dp"><TextViewandroid:id="@+id/tv_progress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="00:00"/><TextViewandroid:id="@+id/tv_total"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="00:00"/></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_play"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="播放音乐"/><Buttonandroid:id="@+id/btn_pause"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="暂停播放"/><Buttonandroid:id="@+id/btn_continue_play"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="继续播放"/><Buttonandroid:id="@+id/btn_exit"android:layout_width="0dp"android:layout_height="40dp"android:layout_margin="8dp"android:layout_weight="1"android:background="@drawable/btn_bg_selector"android:text="退出"/></LinearLayout></LinearLayout>

三、布局文件(main_music)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MusicView1"android:orientation="vertical"><!--    <LinearLayout--><!--        android:layout_width="match_parent"--><!--        android:layout_height="wrap_content"--><!--        android:orientation="horizontal">--><!--&lt;!&ndash;        <TextView&ndash;&gt;--><!--&lt;!&ndash;            android:layout_width="0dp"&ndash;&gt;--><!--&lt;!&ndash;            android:layout_height="wrap_content"&ndash;&gt;--><!--&lt;!&ndash;            android:layout_weight="1"&ndash;&gt;--><!--&lt;!&ndash;            android:gravity="center"&ndash;&gt;--><!--&lt;!&ndash;            android:text="我喜欢"&ndash;&gt;--><!--&lt;!&ndash;            android:textSize="35dp"/>&ndash;&gt;--><!--    </LinearLayout>--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/menu1"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="歌曲"android:textSize="25dp"/></LinearLayout><FrameLayoutandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="9"></FrameLayout></LinearLayout>

四、布局文件(music_list)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="wrap_content"/></LinearLayout>

五、布局文件(item_layout)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:padding="16dp"><ImageViewandroid:id="@+id/iv"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true"/><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_toRightOf="@+id/iv"android:layout_centerVertical="true"><TextViewandroid:id="@+id/item_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="歌曲"android:textSize="15sp"android:textColor="#000000"/></RelativeLayout>
</RelativeLayout>

六、drawable中新建btn_bg_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"><shape android:shape="rectangle"><corners android:radius="10dp"/><solid android:color="#d4d4d4"/></shape></item><item android:state_pressed="false"><shape android:shape="rectangle"><corners android:radius="10dp"/><solid android:color="#ffffff"/></shape></item>
</selector>

七、MusicView1

package com.example;import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;import com.example.activity.frag1;public class MusicView1 extends AppCompatActivity implements View.OnClickListener {//创建需要用到的控件的变量private TextView tv1;private FragmentManager fm;private FragmentTransaction ft;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_music);//绑定控件tv1=(TextView)findViewById(R.id.menu1);//设置监听器,固定写法tv1.setOnClickListener(this);//若是继承FragmentActivity,fm=getFragmentManger();fm=getSupportFragmentManager();//fm可以理解为Fragment显示的管理者,ft就是它的改变者ft=fm.beginTransaction();//默认情况下就显示frag1ft.replace(R.id.content,new frag1());//提交改变的内容ft.commit();}@Override//控件的点击事件public void onClick(View v){ft=fm.beginTransaction();//切换选项卡switch (v.getId()){case R.id.menu1:ft.replace(R.id.content,new frag1());break;default:break;}ft.commit();}}

八、MusicService

package com.example.bean;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Message;
import com.example.activity.*;
import java.util.Timer;
import java.util.TimerTask;
//这是一个Service服务类
public class MusicService extends Service {//声明一个MediaPlayer引用private MediaPlayer player;//声明一个计时器引用private Timer timer;//构造函数public MusicService() {}@Overridepublic  IBinder onBind(Intent intent){return new MusicControl();}@Overridepublic void onCreate(){super.onCreate();//创建音乐播放器对象player=new MediaPlayer();}//添加计时器用于设置音乐播放器中的播放进度条public void addTimer(){//如果timer不存在,也就是没有引用实例if(timer==null){//创建计时器对象timer=new Timer();TimerTask task=new TimerTask() {@Overridepublic void run() {if (player==null) return;int duration=player.getDuration();//获取歌曲总时长int currentPosition=player.getCurrentPosition();//获取播放进度Message msg= MusicActivity.handler.obtainMessage();//创建消息对象//将音乐的总时长和播放进度封装至bundle中Bundle bundle=new Bundle();bundle.putInt("duration",duration);bundle.putInt("currentPosition",currentPosition);//再将bundle封装到msg消息对象中msg.setData(bundle);//最后将消息发送到主线程的消息队列MusicActivity.handler.sendMessage(msg);}};//开始计时任务后的5毫秒,第一次执行task任务,以后每500毫秒(0.5s)执行一次timer.schedule(task,5,500);}}//Binder是一种跨进程的通信方式public class MusicControl extends Binder{public void play(int i){//String pathUri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/"+"music"+i);try{//重置音乐播放器player.reset();//加载多媒体文件player=MediaPlayer.create(getApplicationContext(),uri);player.start();//播放音乐addTimer();//添加计时器}catch(Exception e){e.printStackTrace();}}//下面的暂停继续和退出方法全部调用的是MediaPlayer自带的方法public void pausePlay(){player.pause();//暂停播放音乐}public void continuePlay(){player.start();//继续播放音乐}public void seekTo(int progress){player.seekTo(progress);//设置音乐的播放位置}}//销毁多媒体播放器@Overridepublic void onDestroy(){super.onDestroy();if(player==null) return;if(player.isPlaying()) player.stop();//停止播放音乐player.release();//释放占用的资源player=null;//将player置为空}
}

九、MusicActivity:通过onClick方法控制着音乐的播放、暂停、继续播放和退出功能。它和MusicService进行绑定连接。在音乐播放时显示歌曲总时长,还有歌曲当前播放时长,控制歌曲进度条的移动。

package com.example.activity;import static java.lang.Integer.parseInt;import android.animation.ObjectAnimator;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import com.example.bean.*;
import com.example.R;public class MusicActivity extends AppCompatActivity implements View.OnClickListener{//进度条private static SeekBar sb;private static TextView tv_progress,tv_total,name_song;//动画private ObjectAnimator animator;private MusicService.MusicControl musicControl;private String name;private Intent intent1,intent2;private MyServiceConn conn;//记录服务是否被解绑,默认没有private boolean isUnbind =false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_music);//获取从frag1传来的信息intent1=getIntent();init();}private void init(){//进度条上小绿点的位置,也就是当前已播放时间tv_progress=(TextView)findViewById(R.id.tv_progress);//进度条的总长度,就是总时间tv_total=(TextView)findViewById(R.id.tv_total);//进度条的控件sb=(SeekBar)findViewById(R.id.sb);//歌曲名显示的控件name_song=(TextView)findViewById(R.id.song_name);//绑定控件的同时设置点击事件监听器findViewById(R.id.btn_play).setOnClickListener(this);findViewById(R.id.btn_pause).setOnClickListener(this);findViewById(R.id.btn_continue_play).setOnClickListener(this);findViewById(R.id.btn_exit).setOnClickListener(this);name=intent1.getStringExtra("name");name_song.setText(name);//创建一个意图对象,是从当前的Activity跳转到Serviceintent2=new Intent(this,MusicService.class);conn=new MyServiceConn();//创建服务连接对象bindService(intent2,conn,BIND_AUTO_CREATE);//绑定服务//为滑动条添加事件监听,每个控件不同果然点击事件方法名都不同sb.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {//这一行注解是保证API在KITKAT以上的模拟器才能顺利运行,也就是19以上@RequiresApi(api = Build.VERSION_CODES.KITKAT)@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {//进当滑动条到末端时,结束动画if (progress==seekBar.getMax()){animator.pause();//停止播放动画}}@Override//滑动条开始滑动时调用public void onStartTrackingTouch(SeekBar seekBar) {}@Override//滑动条停止滑动时调用public void onStopTrackingTouch(SeekBar seekBar) {//根据拖动的进度改变音乐播放进度int progress=seekBar.getProgress();//获取seekBar的进度musicControl.seekTo(progress);//改变播放进度}});//声明并绑定音乐播放器的iv_music控件ImageView iv_music=(ImageView)findViewById(R.id.iv_music);String position= intent1.getStringExtra("position");//praseInt()就是将字符串变成整数类型int i=parseInt(position);iv_music.setImageResource(frag1.icons[i]);//rotation和0f,360.0f就设置了动画是从0°旋转到360°animator=ObjectAnimator.ofFloat(iv_music,"rotation",0f,360.0f);animator.setDuration(10000);//动画旋转一周的时间为10秒animator.setInterpolator(new LinearInterpolator());//匀速animator.setRepeatCount(-1);//-1表示设置动画无限循环}//handler机制,可以理解为线程间的通信,我获取到一个信息,然后把这个信息告诉你,就这么简单public static Handler handler=new Handler(){//创建消息处理器对象//在主线程中处理从子线程发送过来的消息@Overridepublic void handleMessage(Message msg){Bundle bundle=msg.getData();//获取从子线程发送过来的音乐播放进度//获取当前进度currentPosition和总时长durationint duration=bundle.getInt("duration");int currentPosition=bundle.getInt("currentPosition");//对进度条进行设置sb.setMax(duration);sb.setProgress(currentPosition);//歌曲是多少分钟多少秒钟int minute=duration/1000/60;int second=duration/1000%60;String strMinute=null;String strSecond=null;if(minute<10){//如果歌曲的时间中的分钟小于10strMinute="0"+minute;//在分钟的前面加一个0}else{strMinute=minute+"";}if (second<10){//如果歌曲中的秒钟小于10strSecond="0"+second;//在秒钟前面加一个0}else{strSecond=second+"";}//这里就显示了歌曲总时长tv_total.setText(strMinute+":"+strSecond);//歌曲当前播放时长minute=currentPosition/1000/60;second=currentPosition/1000%60;if(minute<10){//如果歌曲的时间中的分钟小于10strMinute="0"+minute;//在分钟的前面加一个0}else{strMinute=minute+" ";}if (second<10){//如果歌曲中的秒钟小于10strSecond="0"+second;//在秒钟前面加一个0}else{strSecond=second+" ";}//显示当前歌曲已经播放的时间tv_progress.setText(strMinute+":"+strSecond);}};//用于实现连接服务,比较模板化,不需要详细知道内容class MyServiceConn implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service){musicControl=(MusicService.MusicControl) service;}@Overridepublic void onServiceDisconnected(ComponentName name){}}//判断服务是否被解绑private void unbind(boolean isUnbind){//如果解绑了if(!isUnbind){musicControl.pausePlay();//音乐暂停播放unbindService(conn);//解绑服务}}@RequiresApi(api = Build.VERSION_CODES.KITKAT)@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.btn_play://播放按钮点击事件String position=intent1.getStringExtra("position");int i=parseInt(position);musicControl.play(i);animator.start();break;case R.id.btn_pause://暂停按钮点击事件musicControl.pausePlay();animator.pause();break;case R.id.btn_continue_play://继续播放按钮点击事件musicControl.continuePlay();animator.start();break;case R.id.btn_exit://退出按钮点击事件unbind(isUnbind);isUnbind=true;finish();break;}}@Overrideprotected void onDestroy(){super.onDestroy();unbind(isUnbind);//解绑服务}
}

十、frag1

package com.example.activity;import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;import androidx.fragment.app.Fragment;import com.example.R;public class frag1 extends Fragment {private View view;//创建歌曲的String数组和歌手图片的int数组public String[] name={"韦礼安——女孩","盛哲——在你的身边","王心凌——爱你","郭正正——你的眼睛像星星","张碧晨——光的方向","周杰伦——稻香","买辣椒也用券——起风了","梦然——少年","郑鱼/国风新语——怎叹","周杰伦——给我一首歌的时间","李常超——盗墓笔记.十年人间"};public static int[] icons={R.drawable.by12,R.drawable.by1,R.drawable.by4,R.drawable.by7,R.drawable.by5,R.drawable.by8,R.drawable.by10,R.drawable.by6,R.drawable.by11,R.drawable.by2,R.drawable.yb1};@Overridepublic View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){//绑定布局,只不过这里是用inflate()方法view=inflater.inflate(R.layout.music_list,null);//创建listView列表并且绑定控件ListView listView=view.findViewById(R.id.lv);//实例化一个适配器MyBaseAdapter adapter=new MyBaseAdapter();//列表设置适配器listView.setAdapter(adapter);//列表元素的点击监听器listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//创建Intent对象,参数就是从frag1跳转到MusicActivityIntent intent=new Intent(frag1.this.getContext(), MusicActivity.class);//将歌曲名和歌曲的下标存入Intent对象intent.putExtra("name",name[position]);intent.putExtra("position",String.valueOf(position));//开始跳转startActivity(intent);}});return view;}//这里是创建一个自定义适配器,可以作为模板class MyBaseAdapter extends BaseAdapter{@Overridepublic int getCount(){return  name.length;}@Overridepublic Object getItem(int i){return name[i];}@Overridepublic long getItemId(int i){return i;}@Overridepublic View getView(int i ,View convertView, ViewGroup parent) {//绑定好VIew,然后绑定控件View view=View.inflate(frag1.this.getContext(),R.layout.item_layout,null);TextView tv_name=view.findViewById(R.id.item_name);ImageView iv=view.findViewById(R.id.iv);//设置控件显示的内容,就是获取的歌曲名和歌手图片tv_name.setText(name[i]);iv.setImageResource(icons[i]);return view;}}}

十一、res包下新建raw包,将准备好的音乐文件复制粘贴到raw中。注意:选择几首自己下载好的音乐文件,命名为music0、music1、music2等,这里歌曲都要是mp3类型的,数量随意。歌曲名的下标是从0开始的,因为代码中我设置的url地址是从0开始的,否则会闪退!!!

运行效果和功能很完整,至此完成了音乐播放器的实现,喜欢的小伙伴可以自己动手做一下,放上自己喜欢的爱豆照片,还有喜欢的歌,体验感真的不要太好!

Android开发之音乐播放器相关推荐

  1. Android开发之音乐播放器所遇到的问题

    首先,我先声明一下:我的Android Studio是最新版的(2019.11.16) 我要说的是在Android Studio创建一个音乐播放器所遇到的问题 我借鉴的是<Android移动开发 ...

  2. android开发音乐播放器,Android开发简易音乐播放器

    这里介绍一个简易的音乐播放器,供大家参考,具体内容如下 效果图如下: 但是,由于这是一个简易版的音乐播放器,所播放的音乐只有一首,且被写死,但,操作却十分简单,方便理解! 这是代码的主要设计: 音乐主 ...

  3. 基于Android开发的音乐播放器小程序带后端(附带学习源码)

    实现一个简单的播放器,要求功能有:播放.暂停.停止.退出功能,按停止键会重置封面转角,进度条和播放按钮:按退出键将停止播放并退出程序. 后台播放功能,按手机的返回键和home键都不会停止播放,而是转入 ...

  4. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  5. 张利国,龚海平,王植萌.android移动开发入门与进阶,开题报告-基于Android的手机音乐播放器的设计与实现.doc...

    盐城师范学院 毕业设计开题报告 题 目: 基于android的手机音乐播放器 的设计与实现 姓 名: 二级学院: 信息工程学院 专 业: 软件工程 班 级: 12(1) 学 号: 指导教师: 职称: ...

  6. Android应用开发--MP3音乐播放器Service实现

    Android应用开发--MP3音乐播放器Service实现 2013年5月29日简.美音乐播放器开发记录 让网友们久等啦,关于简.美音乐播放器的开发,最重要的Service类总算是要发博了.关于An ...

  7. Android应用开发 MP3音乐播放器滚动歌词实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  8. Android应用开发--MP3音乐播放器代码实现(一)

    Android应用开发--MP3音乐播放器代码实现(一) 需求1:将内存卡中的MP3音乐读取出来并显示到列表当中 1. 从数据库中查询所有音乐数据,保存到List集合当中,List当中存放的是Mp3I ...

  9. [内附完整源码和文档] 基于Android的手机音乐播放器的设计与实现

    摘 要 随着Android系统和移动互联网的快速崛起,手机已经成为人们生活不可缺的一部分,在现代人的生活中,人们生活节奏的加快,生活压力越来越大,碎片化的时间越来越多,那么一个可以在碎片化的时间内调节 ...

  10. android音乐播放器实现,Android实现简单音乐播放器(MediaPlayer)

    Android实现简单音乐播放器(MediaPlayer),供大家参考,具体内容如下 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个 ...

最新文章

  1. 漫画:什么是计数排序?
  2. 《智源社区周刊:预训练模型》第3期:智源x清华开源万亿AI模型基石FastMoE、英国机构发起世界最大图灵测试...
  3. Java开发微信之菜单不显示
  4. http://code.svnspot.com/ 免费代码托管
  5. 最好的MATLAB入门教程
  6. python键盘控制_python实现键盘控制鼠标移动
  7. 科学道德与学风-2021雨课堂答案-第9章
  8. bug解决 2021-09-20 build之后出现shader消失的原因之一
  9. ORB_原理与源码解析
  10. 旅游行业数字化进程分析——2023年元旦与春节,旅游市场开启复苏模式,跨省游热度上升
  11. 华为mate30如何开启USB网络共享
  12. (PL2303)Prolific usb-to-serial在WIN7, WIN8和WIN10上驱动的问题
  13. 读Spring的源代码五:AutoWired是如何实现注入的
  14. 咖说丨清华姚班/智班2020级新生来了!中国奥数新晋“一姐”在列
  15. Jenkins开发之——SCM日程表配置
  16. ISCA 2018 论文 部分(一)
  17. python subprocess 异步
  18. 展程科技CTO妻子发文控诉总裁 360搜索独家揭秘涉事企业信息
  19. 利用Python进行百度文库内容爬取(二)——自动点击预览全文并爬取
  20. 面试 | 软通动力技术面

热门文章

  1. 计算机汇编语言教程pdf,汇编语言实践教程.pdf
  2. linux操作系统有哪些
  3. 「面试」TCP/IP常见攻击
  4. LaTex 论文排版(1): Win10 下 LaTex所需软件安装 (Tex live 2018 + Tex studio)
  5. 计算机系统下的审计系统,独立审计具体准则第20号——计算机信息系统环境下的审计...
  6. 软件平台与中间技术复习
  7. 迅雷:游移的4亿用户帝国
  8. Ubuntu10.04使用HP LaserJetPro P1606dn
  9. 自动化构建工作流--gulp
  10. 一维卷积神经网络应用,二维卷积神经网络原理