热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android开发之第一个小项目--我的MP3播放器之主界面的实现(二)

嗯先上两张图~~这里两张图片,第一张是列表界面,也是主界面,能显示歌曲界面个下面的播放栏,播放栏点击能进入第二个界面,也能够控制歌曲的播放个暂停。第二个界面是播放界面,这个界面

嗯 先上两张图~~
);
qq.setMusicUrl("http://music.baidu.com/search?key=" + songList.get(songListPosition).getTitle());
Platform qqq = ShareSDK.getPlatform(MainActivity.this, QQ.NAME);
qqq.setPlatformActionListener(MainActivity.this);
qqq.share(qq);
break;
case R.id.action_settings:
unregisterReceiver(mainReceiver);
Intent intent = new Intent(MainActivity.this,MusicPlayService.class);
stopService(intent);
isRealDestroy = true;
MainActivity.this.finish();

break;

}
if (!msg.equals("")) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
return true;
}
});
// getSupportActionBar().setDisplayHomeAsUpEnabled(false);左上角那个箭头
values = new ContentValues();
/**
* 这下面的功能是保存当前正在播放的歌曲的信息,因为我写的功能是退出了主界面之后,歌曲在后台播放,
* 但是我一旦点击程序,下面还是能够与显示当前正在播放的歌曲,这个就要保存数据了,所以我先建立了一个数据库,
* 后面换了歌曲的话会把当前播放的歌曲信息在这个数据库中更新,但是,要先这个数据库中有数据才能更新,所以我
* 先往这个数据库中先存入了一个数据,就是列表的第一首歌,好方便后面更新。
*/

int result = DataSupport.count(PlaySong.class);
if (result == 0) {
//当前播放歌曲的实体类
PlaySong playSOng= new PlaySong();
playSong.setId(1);
playSong.setSongPosition(-1);
playSong.setPlaying(false);
playSong.save();
}
/**
* 这是一个加载图片的线程,没一个歌曲都有它的对应图片,这个线程是取出歌曲里面的图片
* ,然后剪切成圆形,给后面使用
*/

if (sOngBitmapThread== null) {
sOngBitmapThread= new SongBitmapThread();
}
//初始化View
createView();
//设置数据
setAdapter();

}

// 通知栏显示当前播放信息
public void showNotification() {
notificatiOnManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.like,
"歌曲:"+songList.get(songListPosition).getTitle() + "--" + "歌手:"+songList.get(songListPosition).getArtist(),
System.currentTimeMillis());

notification.icon = R.drawable.bg;//notification通知栏图标

//自定义布局
cOntentView= new RemoteViews(getPackageName(), R.layout.notification_item);
if (songList.get(songListPosition).getBitmap() == null) {

Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.morenbgsamall);
contentView.setImageViewBitmap(R.id.im, bmp);
} else {
contentView.setImageViewBitmap(R.id.im, songList.get(songListPosition).getBitmap());
}
/**
* 这下面一大段是通知栏上的按键来控制歌曲的播放,
* 这个不懂的话可以去查找下Notification的用法
* prev 前一首
* play 播放or暂停
* next 下一首
*/

contentView.setTextViewText(R.id.notification_title,songList.get(songListPosition).getTitle());
contentView.setTextViewText(R.id.notification_artist,songList.get(songListPosition).getArtist());
Intent noticifitiOnMsg= new Intent(AppControl.NOTIFICATION_ACTION);
noticifitionMsg.putExtra("INTENT_BUTTONID_TAG", "prev");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, noticifitionMsg, PendingIntent.FLAG_CANCEL_CURRENT);
contentView.setOnClickPendingIntent(R.id.last, pendingIntent);

noticifitionMsg.putExtra("INTENT_BUTTONID_TAG", "play");
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(this, 2, noticifitionMsg, PendingIntent.FLAG_CANCEL_CURRENT);
contentView.setOnClickPendingIntent(R.id.now, pendingIntent2);

noticifitionMsg.putExtra("INTENT_BUTTONID_TAG", "next");
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(this, 3, noticifitionMsg, PendingIntent.FLAG_CANCEL_CURRENT);
contentView.setOnClickPendingIntent(R.id.future, pendingIntent3);

notification.cOntentView= contentView;
PendingIntent cOntentIntent= PendingIntent.getActivity(this, 0,
getIntent(), 0);
//notifcation.flags = Notification.FLAG_NO_CLEAR;// 永久在通知栏里
notification.flags = Notification.FLAG_AUTO_CANCEL;
//使用自定义下拉视图时,不需要再调用setLatestEventInfo()方法,但是必须定义contentIntent
notification.cOntentIntent= contentIntent;
notificationManager.notify(123, notification);//123是notification的唯一标识(id)

}


@Override
protected void onPause() {
super.onPause();
}

@Override
protected void onResume() {
super.onResume();

AppControl.JUDGE_DESTORY_ONCREATE += 1;
initSongData();
setPlayData(songListPosition);
}

@Override
public void onStart() {

super.onStart();
mainReceiver = new MainReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(SONG_STATE_UPDATE);
filter.addAction(MUSIC_CURRENT);
filter.addAction(MUSIC_DURATION);
filter.addAction(SONG_STATE_PRESS);
filter.addAction(AppControl.SERVICE_STOP);
registerReceiver(mainReceiver, filter);


}

private void initSongData() {
PlaySong playSOng= DataSupport.find(PlaySong.class, 1);
isPlayingBtn = playSong.isPlaying();//获得播放界面返回来的按键boolean值
long durate = playSong.getDuration();
int current = playSong.getCurrentTime();
int position = playSong.getSongPosition();
if (durate != 0) {
duration = durate;
}
if (current != 0) {
currentTime = current;
}
if (position != -1) {
sOngListPosition= position;
}
if (AppControl.JUDGE_DESTORY_OnCREATE== 0) {
isPlayingBtn = false;
}

if (isPlayingBtn) {
mainPlaySong.setBackgroundResource(R.drawable.play_normal);
} else {
mainPlaySong.setBackgroundResource(R.drawable.play_pressed);
}
}

private void setAdapter() {
//读取图片线程开启
songBitmapThread.run();
if (songList.size() == 0) {
Toast.makeText(MainActivity.this, "您的手机暂无歌曲信息", Toast.LENGTH_SHORT).show();
} else {
//配置歌曲列表适配器
sOngListAdapter= new SongListAdapter(MainActivity.this, songList);
songListView.setAdapter(songListAdapter);
/**
* 这里我要详细的说一下,
* 这里我主要实现了这样一个功能:比如我点击了歌曲A,进入了播放界面,
* 然后点击返回退出了播放界面进入列表界面,我再点击歌曲A,他不会重头开始播放,
* 然后我再点击B歌曲,他开始重头播放B。
*
* 不过这里我传给播放界面的参数我自己感觉有点繁琐,你们可以自己试着省略下
*/

songListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
//点击歌曲进入播放界面
intent = new Intent(MainActivity.this, MusicPlayActivity.class);
/**
* songListPosition 这个表示的是当前正在播放的歌曲position
* 如果,两者相同,那就穿一些后面播放界面需要显示的状态过去,比如当前播放状态,
* 让播放界面的图标能够更新
*/

if (position == songListPosition) {
intent.putExtra("mainCurrentTime", currentTime);
intent.putExtra("isPlaying", isPlayingBtn);
intent.putExtra("MSSG", AppControl.MEDIA_PLAYING_SONG_IS_PLAYING);
intent.putExtra("isOncreate", AppControl.JUDGE_DESTORY_ONCREATE);

} else {
/**
*如果两个值不一样,证明你重新点击了一首歌
* MSSG 传的就和上面不一样了,使后面的播放界面做不同的处理
*/

intent.putExtra("isPlaying", isPlayingBtn);
intent.putExtra("mainCurrentTime", currentTime);
intent.putExtra("isPlaying", true);
intent.putExtra("MSSG", AppControl.MEDIA_PLAYING_SONG_AT_LIST);

}
/**
*
*
*/

intent.putExtra("position", position);
intent.putExtra("duration", songList.get(position).getDuration());
//这里当初图省事,这个传的是歌曲的循环状态,我当初写了个2,就是顺序播放,这个你们需要的可以自己改
intent.putExtra("repeatState", 2);
intent.putExtra("url", songList.get(position).getData());
sOngListPosition= position;
startActivity(intent);
//这个是主页面下面播放栏状态的更换
setPlayData(position);

}
});
}

}

@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {

}

@Override
public void onError(Platform platform, int i, Throwable throwable) {

}

@Override
public void onCancel(Platform platform, int i) {

}

/**
* 开线程存图片
*/

private class SongBitmapThread implements Runnable {
@Override
public void run() {
sOngList= MusicLoader.getInstance(getApplicationContext().getContentResolver()).queryData();
for (int i = 0; i Bitmap bitmap = getBlurBitmap(MusicBitmap.getArtwork(MainActivity.this, songList.get(i).getId(), songList.get(i).getAlbumId(), true, true), MainActivity.this);
songList.get(i).setBitmap(bitmap);
}
}
}

/**
* 设置点击播放时下面播放栏的数据
*/

private void setPlayData(int position) {
songTitlePlay.setText(songList.get(position).getTitle());
songTitleArt.setText(songList.get(position).getArtist());
LogUtil.itSelf.Log("setPlayData" + songList.get(position).getTitle() + songList.get(position).getBitmap());
if (songList.get(position).getBitmap() == null) {

Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.morenbgsamall);
imSongPlaying.setImageBitmap(bmp);
} else {
imSongPlaying.setImageBitmap(songList.get(position).getBitmap());
}

}

public static Bitmap getBlurBitmap(Bitmap rootView, Context context) {
try {
if (rootView == null || cOntext== null) {
return null;
}
Bitmap bgBitmap = Bitmap.createBitmap(rootView);
return GetRoundBitmap.getInstance().getOvalBitmap(bgBitmap);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

private void createView() {
//歌曲列表
sOngList= new ArrayList();
//列表下面那个歌曲显示界面,有图片个按键那个linearlayout
linMainButtom = (LinearLayout) findViewById(R.id.lin_main_buttom);
//控制播放按键
mainPlaySOng= (Button) findViewById(R.id.main_play);
//歌曲列表listveiw
sOngListView= (ListView) findViewById(R.id.song_list);
sOngTitlePlay= (TextView) findViewById(R.id.song_title_play);
sOngTitleArt= (TextView) findViewById(R.id.song_album_play);
imSOngPlaying= (ImageView) findViewById(R.id.im_song_playing);
linMainButtom.setOnClickListener(this);
mainPlaySong.setOnClickListener(this);


}

@Override
protected void onDestroy() {
super.onDestroy();

if(!isRealDestroy){
showNotification();
}
}


/**
* 下面三个按键的点击触发事件
* 这里别看下面这么一大段代码,其实你去掉那些intent就是一点
* 这里主要实现了两个功能
* 1.点击下面的播放栏,能够进入播放界面
* 2.点击按键能控制歌曲的暂停去播放
* 3.AppControl.JUDGE_DESTORY_ONCREATE 这个是一个信号
* 是为了控制当你用菜单栏的形式强行关掉程序时,进来程序的时候,这个点击播放栏界面
* 不但要能进入播放界面,还要让歌曲开始播放,所以加了这么一个控制后面服务开始的功能
* @param v
*/

@Override
public void onClick(View v) {
switch (v.getId()) {

case R.id.main_play:
if (isPlayingBtn) {
Intent intent = new Intent(this, MusicPlayService.class);
intent.setAction("com.verzqli.media.play");
intent.putExtra("MSG", AppControl.MEDIA_PLAYING_SONG_PAUSE);
intent.putExtra("isOncreate", AppControl.JUDGE_DESTORY_ONCREATE);
mainPlaySong.setBackgroundResource(R.drawable.play_pressed);
startService(intent);
isPlayingBtn = false;
} else {
if (AppControl.JUDGE_DESTORY_OnCREATE== 0) {
Intent intent = new Intent(this, MusicPlayService.class);
intent.setAction("com.verzqli.media.play");
intent.putExtra("position", songListPosition);
intent.putExtra("url", songList.get(songListPosition).getData());
intent.putExtra("title", songList.get(songListPosition).getTitle());
intent.putExtra("MSG", AppControl.MEDIA_PLAYING_FIRST_PRESS);
intent.putExtra("progress", 0);
startService(intent);
mainPlaySong.setBackgroundResource(R.drawable.play_normal);
isPlayingBtn = true;
} else {
Intent intent = new Intent(this, MusicPlayService.class);
intent.setAction("com.verzqli.media.play");
intent.putExtra("MSG", AppControl.MEDIA_PLAYING_SONG_CONTINUE);
mainPlaySong.setBackgroundResource(R.drawable.play_normal);
isPlayingBtn = true;
startService(intent);
}
}
values.put("playing", isPlayingBtn);
DataSupport.update(PlaySong.class, values, 1);
break;
case R.id.lin_main_buttom:
intent = new Intent(MainActivity.this, MusicPlayActivity.class);
LogUtil.itSelf.Log("lin_main_buttom" + currentTime);
intent.putExtra("mainCurrentTime", currentTime);
intent.putExtra("isPlaying", isPlayingBtn);
intent.putExtra("MSSG", AppControl.MEDIA_PLAYING_SONG_IS_PLAYING);
intent.putExtra("position", songListPosition);
intent.putExtra("duration", songList.get(songListPosition).getDuration());
intent.putExtra("repeatState", 2);
intent.putExtra("url", songList.get(songListPosition).getData());
intent.putExtra("isOncreate", AppControl.JUDGE_DESTORY_ONCREATE);
startActivity(intent);
break;

}


}

/**
* 广播接收器
* 接受后台服务传过来的信息来更新界面
* 这里没什么,不懂的话可以评论留言,我会回答的
*/

private class MainReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(MUSIC_CURRENT)) { //currentTime代表当前播放的时间
currentTime = intent.getIntExtra("currentTime", -1);
} else if (action.equals(MUSIC_DURATION)) {
duration = intent.getIntExtra("duration", -1);
} else if (action.equals(SONG_STATE_UPDATE)) { //获取Intent中的current消息,current代表当前正在播放的歌曲

sOngListPosition= intent.getIntExtra("currentSongPosition", -1);

setPlayData(songListPosition);
}
if (action.equals(SONG_STATE_PRESS)) {
isPlayingBtn = intent.getBooleanExtra("isPlaying", true);
if (isPlayingBtn) {

mainPlaySong.setBackgroundResource(R.drawable.play_normal);
} else {
mainPlaySong.setBackgroundResource(R.drawable.play_pressed);
}
}if(action.equals(AppControl.SERVICE_STOP)) {
unregisterReceiver(mainReceiver);
Intent service = new Intent(MainActivity.this,MusicPlayService.class);
stopService(service);
isRealDestroy = true;

}
}


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);

return super.onCreateOptionsMenu(menu);
}
}



推荐阅读
  • 程序员如何优雅应对35岁职业转型?这里有深度解析
    本文探讨了程序员在职业生涯中如何通过不断学习和技能提升,优雅地应对35岁左右的职业转型挑战。我们将深入分析当前热门技术趋势,并提供实用的学习路径。 ... [详细]
  • 本文详细介绍了如何在 Android 中使用值动画(ValueAnimator)来动态调整 ImageView 的高度,并探讨了相关的关键属性和方法,包括图片填充后的高度、原始图片高度、动画变化因子以及布局重置等。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 当unique验证运到图片上传时
    2019独角兽企业重金招聘Python工程师标准model:public$imageFile;publicfunctionrules(){return[[[na ... [详细]
  • 如何在WPS中设置标题格式
    本文详细介绍了在WPS Office中设置文档标题的方法,帮助用户掌握高效、专业的文档排版技巧。 ... [详细]
  • 优化Render Texture在RawImage中显示模型的质量
    本文探讨如何通过调整Render Texture的设置,提升UI界面中模型渲染的图片质量。同时,介绍一些替代方法来实现人物选择界面中的模型显示。 ... [详细]
  • 本文记录了作者在学习验证码识别过程中,针对粘连字符分割的探索与实践。通过对多种算法的研究和应用,总结出有效的解决方案,并分享了相关经验和技巧。 ... [详细]
  • NVIDIA Titan RTX深度评测
    NVIDIA的Titan RTX被誉为当前最强大的桌面显卡之一,其卓越的性能和高昂的价格吸引了众多专业人士和技术爱好者的关注。本文将详细介绍Titan RTX的技术规格、性能表现及应用场景。 ... [详细]
  • MySQL Debug 模式的实现与应用
    本文详细介绍了如何启用和使用 MySQL 的调试模式,包括编译选项、环境变量配置以及调试信息的解析。通过实际案例展示了如何利用调试模式解决客户端无法连接服务器的问题。 ... [详细]
  • 多核环境下大规模线性分类的并行对偶坐标下降算法
    本文介绍了一种适用于多核环境的大规模线性分类问题的并行对偶坐标下降算法。该方法通过优化计算资源的分配,显著提高了处理效率和模型性能。论文《Parallel Dual Coordinate Descent Method for Large-scale Linear Classification in Multi-core Environments》详细探讨了这一算法,并提供了实验验证。 ... [详细]
  • 本文介绍了一种根据目标检测结果,从原始XML文件中提取并分析特定类别的方法。通过解析XML文件,筛选出特定类别的图像和标注信息,并保存到新的文件夹中,以便进一步分析和处理。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • PHP 实现无刷新多图上传及远程图片处理
    本文详细介绍了如何使用 PHP 实现网页上的无刷新多图上传功能,同时支持远程图片的下载与处理。文章提供了具体的代码示例,并对关键函数进行了说明。 ... [详细]
  • PC时代的传奇人物
    回顾过去几十年,个人电脑(PC)的发展历程犹如一部英雄史诗。每一位杰出人物都在这一领域留下了不可磨灭的印记,他们的贡献不仅推动了技术的进步,也深刻影响了现代社会的发展。 ... [详细]
  • JMeter接口关联与数据提取:正则表达式和JSON Extractor的使用
    在使用JMeter进行接口测试时,常常需要从前一个接口的响应中提取数据并应用于后续请求。本文将详细介绍如何利用正则表达式提取器(Regular Expression Extractor)和JSON Extractor来实现这一需求。 ... [详细]
author-avatar
sdfa2255204
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有