功能:实现音乐播放器的上一首、下一首、播放、暂停功能
平台:Android Studio 3.0.1
直接见代码:
app配置文件
apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion "27.0.3" defaultConfig { applicationId "com.example.lenovo.design3application" minSdkVersion 21 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' implementation 'com.android.support:support-v4:27.1.1' }
//注意要导入v4:27.1.1包
相应的.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lenovo.design3application"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> //添加访问sd卡权限 <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
MyFilter.java类:
ackage com.example.lenovo.design3application; import java.io.File; import java.io.FilenameFilter; /** * Created by lenovo on 2018/4/22. */ public class MyFilter implements FilenameFilter { private String type; public MyFilter(String type){ //构造函数 this.type = type; } @Override //实现FilenameFilter接口accept()方法 public boolean accept(File dir, String name) { //dir当前目录, name文件名 return name.endsWith(type); //返回true的文件则合格 } }
activity_main.xml: //里面的图片自行改换
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="horizontal"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/bgpic" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="100dp" android:orientation="horizontal"> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="上一首" /> <ImageButton android:id="@+id/btn_pause" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:src="@drawable/begin" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="下一首" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="300dp" android:orientation="horizontal"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> </LinearLayout>
MainActivity.java
package com.example.lenovo.design3application; import android.Manifest; import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.StrictMode; import android.support.v4.app.ActivityCompat; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ImageButton; import android.widget.ListView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.util.ArrayList; public class MainActivity extends Activity { MediaPlayer mp=new MediaPlayer(); String song_path=""; int i=1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ActivityCompat.checkSelfPermission( MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ) { ActivityCompat.requestPermissions(MainActivity.this, new String[] { Manifest.permission.READ_EXTERNAL_STORAGE }, 123); return; } if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); } //两个if用来解决android 6.0 7.0 权限问题 ArrayList<String> list = new ArrayList<String>(); //音乐列表 File sdpath= Environment.getExternalStorageDirectory(); //获得手机SD卡路径 File path=new File(sdpath+"//mp3//"); //获得SD卡的mp3文件夹 //返回以.mp3结尾的文件 (自定义文件过滤) File[ ] songFiles = path.listFiles( new MyFilter(".mp3") ); for (File file :songFiles){ list.add( file.getAbsolutePath() ); //获取文件的绝对路径 } ArrayAdapter<String> adapter = new ArrayAdapter<String>( MainActivity.this, android.R.layout.simple_list_item_single_choice, list ); ListView li=(ListView)findViewById(R.id.listView); li.setAdapter(adapter); li.setChoiceMode(ListView.CHOICE_MODE_SINGLE); //单选 li.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { song_path=((TextView)view).getText().toString(); try{ mp.reset(); //重置 mp.setDataSource(song_path); mp.prepare(); //准备 mp.start(); //播放 }catch (Exception e){ } } }); final ImageButton btnpause=(ImageButton)findViewById(R.id.btn_pause); btnpause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if( song_path.isEmpty() ) Toast.makeText(getApplicationContext(), "先选收歌曲先听听", Toast.LENGTH_SHORT).show(); if( mp.isPlaying() ){ mp.pause(); //暂停 btnpause.setImageResource(R.drawable.stop); }else if( !song_path.isEmpty() ){ mp.start(); //继续播放 btnpause.setImageResource(R.drawable.begin); } } }); Button bt2=(Button)findViewById(R.id.button1); bt2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if( mp.isPlaying() ) mp.pause(); i--; ArrayList<String> list1 = new ArrayList<String>(); //音乐列表 File sdpath= Environment.getExternalStorageDirectory(); //获得手机SD卡路径 File path=new File(sdpath+"//mp3//"); //获得SD卡的mp3文件夹 //返回以.mp3结尾的文件 (自定义文件过滤) File[ ] songFiles = path.listFiles( new MyFilter(".mp3") ); for (File file :songFiles){ list1.add( file.getAbsolutePath() ); //获取文件的绝对路径 } if(i<0) i=list1.size()-1; song_path=(String) list1.get(i); try{ mp.reset(); //重置 mp.setDataSource(song_path); mp.prepare(); //准备 mp.start(); //播放 }catch (Exception e){ } } }); Button bt3=(Button)findViewById(R.id.button3); bt3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if( mp.isPlaying() ) mp.pause(); i++; ArrayList<String> list1 = new ArrayList<String>(); //音乐列表 File sdpath= Environment.getExternalStorageDirectory(); //获得手机SD卡路径 File path=new File(sdpath+"//mp3//"); //获得SD卡的mp3文件夹 //返回以.mp3结尾的文件 (自定义文件过滤) File[ ] songFiles = path.listFiles( new MyFilter(".mp3") ); for (File file :songFiles){ list1.add( file.getAbsolutePath() ); //获取文件的绝对路径 } if(i>=list1.size()) i=0; song_path=(String) list1.get(i); try{ mp.reset(); //重置 mp.setDataSource(song_path); mp.prepare(); //准备 mp.start(); //播放 }catch (Exception e){ } } }); } @Override protected void onDestroy() { super.onDestroy(); if(mp!=null ){ mp.stop(); mp.release(); } Toast.makeText(getApplicationContext(), "退出啦", Toast.LENGTH_SHORT).show(); } }
运行效果见截图:

本人在自己android 6.0 手机上运行,没问题,建议在自己手机上运行
如果能用,希望各位给个赞,点下关注