java主界面
package com.example.musicplayer;
import android.Manifest;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.Toast;
import com.example.musicplayer.seriver.MyService;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private LinearLayout SMLinearLayoutBottom;
private Button SMButtonStart;
private Button SMButtonStop;
private Button SMButtonDown;
private Button SMButtonUp;
private ListView SMListView;
private MediaPlayer mp=new MediaPlayer();
private List<Music> list=new ArrayList<>();
private MyAdapter aaa;
private ServiceConnection sc;
private static MyService.MusicBinder binder;
private int num;
private SeekBar sb;
// public static Handler handler=new Handler(){
// @Override
// public void dispatchMessage(Message msg) {
// super.dispatchMessage(msg);
// if(msg.what==110){
// Log.i(TAG, "dispatchMessage: "+msg.what);
// binder.callStop();
// }
// }
// };
public static Handler han=new Handler( ){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SMLinearLayoutBottom = (LinearLayout) findViewById(R.id.SM_linearLayout_bottom);
SMButtonStart = (Button) findViewById(R.id.SM_button_start);
SMButtonStop = (Button) findViewById(R.id.SM_button_stop);
SMButtonDown = (Button) findViewById(R.id.SM_button_down);
SMButtonUp = (Button) findViewById(R.id.SM_button_up);
SMListView = (ListView) findViewById(R.id.SM_listView);
sb=findViewById(R.id.SM_seekBar);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.pause");
intentFilter.addAction("com.notify.restart");
intentFilter.addAction("com.notify.next");
intentFilter.addAction("com.notify.nav");
MyReceiver myReceiver = new MyReceiver();
registerReceiver(myReceiver,intentFilter);
//开始获取联系人。
readLinkMan( );
SMListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
binder.callStart( position);
num=position;
Toast.makeText(MainActivity.this, ""+num, Toast.LENGTH_SHORT).show();
}
});
Intent it = new Intent(this, MyService.class);
startService(it);
sc=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyService.MusicBinder) service;
// binder.setSB(sb);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//绑定。
bindService(it,sc, Service.BIND_AUTO_CREATE);
// MyNotification myNotification = new MyNotification(this);
// Notification.Builder show = myNotification.show();
// NotificationManager sss = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
// sss.notify(2,show.build());
}
private void readLinkMan() {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},200);
}else{
finish();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if( requestCode==200&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
startRead();
}
}
private void startRead() {
list = MyUtils.MyReader(this);
MyAdapter aaa = new MyAdapter(this, list);
SMListView.setAdapter(aaa);
}
public void click(View view) {
switch( view.getId()){
case R.id.SM_button_start:
binder.callStart(num);
break;
case R.id.SM_button_stop:
binder.callStop();
break;
case R.id.SM_button_down:
binder.callPlayNextMusic();
break;
case R.id.SM_button_up:
binder.callPlayNavSong();
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//解绑
if( sc!=null){
unbindService(sc);
}
}
}
自定义对象
package com.example.musicplayer;
public class Music {
private String title;
private String artist;
private String duration;
private String data;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
@Override
public String toString() {
return "Music{" +
"title='" + title + '\'' +
", artist='" + artist + '\'' +
", duration='" + duration + '\'' +
", data='" + data + '\'' +
'}';
}
}
适配器
package com.example.musicplayer;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseAdapter {
private Context con;
private List list;
private MyId mi;
private int i;
public MyAdapter(Context con, List<Music> list) {
this.con = con;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null){
mi=new MyId();
convertView= LayoutInflater.from(con).inflate(R.layout.my_layout,null);
mi.MLTextId=convertView.findViewById(R.id.ML_text_id);
mi.MLTextTitle = convertView.findViewById(R.id.ML_text_title);
mi.MLTextArtist = convertView.findViewById(R.id.ML_text_artist);
mi.MLTextDuration = convertView.findViewById(R.id.ML_text_duration);
convertView.setTag(mi);
}else{
mi= (MyId) convertView.getTag();
}
i++;
mi.MLTextId.setText(i+"");
mi.MLTextTitle.setText(list.get(position).getTitle());
mi.MLTextArtist.setText(list.get(position).getArtist());
mi.MLTextDuration.setText(list.get(position).getDuration());
return convertView;
}
class MyId{
private TextView MLTextId;
private TextView MLTextTitle;
private TextView MLTextArtist;
private TextView MLTextDuration;
}
}
服务
package com.example.musicplayer;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i(TAG, "onReceive: "+action);
if(action.equals("com.pause")){
Log.i(TAG, "onReceive: "+action);
// MainActivity.handler.sendEmptyMessage(110);
}
}
}
工具类获取手机音频
package com.example.musicplayer;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MyUtils {
public static List<Music> MyReader(Context con){
List<Music> list=new ArrayList<>();
ContentResolver cr = con.getContentResolver();
Uri uri= MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor query = cr.query(uri, new String[]{MediaStore.Video.Media.TITLE,
MediaStore.Video.Media.ARTIST, MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.DATA, MediaStore.Video.Media.SIZE}, null, null, null);
if( query!=null){
while( query.moveToNext()) {
String title = query.getString(query.getColumnIndex(MediaStore.Audio.Media.TITLE));
String artist = query.getString(query.getColumnIndex(MediaStore.Audio.Media.ARTIST));
String size = query.getString(query.getColumnIndex(MediaStore.Audio.Media.SIZE));
String data = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DATA));
String duration = query.getString(query.getColumnIndex(MediaStore.Audio.Media.DURATION));
Music music = new Music();
music.setArtist(artist);
music.setData(data);
int d_second = Integer.parseInt(duration)/1000;
int minute = d_second/60;
int second = d_second%60;
if( second>0&&second<10) {
duration = minute + ":0"+second;
}else if( second>=10&&second<60){
duration=minute+":"+second;
}else{
duration=minute+":00";
}
music.setDuration(duration);
music.setTitle(title);
list.add(music);
Log.i("123321", "MyReader: "+music.toString());
}
}else{
Toast.makeText(con, "查找为空。", Toast.LENGTH_SHORT).show();
}
return list;
}
}
xml
<?xml version="1.0" encoding="utf-8"?><SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:layout_above="@id/SM_linearLayout_bottom"
android:id="@+id/SM_seekBar"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/SM_linearLayout_bottom"
android:orientation="horizontal"
android:layout_alignParentBottom="true"
>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="开始"
android:id="@+id/SM_button_start"
android:onClick="click"
/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="暂停"
android:id="@+id/SM_button_stop"
android:onClick="click"
/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="下一首"
android:id="@+id/SM_button_down"
android:onClick="click"
/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="上一首"
android:id="@+id/SM_button_up"
android:onClick="click"
/>
</LinearLayout>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/SM_listView"
android:layout_above="@id/SM_seekBar"
>
</ListView>