前言
音乐播放器的设置里当然缺少不了的就是是否允许在移动数据网络下播放嘛~那要怎么实现呢?我的思路如下:
- 首先肯定是写设置的布局,通过一个按钮开关来供用户设置。
- 网络的监听。
- 保存和获取用户的设置状态。
- 给Item设置点击事件
开关按钮
导入依赖
repositories {
mavenCentral()
jcenter()
}
...
dependencies {
compile 'com.github.zcweng:switch-button:0.0.3@aar'
}
编写布局文件
<com.suke.widget.SwitchButton
android:id="@+id/switch_button"
android:layout_width="60dp"
android:layout_height="35dp"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
app:sb_checked="true"
app:sb_uncheckcircle_width="0dp"
app:sb_checked_color="@color/colorPrimary"
/>
风格设置(https://github.com/zcweng/SwitchButton)
<attr name="sb_shadow_radius" format="reference|dimension"/> 阴影半径
<attr name="sb_shadow_offset" format="reference|dimension"/> 阴影偏移
<attr name="sb_shadow_color" format="reference|color"/> 阴影颜色
<attr name="sb_uncheck_color" format="reference|color"/> 关闭颜色
<attr name="sb_checked_color" format="reference|color"/> 开启颜色
<attr name="sb_border_width" format="reference|dimension"/> 边框宽度
<attr name="sb_checkline_color" format="reference|color"/> 开启指示器颜色
<attr name="sb_checkline_width" format="reference|dimension"/> 开启指示器线宽
<attr name="sb_uncheckcircle_color" format="reference|color"/> 关闭指示器颜色
<attr name="sb_uncheckcircle_width" format="reference|dimension"/> 关闭指示器线宽
<attr name="sb_uncheckcircle_radius" format="reference|dimension"/>关闭指示器半径
<attr name="sb_checked" format="reference|boolean"/> 是否选中
<attr name="sb_shadow_effect" format="reference|boolean"/> 是否启用阴影
<attr name="sb_effect_duration" format="reference|integer"/> 动画时间,默认300ms
<attr name="sb_button_color" format="reference|color"/> 按钮颜色
<attr name="sb_show_indicator" format="reference|boolean"/> 是否显示指示器,默认true:显示
<attr name="sb_background" format="reference|color"/> 背景色,默认白色
<attr name="sb_enable_effect" format="reference|boolean"/> 是否启用特效,默认true
网络的监听
单独写一个工具类,获取网络状态
首先要判断当前SDK的版本号,版本号不,获取的方法也不同。最后返回整形,在播放器进行判断当前处于什么状态。
public class NetStateUtil {
private static int i = -1;
public static int getNetWorkState(Context context){
boolean wifi = false;
boolean data = false;
if (Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP){
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo dataInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (!wifiInfo.isConnected()&&dataInfo.isConnected()){
i = 1;
} else if ((wifiInfo.isConnected() && dataInfo.isConnected())||(wifiInfo.isConnected() && !dataInfo.isConnected())) {
i = 2;
} else if (!wifiInfo.isConnected() && !dataInfo.isConnected()){
i = 0;
}
}else {
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//获取所有网络连接的信息
Network[] networks = connMgr.getAllNetworks();
//用于存放网络连接信息
StringBuilder sb = new StringBuilder();
//通过循环将网络信息逐个取出来
for (int j =0; j< networks.length; j++){
//获取ConnectivityManager对象对应的NetworkInfo对象
NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[j]);
Log.i("TAG", "onReceive: "+networkInfo.getTypeName());
if (networkInfo.getTypeName().equals("WIFI")){
wifi = true;
}else if (networkInfo.getTypeName().equals("MOBILE")){
data = true;
}
}
if (!wifi&&data){
i = 1;
}else if ((wifi && data)||(wifi && !data)){
i = 2;
}else if (!wifi && !data){
i = 0;
}
}
return i;
}
}
Activity中注册广播
netState = NetStateUtil.getNetWorkState(getBaseContext());
msgReceiver = new MsgReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(msgReceiver, intentFilter);
public class MsgReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)){
netState = NetStateUtil.getNetWorkState(context);}
if (musicFenAdapter!=null){
musicFenAdapter.setPlay();//其实就是一个notifyDataSetChanged(),更新网络状态后需要重新判断一次是否可点击
}
}
}
最后记得在onDestroy中取消广播
@Override
protected void onDestroy() {
unregisterReceiver(msgReceiver);
super.onDestroy();
}
保存和获取用户的设置状态
绑定开关按钮
编写settingActivity代码,我是用的插件…
@Bind(R.id.switch_button)
SwitchButton switchButton;
判断switchbutton的状态
通过SharedPreferebces来储存状态。SharedPreferences 可以用来进行数据的共享,包括应用程序之间,或者同一个应用程序中的不同组件。比如两个activity除了通过Intent传递数据之外,也可以通过SharedPreferences来共享数据。当保存一条数据时,需要给这条数据提供一个对应的键(其实就是名字啦),读取的时候再通过这个键取出来。
SharedPreferences preferences = getSharedPreferences("setting",MODE_PRIVATE);
//如果没有数据,默认为true switchButton.setChecked(preferences.getBoolean("net",true));
switchButton.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(SwitchButton switchButton, boolean b) {
SharedPreferences.Editor editor = getSharedPreferences("setting",MODE_PRIVATE).edit();
editor.putBoolean("net",b);
editor.apply();
}
});
给Item设置点击事件
修改适配器
在适配器中添加一个抽象方法,将itemView传出。每次Load时都执行一次。
public void load (final MusicFind musicFind){
tvFenleiSinger.setText(musicFind.getSingername());
tvFenleiSong.setText(musicFind.getSongname());
if (musicFind.getId().equals(MusicFindUtil.getInstance().getID())){
tvFenleiSinger.setTextColor(Color.parseColor("#da3318"));
tvFenleiSong.setTextColor(Color.parseColor("#da3318"));
}else
{
tvFenleiSinger.setTextColor(Color.parseColor("#959595"));
tvFenleiSong.setTextColor(Color.parseColor("#000000"));
}
getItemView(itemView,musicFind);
}
protected abstract void getItemView(View itemView,final MusicFind musicFind);
在Activity中实现getItemView()
为其设置点击事件。
musicFenAdapter = new MusicFenAdapter(MusicFindUtil.parseJOSNWithGSON(response, false), getBaseContext()) {
@Override
protected void getItemView(View itemView,final MusicFind musicFind) {
Log.i("netState", "onReceive: 1"+netState);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences preferences = getSharedPreferences("setting",MODE_PRIVATE);
if (netState == 2 || (netState == 1&&preferences.getBoolean("net",true))){
Intent intent = new Intent(MusicListActivity.this, NetMusicActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
Bundle bundle = new Bundle();
bundle.putSerializable("songNetInfo",musicFind);
intent.putExtras(bundle);
startActivity(intent);
}else
{
Toast.makeText(mActivity, "当前网络状态不可以播放网络歌曲哦(;′⌒`)", Toast.LENGTH_SHORT).show();
}}
});
}
};