/**
-
控件的监听器
-
@author Administrator
*/
private class ViewOnClickListener implements OnClickListener {
Intent intent = new Intent();
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.previous_music: // 上一首
playBtn.setBackgroundResource(R.drawable.play_selector);
isFirstTime = false;
isPlaying = true;
isPause = false;
previous();
break;
case R.id.repeat_music: // 重复播放
if (repeatState == isNoneRepeat) {
repeat_one();
shuffleBtn.setClickable(false);
repeatState = isCurrentRepeat;
} else if (repeatState == isCurrentRepeat) {
repeat_all();
shuffleBtn.setClickable(false);
repeatState = isAllRepeat;
} else if (repeatState == isAllRepeat) {
repeat_none();
shuffleBtn.setClickable(true);
repeatState = isNoneRepeat;
}
switch (repeatState) {
case isCurrentRepeat: // 单曲循环
repeatBtn
.setBackgroundResource(R.drawable.repeat_current_selector);
Toast.makeText(HomeActivity.this, R.string.repeat_current,
Toast.LENGTH_SHORT).show();
break;
case isAllRepeat: // 全部循环
repeatBtn
.setBackgroundResource(R.drawable.repeat_all_selector);
Toast.makeText(HomeActivity.this, R.string.repeat_all,
Toast.LENGTH_SHORT).show();
break;
case isNoneRepeat: // 无重复
repeatBtn
.setBackgroundResource(R.drawable.repeat_none_selector);
Toast.makeText(HomeActivity.this, R.string.repeat_none,
Toast.LENGTH_SHORT).show();
break;
}
break;
case R.id.play_music: // 播放音乐
if(isFirstTime) {
play();
isFirstTime = false;
isPlaying = true;
isPause = false;
} else {
if (isPlaying) {
playBtn.setBackgroundResource(R.drawable.pause_selector);
intent.setAction(“com.wwj.media.MUSIC_SERVICE”);
intent.putExtra(“MSG”, AppConstant.PlayerMsg.PAUSE_MSG);
startService(intent);
isPlaying = false;
isPause = true;
} else if (isPause) {
playBtn.setBackgroundResource(R.drawable.play_selector);
intent.setAction(“com.wwj.media.MUSIC_SERVICE”);
intent.putExtra(“MSG”, AppConstant.PlayerMsg.CONTINUE_MSG);
startService(intent);
isPause = false;
isPlaying = true;
}
}
break;
case R.id.shuffle_music: // 随机播放
if (isNoneShuffle) {
shuffleBtn
.setBackgroundResource(R.drawable.shuffle_selector);
Toast.makeText(HomeActivity.this, R.string.shuffle,
Toast.LENGTH_SHORT).show();
isNoneShuffle = false;
isShuffle = true;
shuffleMusic();
repeatBtn.setClickable(false);
} else if (isShuffle) {
shuffleBtn
.setBackgroundResource(R.drawable.shuffle_none_selector);
Toast.makeText(HomeActivity.this, R.string.shuffle_none,
Toast.LENGTH_SHORT).show();
isShuffle = false;
isNoneShuffle = true;
repeatBtn.setClickable(true);
}
break;
case R.id.next_music: // 下一首
playBtn.setBackgroundResource(R.drawable.play_selector);
isFirstTime = false;
isPlaying = true;
isPause = false;
next();
break;
case R.id.playing: //正在播放
Mp3Info mp3Info = mp3Infos.get(listPosition);
Intent intent = new Intent(HomeActivity.this, PlayerActivity.class);
intent.putExtra(“title”, mp3Info.getTitle());
intent.putExtra(“url”, mp3Info.getUrl());
intent.putExtra(“artist”, mp3Info.getArtist());
intent.putExtra(“listPosition”, listPosition);
intent.putExtra(“currentTime”, currentTime);
intent.putExtra(“duration”, duration);
intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAYING_MSG);
startActivity(intent);
break;
}
}
}
/**
-
列表点击监听器
-
@author wwj
*/
private class MusicListItemClickListener implements OnItemClickListener {
/**
- 点击列表播放音乐
*/
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
listPosition = position; //获取列表点击的位置
playMusic(listPosition); //播放音乐
}
}
/**
-
上下文菜单显示监听器
-
@author Administrator
*/
public class MusicListItemContextMenuListener implements OnCreateContextMenuListener {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
Vibrator vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(50); //长按振动
musicListItemDialog(); //长按后弹出的对话框
final AdapterView.AdapterContextMenuInfo menuInfo2 = (AdapterView.AdapterContextMenuInfo) menuInfo;
listPosition = menuInfo2.position; //点击列表的位置
}
}
/**
-
填充列表
-
@param mp3Infos
*/
// public void setListAdpter(List<HashMap<String, String>> mp3list) {
// mAdapter = new SimpleAdapter(this, mp3list,
// R.layout.music_list_item_layout, new String[] {“title”,
// “Artist”, “duration” }, new int[] {R.id.music_title,
// R.id.music_Artist, R.id.music_duration });
mMusiclist.setAdapter(mAdapter);
//
// }
/**
- 下一首歌曲
*/
public void next() {
listPosition = listPosition + 1;
if(listPosition <= mp3Infos.size() - 1) {
Mp3Info mp3Info = mp3Infos.get(listPosition);
musicTitle.setText(mp3Info.getTitle());
Intent intent = new Intent();
intent.setAction(“com.wwj.media.MUSIC_SERVICE”);
intent.putExtra(“listPosition”, listPosition);
intent.putExtra(“url”, mp3Info.getUrl());
intent.putExtra(“MSG”, AppConstant.PlayerMsg.NEXT_MSG);
startService(intent);
} else {
listPosition = mp3Infos.size() - 1;
Toast.makeText(HomeActivity.this, “没有下一首了”, Toast.LENGTH_SHORT).show();
}
}
/**
- 上一首歌曲
*/
public void previous() {
listPosition = listPosition - 1;
if(listPosition >= 0) {
Mp3Info mp3Info = mp3Infos.get(listPosition);
musicTitle.setText(mp3Info.getTitle());
Intent intent = new Intent();
intent.setAction(“com.wwj.media.MUSIC_SERVICE”);
intent.putExtra(“listPosition”, listPosition);
intent.putExtra(“url”, mp3Info.getUrl());
intent.putExtra(“MSG”, AppConstant.PlayerMsg.PRIVIOUS_MSG);
startService(intent);
}else {
listPosition = 0;
Toast.makeText(HomeActivity.this, “没有上一首了”, Toast.LENGTH_SHORT).show();
}
}
/**
- 播放音乐
*/
public void play() {
playBtn.setBackgroundResource(R.drawable.play_selector);
Mp3Info mp3Info = mp3Infos.get(listPosition);
musicTitle.setText(mp3Info.getTitle());
Intent intent = new Intent();
intent.setAction(“com.wwj.media.MUSIC_SERVICE”);
intent.putExtra(“listPosition”, 0);
intent.putExtra(“url”, mp3Info.getUrl());
intent.putExtra(“MSG”, AppConstant.PlayerMsg.PLAY_MSG);
startService(intent);
}
/**
- 单曲循环
*/
public void repeat_one() {
Intent intent = new Intent(CTL_ACTION);
intent.putExtra(“control”, 1);
sendBroadcast(intent);
}
/**
- 全部循环
*/
public void repeat_all() {
Intent intent = new Intent(CTL_ACTION);
intent.putExtra(“control”, 2);
sendBroadcast(intent);
}
/**
- 顺序播放
*/
public void repeat_none() {
Intent intent = new Intent(CTL_ACTION);
intent.putExtra(“control”, 3);
sendBroadcast(intent);
}
/**
- 随机播放
*/
public void shuffleMusic() {
Intent intent = new Intent(CTL_ACTION);
intent.putExtra(“control”, 4);
sendBroadcast(intent);
}
/**
- 自定义对话框
*/
public void musicListItemDialog() {
String[] menuItems = new String[]{“播放音乐”,“设为铃声”,“查看详情”};
ListView menuList = new ListView(HomeActivity.this);
menuList.setCacheColorHint(Color.TRANSPARENT);
menuList.setDividerHeight(1);
menuList.setAdapter(new ArrayAdapter(HomeActivity.this, R.layout.context_dialog_layout, R.id.dialogText, menuItems));
menuList.setLayoutParams(new LayoutParams(ConstantUtil.getScreen(HomeActivity.this)[0] / 2, LayoutParams.WRAP_CONTENT));
final CustomDialog customDialog = new CustomDialog.Builder(HomeActivity.this).setTitle(R.string.operation).setView(menuList).create();
customDialog.show();
menuList.setOnItemClickListener( new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
customDialog.cancel();
customDialog.dismiss();
if(position == 0){
playMusic(listPosition);
} else if(position == 1) {
setRing();
} else if(position == 2) {
showMusicInfo(listPosition);
}
}
});
}
/**
-
显示音乐详细信息
-
@param position
*/
private void showMusicInfo(int position) {
Mp3Info mp3Info = mp3Infos.get(position);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.music_info_layout, null);
((TextView) view.findViewById(R.id.tv_song_title)).setText(mp3Info.getTitle());
((TextView) view.findViewById(R.id.tv_song_artist)).setText(mp3Info.getArtist());
((TextView) view.findViewById(R.id.tv_song_album)).setText(mp3Info.getAlbum());
((TextView) view.findViewById(R.id.tv_song_filepath)).setText(mp3Info.getUrl());
((TextView) view.findViewById(R.id.tv_song_duration)).setText(MediaUtil.formatTime(mp3Info.getDuration()));
((TextView) view.findViewById(R.id.tv_song_format)).setText(Contsant.getSuffix(mp3Info.getDisplayName()));
((TextView) view.findViewById(R.id.tv_song_size)).setText(Contsant.formatByteToMB(mp3Info.getSize()) + “MB”);
new CustomDialog.Builder(HomeActivity.this).setTitle(“歌曲详细信息:”).setNeutralButton(“确定”, null).setView(view).create().show();
}
/**
- 设置铃声
*/
protected void setRing() {
RadioGroup rg_ring = new RadioGroup(HomeActivity.this);
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
rg_ring.setLayoutParams(params);
//第一个单选按钮,来电铃声
final RadioButton rbtn_ringtones = new RadioButton(HomeActivity.this);
rbtn_ringtones.setText(“来电铃声”);
rg_ring.addView(rbtn_ringtones, params);
//第二个单选按钮,闹铃铃声
final RadioButton rbtn_alarms = new RadioButton(HomeActivity.this);
rbtn_alarms.setText(“闹铃铃声”);
rg_ring.addView(rbtn_alarms, params);
//第三个单选按钮,通知铃声
final RadioButton rbtn_notifications = new RadioButton(HomeActivity.this);
rbtn_notifications.setText(“通知铃声”);
rg_ring.addView(rbtn_notifications, params);
new CustomDialog.Builder(HomeActivity.this).setTitle(“设置铃声”).setView(rg_ring).setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
dialog.dismiss();
if(rbtn_ringtones.isChecked()) {
try {
//设置来电铃声
setRingtone(listPosition);
} catch (Exception e) {
e.printStackTrace();
}
} else if(rbtn_alarms.isChecked()) {
try {
//设置闹铃
setAlarm(listPosition);
} catch (Exception e) {
e.printStackTrace();
}
} else if(rbtn_notifications.isChecked()) {
try {
//设置通知铃声
setNotifaction(listPosition);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).setNegativeButton(“取消”, null).show();
}
/**
-
设置提示音
-
@param position
*/
protected void setNotifaction(int position) {
Mp3Info mp3Info = mp3Infos.get(position);
File sdfile = new File(mp3Info.getUrl().substring(4));
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, sdfile.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, “audio/*”);
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath());
Uri newUri = this.getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION, newUri);
Toast.makeText( getApplicationContext(),“设置通知铃声成功!”, Toast.LENGTH_SHORT ).show();
}
/**
-
设置闹铃
-
@param position
*/
protected void setAlarm(int position) {
Mp3Info mp3Info = mp3Infos.get(position);
File sdfile = new File(mp3Info.getUrl().substring(4));
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, sdfile.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, “audio/*”);
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】
g-pSzEXpbG-1710819970124)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-az5HUxW3-1710819970125)]
最后
今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司19年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
[外链图片转存中…(img-PwEh4Pra-1710819970125)]
【算法合集】
[外链图片转存中…(img-KTqb7Z60-1710819970125)]
【延伸Android必备知识点】
[外链图片转存中…(img-nN4af7in-1710819970126)]
【Android部分高级架构视频学习资源】
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!