实例介绍
【实例简介】
【实例截图】
【核心代码】
package com.arist.MusicPlayer; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Timer; import java.util.TimerTask; import com.arist.R; import com.arist.Adapter.FolderAdapter; import com.arist.Adapter.MainGridAdapter; import com.arist.Adapter.MusicAdapter; import com.arist.Adapter.MyPagerAdapter; import com.arist.Adapter.NetMusicAdapter; import com.arist.PopMenu.PopupMenu; import com.arist.PopMenu.PopupMenuBodyAdapter; import com.arist.PopMenu.PopupWindowSearch; import com.arist.biz.ButtonInfoBiz; import com.arist.biz.MusicBiz; import com.arist.dao.MusicDao; import com.arist.dao.MusicFolderDao; import com.arist.entity.BaiduMp3; import com.arist.entity.ButtonInfo; import com.arist.entity.Music; import com.arist.entity.MusicFolder; import com.arist.entity.NetMusic; import com.arist.service.MusicDownloadService; import com.arist.util.AlbumPicUtil; import com.arist.util.BitmapService; import com.arist.util.Constant; import com.arist.util.FavMusicXmlUtil; import com.arist.util.HttpService; import com.arist.util.MainGridPreference; import com.arist.util.SettingScreen; import com.arist.util.TimeFormat; import com.arist.util2.BaiduMp3Util; import com.arist.util2.DownloadMusicUtil; import com.arist.util2.NetMusicXmlParseTask; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.AlertDialog.Builder; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences.Editor; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.View.OnTouchListener; import android.view.Window; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.GridView; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; /* * Copyright (C) 2012 @2yuanma.com * Email: i2yuanma@163.com * 更多移动终端源码: www.2yuanma.com * */ /** * 主界面的控制器 * */ public class MainActivity extends Activity { // initData() private int screenWidth; private MusicBiz musicBiz; private MusicDao musicDao; private MusicFolderDao folderDao; private String commontItemTexts[] = new String[8]; private int currentPageIndex = 0; private ArrayList<Music> musics; // 适配给 Adapter 的数据集 private ArrayList<MusicFolder> folders; private ArrayList<ButtonInfo> infos; private ButtonInfoBiz buttonInfoBiz; private MusicAdapter musicAdapter; // Adapter private FolderAdapter folderAdapter; private MainGridAdapter mainGridAdapter; private NetMusicAdapter netMusicAdapter; private MainGridPreference mainPref; public void initData(){ musicDao = new MusicDao(this); folderDao = new MusicFolderDao(this); musicBiz = new MusicBiz(this); // 以下两句不应该有 musicBiz.setMusicDao(musicDao); musicBiz.setFolderDao(folderDao); mainPref = new MainGridPreference(this); commontItemTexts = this.getResources().getStringArray(R.array.popmenu_options_text); screenWidth = this.getWindowManager().getDefaultDisplay().getWidth(); playModeEntries = getResources().getStringArray(R.array.play_mode_entries); // 获取整形资源数组 TypedArray ta = getResources().obtainTypedArray(R.array.popmenu_values); for(int i=0;i<commonItemIds.length;i ){ commonItemIds[i] = ta.getResourceId(i, 0); } // 初始化MainButton界面 infos = new ArrayList<ButtonInfo>(); buttonInfoBiz = new ButtonInfoBiz(this); infos = buttonInfoBiz.getButtonInfos(); mainGridAdapter = new MainGridAdapter(this, infos); // 初始化FolderList界面 folders = new ArrayList<MusicFolder>(); folders = folderDao.getAllFolder(); folderAdapter = new FolderAdapter(this, folders); // 初始化MusicList界面 musics = new ArrayList<Music>(); if(folders.size()>0) musics = musicDao.getMusic(folders.get(0).getPath()); musicAdapter = new MusicAdapter(this, musics); } // initView() private int commonItemIds[] = new int[8]; private PopupMenu popMenu = null; private PopupMenuBodyAdapter commonAdapter = null; private PopupWindowSearch popupWindowSearch = null; private static final int TYPE_FOLDER = 2; private static final int TYPE_MUSIC = 3; private ViewPager vpContainer = null; private LayoutInflater inflater; private MyPagerAdapter vpAdapter; private ArrayList<View> vpViews = new ArrayList<View>(); private RelativeLayout layout; private GridView gv; private ListView listViewFolder; private ListView listViewMusic; private FrameLayout netMusicLayout; private ListView listViewNetMusic; private static final int VP_BUTTONGRID = 0; private static final int VP_FOLDERLIST = 1; private static final int VP_MUSICLIST = 2; private static final int VP_NETMUSICLIST = 3; public void initView(){ // 用于设置背景 layout = (RelativeLayout)findViewById(R.id.main_layout); inflater = LayoutInflater.from(this); // 初始化三个界面 gv = (GridView)inflater.inflate(R.layout.grid_view_button, null); gv.setColumnWidth(screenWidth/3); listViewFolder = (ListView)inflater.inflate(R.layout.list_view_music, null); listViewFolder.setFastScrollEnabled(true); listViewMusic = (ListView)inflater.inflate(R.layout.list_view_music, null); listViewMusic.setFastScrollEnabled(true); gv.setAdapter(mainGridAdapter); gv.setOnItemClickListener(new OnItemClickListenerMain()); listViewFolder.setAdapter(folderAdapter); listViewFolder.setOnItemClickListener(new OnItemClickListenerFolder()); listViewMusic.setAdapter(musicAdapter); listViewMusic.setOnItemClickListener(new OnItemClickListenerMusic()); listViewMusic.setOnItemLongClickListener(new OnItemLongClickListenerMusic()); // 创建ViewPager对象 vpContainer = (ViewPager)findViewById(R.id.vpContainer); vpContainer.setFocusable(true); // 初始化几个界面 vpViews.add((View)gv); vpViews.add((View)listViewFolder); vpViews.add((View)listViewMusic); this.popMenu = new PopupMenu(this, 0xbb000000, new PopupBodyOnItemClickListenerCallback()); this.commonAdapter = new PopupMenuBodyAdapter(this, this.commonItemIds, this.commontItemTexts); this.popMenu.setPopupMenuBodyAdapter(this.commonAdapter) ; this.popupWindowSearch = new PopupWindowSearch(this, handler); } // updateView() private int selectedButtonId = Constant.folderButtonSelected; //默认选中文件夹 private void updateView(int type){ switch (type) { // 更新文件夹界面 case TYPE_FOLDER: // 选中不同按钮时会出现不同的文件夹 switch(selectedButtonId){ case Constant.albumButtonSelected: folders = musicDao.getTempAlbums(); handler.postDelayed(new Runnable() { public void run() { folders = musicDao.getAlbums(); folderAdapter.changeData(folders); } }, 200); break; case Constant.artistButtonSelected: folders = musicDao.getTempArtists(); handler.postDelayed(new Runnable() { public void run() { folders = musicDao.getArtists(); folderAdapter.changeData(folders); } }, 200); break; case Constant.folderButtonSelected: folders = folderDao.getAllFolder(); break; } folderAdapter.changeData(folders); vpContainer.setCurrentItem(VP_FOLDERLIST, true); break; // 更新音乐列表界面,只需更新数据 case TYPE_MUSIC: // 选中不同按钮时会出现不同的歌曲列表 switch(selectedButtonId){ case Constant.allMusicButtonSelected: musics = musicDao.getAllMusic(); break; case Constant.favritorButtonSelected: try { musics = FavMusicXmlUtil.getFavMusic(); mainPref.saveFav(musics.size()); } catch (Exception e) { e.printStackTrace(); } break; case Constant.recentAddButtonSelected: musics = musicBiz.getRecentAddMusic(); break; case Constant.musicFolderSelected: break; case Constant.downloadButtonSelected: // 下载的歌曲 try{ musics = musicDao.getMusic(Constant.BASE_DOWNLOAD_PATH.substring( 0, Constant.BASE_DOWNLOAD_PATH.length()-1)); // Log.i("info", "download musics size:" musics.size()); }catch(Exception e){} break; } sortMusicList(musics); musicAdapter.changeData(musics); vpContainer.setCurrentItem(VP_MUSICLIST, true); break; } } private void sortMusicList(ArrayList<Music> musics) { Collections.sort(musics, new Comparator<Music>() { public int compare(Music m1, Music m2) { if(m1.getTitle().compareTo(m2.getTitle()) > 0){ return 1; }else{ return -1; } } }); } private ImageButton btnNext; private ImageButton btnPre; private ImageButton btnPlay; private ImageView ivAlbum; private ProgressBar musicProgressMain; private TextView controlPanelTitleMain; private TextView controlPanelArtistMain; private Animation anim; private Handler handler; private Timer seekTimer; private boolean seeking = false; private Button btnLocalMusic,btnRemoteMusic; private ImageView iv_comp1,iv_comp2,iv_comp3,iv_comp4; private ImageView[] comps; private ImageView ivNetMusicLoading; private EditText etNetMusicSearch; private void initListener(){ iv_comp1 = (ImageView)findViewById(R.id.iv_comp1); iv_comp2 = (ImageView)findViewById(R.id.iv_comp2); iv_comp3 = (ImageView)findViewById(R.id.iv_comp3); iv_comp4 = (ImageView)findViewById(R.id.iv_comp4); comps = new ImageView[]{iv_comp1,iv_comp2,iv_comp3,iv_comp4}; // Log.i("info", "the size of comps = " comps.length); btnNext = (ImageButton)findViewById(R.id.btnNext); btnPre = (ImageButton)findViewById(R.id.btnPrevious); btnPlay = (ImageButton)findViewById(R.id.btnPlay); ivAlbum = (ImageView)findViewById(R.id.controlPanelAlbumPicMain); musicProgressMain = (ProgressBar)findViewById(R.id.musicProgressMain); controlPanelTitleMain = (TextView)findViewById(R.id.controlPanelTitleMain); controlPanelArtistMain = (TextView)findViewById(R.id.controlPanelArtistMain); btnLocalMusic = (Button)findViewById(R.id.btnLocalMusic); btnRemoteMusic = (Button)findViewById(R.id.btnRemoteMusic); // 本地歌曲 btnLocalMusic.setOnClickListener(new OnClickListener() { public void onClick(View v) { vpContainer.setCurrentItem(VP_BUTTONGRID, true); } }); // 远程歌曲 btnRemoteMusic.setOnClickListener(new OnClickListener() { public void onClick(View v) { try { if(vpViews.size() < 4){ netMusicLayout = (FrameLayout)inflater.inflate(R.layout.list_view_net_music, null); ivNetMusicLoading = (ImageView)netMusicLayout.findViewById(R.id.iv_net_music_loading); listViewNetMusic = (ListView)netMusicLayout.findViewById(R.id.lv_net_music); listViewNetMusic.setFastScrollEnabled(true); listViewNetMusic.setHeaderDividersEnabled(true); View header = inflater.inflate(R.layout.net_music_list_search, null); etNetMusicSearch = (EditText)header.findViewById(R.id.et_net_music_search); ImageButton btnNetMusicSearch = (ImageButton)header.findViewById(R.id.net_music_search_btn); btnNetMusicSearch.setOnClickListener(new btnNetMusicSearchOnClickListener()); listViewNetMusic.addHeaderView(header); netMusicAdapter = new NetMusicAdapter(MainActivity.this, null, listViewNetMusic); listViewNetMusic.setAdapter(netMusicAdapter); listViewNetMusic.setOnItemClickListener(new OnItemClickListenerNetMusic()); listViewNetMusic.setOnItemLongClickListener(new OnItemLongClickListenerNetMusic()); vpViews.add((View)netMusicLayout); vpAdapter.notifyDataSetChanged(); vpContainer.setCurrentItem(VP_NETMUSICLIST,true); // 发送消息开始动画 Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = startAnim; handler.sendMessage(msg); // 开始执行 xml 异步解析的任务 NetMusicXmlParseTask task = new NetMusicXmlParseTask(MainActivity.this); task.execute(HttpService.BASE_URL "sounds.xml"); } if(listViewNetMusic.getAdapter().getCount() < 5){ Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = startAnim; handler.sendMessage(msg); // 开始执行 xml 异步解析的任务 NetMusicXmlParseTask task = new NetMusicXmlParseTask(MainActivity.this); task.execute(HttpService.BASE_URL "sounds.xml"); } vpContainer.setCurrentItem(VP_NETMUSICLIST); } catch (Exception e) { e.printStackTrace(); } } }); // 单击下一首的操作 btnNext.setOnClickListener(new OnClickListener() { public void onClick(View v) { doPlayNext(); } }); // 长按下一首的操作 btnNext.setOnLongClickListener(new OnLongClickListener() { public boolean onLongClick(View v) { seekTimer = new Timer(); seekTimer.schedule(new TimerTask() { int i = 1; public void run() { Message msg = handler.obtainMessage(); msg.what = Constant.SEEK_UPDATE_NEXT; Bundle bundle = new Bundle(); bundle.putInt("text", i ); msg.setData(bundle); handler.sendMessage(msg); } }, 0, 100); seeking = true; return true; } }); btnNext.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if(MotionEvent.ACTION_UP == event.getAction()){ if(seekTimer != null){ seekTimer.cancel(); Intent intent = new Intent(Constant.ACTION_SEEK); intent.putExtra("seekProgress", seekProgress); sendBroadcast(intent); seeking = false; } } return false; } }); // 单击上一首的操作 btnPre.setOnClickListener(new OnClickListener() { public void onClick(View v) { doPlayPre(); } }); // 长按上一首的操作 btnPre.setOnLongClickListener(new OnLongClickListener() { public boolean onLongClick(View v) { seekTimer = new Timer(); seekTimer.schedule(new TimerTask() { int i = 1; public void run() { Message msg = handler.obtainMessage(); msg.what = Constant.SEEK_UPDATE_PRE; Bundle bundle = new Bundle(); bundle.putInt("text", i ); msg.setData(bundle); handler.sendMessage(msg); } }, 0, 100); seeking = true; return true; } }); btnPre.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if(MotionEvent.ACTION_UP == event.getAction()){ if(seekTimer != null){ seekTimer.cancel(); Intent intent = new Intent(Constant.ACTION_SEEK); intent.putExtra("seekProgress", seekProgress); sendBroadcast(intent); seeking = false; } } return false; } }); // 播放按钮的操作 btnPlay.setOnClickListener(new OnClickListener() { public void onClick(View v) { doPlay(); } }); ivAlbum.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 写一个震动的动画,添加动画监听然后跳转界面 anim = AnimationUtils.loadAnimation(MainActivity.this, R.anim.vibrate); ivAlbum.startAnimation(anim); anim.setAnimationListener(new AnimationListener() { public void onAnimationStart(Animation animation) {} public void onAnimationRepeat(Animation animation) {} public void onAnimationEnd(Animation animation) { Intent intent = new Intent(MainActivity.this,MusicPlayActivity.class); startActivity(intent); overridePendingTransition(R.anim.right_in, R.anim.left_out); } }); } }); vpContainer.setOnPageChangeListener(new OnPageChangeListener() { public void onPageSelected(int position) { // Log.i("info", "currentPageIndex:" position); currentPageIndex = position; if(currentPageIndex == VP_BUTTONGRID){ infos = buttonInfoBiz.getButtonInfos(); mainGridAdapter.setData(infos); mainGridAdapter.notifyDataSetChanged(); } final int totalPage = vpViews.size(); final int[] positions = new int[]{0,0,0,0}; for(int i=0;i<totalPage;i ){ if(i == currentPageIndex) positions[i] = 1; } // Log.i("info", "onPageSelected" Thread.currentThread().getName()); // Log.i("info", positions[0] ",," positions[1] ",," positions[2] ",,"); setComps(totalPage, positions); new Thread(){ public void run() { }; }.start(); } public void onPageScrolled(int arg0, float arg1, int arg2) {} public void onPageScrollStateChanged(int arg0) {} }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { PackageManager pm = getPackageManager(); ResolveInfo homeInfo = pm.resolveActivity(new Intent (Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), 0); switch(keyCode){ case KeyEvent.KEYCODE_BACK: // Log.i("info", "currentPageIndex:" currentPageIndex "view:" vpContainer.getChildAt(currentPageIndex)); if(currentPageIndex == 0){ // 按返回键退出界面后,会在后台运行 ActivityInfo ai = homeInfo.activityInfo; Intent startIntent = new Intent(Intent.ACTION_MAIN); startIntent.addCategory(Intent.CATEGORY_LAUNCHER); startIntent.setComponent(new ComponentName(ai.packageName, ai.name)); startActivitySafely(startIntent); return true; } currentPageIndex = (--currentPageIndex < 0) ? 0 : currentPageIndex; if(currentPageIndex == 1) folderAdapter.notifyDataSetChanged(); vpContainer.setCurrentItem(currentPageIndex, true); return true; case KeyEvent.KEYCODE_MENU: // Log.i("info", "KEYCODE_MENU IS CALLED"); if(popMenu.isShowing()) popMenu.dismiss(); else showPopupMenu(); return true; } return super.onKeyDown(keyCode, event); } private void startActivitySafely(Intent intent) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); try { startActivity(intent); } catch (ActivityNotFoundException e) { } catch (SecurityException e) {} } // 主界面 ImageButton 的 OnClick 事件 class OnItemClickListenerMain implements OnItemClickListener{ public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) { // 1,2,3 显示文件夹界面 0,4,5,6,7 显示音乐文件界面 switch(position){ case 1: //歌手 selectedButtonId = Constant.artistButtonSelected; updateView(TYPE_FOLDER); break; case 2: //专辑 selectedButtonId = Constant.albumButtonSelected; updateView(TYPE_FOLDER); break; case 3: //文件夹 selectedButtonId = Constant.folderButtonSelected; updateView(TYPE_FOLDER); break; /****************************************************/ case 0: //全部歌曲 selectedButtonId = Constant.allMusicButtonSelected; updateView(TYPE_MUSIC); break; case 4: //我的最爱 try { selectedButtonId = Constant.favritorButtonSelected; updateView(TYPE_MUSIC); } catch (Exception e) { e.printStackTrace();} break; case 5: //最近添加 mainPref.saveAdd(musicBiz.getRecentAddMusic().size()); selectedButtonId = Constant.recentAddButtonSelected; updateView(TYPE_MUSIC); break; case 6: //下载管理 mainPref.saveDownload(musicDao.getMusic(Constant.BASE_DOWNLOAD_PATH. substring(0,Constant.BASE_DOWNLOAD_PATH.length()-1)).size()); selectedButtonId = Constant.downloadButtonSelected; updateView(TYPE_MUSIC); break; default: break; } } } // 文件夹界面的Item被单击 class OnItemClickListenerFolder implements OnItemClickListener{ public void onItemClick(AdapterView<?> listView, View view, int position, long id) { MusicFolder folder = (MusicFolder)(folderAdapter.getItem(position)); // 区分是文件夹、artist、album if("artist".equals(folder.getPath())){ musics = musicDao.getMusicsByArtist(folder.getName()); }else if("album".equals(folder.getPath())){ musics = musicDao.getMusicsByAlbumId(folder.getId()); }else{ musics = musicDao.getMusic(folder.getPath()); } selectedButtonId = Constant.musicFolderSelected; // Log.i("info", "size of musics:" musics.size()); updateView(TYPE_MUSIC); } } // 音乐文件被单击 class OnItemClickListenerMusic implements OnItemClickListener{ public void onItemClick(AdapterView<?> adapter, View view, int position,long id) { MyApplication.getInstance().setMusicList(musics); // Log.i("info", "after setMusicList(), the size in Main and App is:" musics.size() ";" MyApplication.musicList.size()); // for(Music music : MyApplication.musicList){ // Log.i("info", "music title--" music.getTitle()); // } MyApplication.setCurrentPosition(position); sendBroadcast(new Intent(Constant.ACTION_PLAY)); // 这里要添加改变item的操作 // 根据设置决定是否跳转到播放界面 if(MyApplication.defaultPref.getBoolean("switch_playing_interface", false)){ Intent intent = new Intent(MainActivity.this,MusicPlayActivity.class); startActivity(intent); overridePendingTransition(R.anim.right_in, R.anim.left_out); } musicAdapter.notifyDataSetChanged(); } } // netMusic item被单击 private NetMusic currentNetMusic; class OnItemClickListenerNetMusic implements OnItemClickListener{ public void onItemClick(AdapterView<?> arg0, View arg1, int position,long id) { currentNetMusic = (NetMusic)netMusicAdapter.getItem(position); // 如果该文件已存在,则发送消息会主线程并结束本次下载 String musicPath = currentNetMusic.getMusicPath(); String savePath = Constant.BASE_DOWNLOAD_PATH musicPath.substring(musicPath.lastIndexOf("/") 1); // 如果已下载则直接播放 if (new File(savePath).exists()) { try{ MyApplication.mediaPlayer.reset(); MyApplication.mediaPlayer.setDataSource(savePath); MyApplication.mediaPlayer.prepare(); MyApplication.mediaPlayer.start(); MyApplication.currentMusic = musicDao.getMusicByPath(savePath); sendBroadcast(new Intent(Constant.ACTION_MUSIC_CHANGED)); }catch(Exception e){} }else showDialog(DIALOG_NET_MUSIC_CONFIRM); } } // netMusic item被长按 class OnItemLongClickListenerNetMusic implements OnItemLongClickListener{ public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int position, long id) { currentNetMusic = (NetMusic)netMusicAdapter.getItem(position-1); showDialog(DIALOG_NET_MUSIC_OP); return true; } } // music item 被长按 class OnItemLongClickListenerMusic implements OnItemLongClickListener{ public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int position, long id) { selMusic = (Music)musicAdapter.getItem(position); showDialog(DIALOG_MUSIC); return true; } } // 歌曲详情 private class OnClickListenerMusicDetail implements OnClickListener{ public void onClick(View v) { showDialog(DIALOG_MUEIC_DETAIL); dismissDialog(DIALOG_MUSIC); removeDialog(DIALOG_MUSIC); } } // 将歌曲设为最爱 private class OnClickListenerMusicLove implements OnClickListener{ public void onClick(View v) { // 保存最爱 Toast.makeText(MainActivity.this, "已设为最爱", Toast.LENGTH_SHORT).show(); new Thread(){ public void run() { try { ArrayList<Music> musics; musics = FavMusicXmlUtil.getFavMusic(); if(musics.contains(selMusic)) return; musics.add(selMusic); FavMusicXmlUtil.saveFavMusic(musics); mainPref.saveFav(musics.size()); } catch (Exception e) { e.printStackTrace(); } }; }.start(); dismissDialog(DIALOG_MUSIC); removeDialog(DIALOG_MUSIC); } } // 移除歌曲 private class OnClickListenerMusicRemove implements OnClickListener{ public void onClick(View v) { musicDao.deleteMusic(selMusic.getId()); dismissDialog(DIALOG_MUSIC); removeDialog(DIALOG_MUSIC); musics.remove(selMusic); musicAdapter.notifyDataSetChanged(); } } // 修改歌曲信息 private class OnClickListenerMusicUpdate implements OnClickListener{ public void onClick(View v) { showDialog(DIALOG_MUEIC_EDIT); dismissDialog(DIALOG_MUSIC); removeDialog(DIALOG_MUSIC); } } // 取消按钮 private class OnClickListenerMusicCancel implements OnClickListener{ public void onClick(View v) { dismissDialog(DIALOG_MUSIC); removeDialog(DIALOG_MUSIC); } } private int seekProgress = 0; private static final int startAnim = 0; private static final int stopAnim = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); MyApplication.getInstance().addActivity(this); // 处理消息 handler = new Handler(){ public void handleMessage(Message msg) { int i = 0; switch(msg.what){ // 快进 case Constant.SEEK_UPDATE_NEXT: i = msg.getData().getInt("text"); if(i == 1){ seekProgress = MyApplication.mediaPlayer.getCurrentPosition(); // Log.i("info", "快进前,进度是" seekProgress); } seekProgress = (seekProgress i*200) > MyApplication.getMusicDuration() ? MyApplication.getMusicDuration() : (seekProgress i*200); musicProgressMain.setProgress(seekProgress*1000/MyApplication.getMusicDuration()); break; // 快退 case Constant.SEEK_UPDATE_PRE: i = msg.getData().getInt("text"); if(i == 1){ seekProgress = MyApplication.mediaPlayer.getCurrentPosition(); // Log.i("info", "快退前,进度是" seekProgress); } seekProgress = (seekProgress - i*200) < 0 ? 0 : (seekProgress - i*200); musicProgressMain.setProgress(seekProgress*1000/MyApplication.getMusicDuration()); break; case Constant.NET_MUSIC_LOADING: // 0表示开始动画 if(msg.arg1 == startAnim){ ivNetMusicLoading.setVisibility(1); ivNetMusicLoading.startAnimation(AnimationUtils. loadAnimation(MainActivity.this, R.anim.loading)); }else{ ivNetMusicLoading.setVisibility(-1); ivNetMusicLoading.clearAnimation(); } break; // 搜索歌曲 case Constant.MUSIC_LIST_SEARCH: String searchStr = String.valueOf(msg.obj); musics = musicDao.getAllMusic(); vpContainer.setCurrentItem(VP_MUSICLIST); ArrayList<Music> musicList = new ArrayList<Music>(); for(int j=0;j<musics.size();j ){ if(musics.get(j).getTitle().toLowerCase().contains(searchStr) || musics.get(j).getArtist().toLowerCase().contains(searchStr)){ musicList.add(musics.get(j)); } } musics = musicList; musicAdapter.changeData(musicList); break; // 搜索在线歌曲 case Constant.NET_MUSIC_SEARCH: Log.i("info", "更新网络界面"); int size = baiduMp3Infos.size(); Log.i("info", "size:" size); try{ if(size > 0){ /** * 将将 BaiduMp3 伪装成 NetMusic后, * 使用同样的适配器去显示 */ ArrayList<NetMusic> netMusics = BaiduMp3Util.turnBaiduMp3ToNetMusic(baiduMp3Infos); netMusicAdapter.changeData(netMusics); } }catch(Exception e){} break; } super.handleMessage(msg); } }; initData(); initView(); initListener(); vpAdapter = new MyPagerAdapter(vpViews); vpContainer.setAdapter(vpAdapter); } private MyReciever reciever; @Override protected void onStart() { super.onStart(); } @Override protected void onResume() { layout.setBackgroundResource(MyApplication.getWallpaperId()); reciever = new MyReciever(); IntentFilter filter = new IntentFilter(); filter.addAction(Constant.ACTION_MEDIAPLAYER_INFO); filter.addAction(Constant.ACTION_MUSIC_CHANGED); filter.addAction(Constant.ACTION_STATUS_CHANGED); filter.addAction(Constant.ACTION_UPDATE_NETMUEIC_VIEW); filter.addAction(Constant.ACTION_NET_MUSIC_BUFFERING); // filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); registerReceiver(reciever, filter); IntentFilter filter2 = new IntentFilter(); filter2.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED); filter2.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); filter2.addDataScheme("file"); registerReceiver(reciever, filter2); musics = MyApplication.getInstance().getmusicList(); updateView(); // Log.i("info", "MainActivity--onResume()--musics size:" musics.size()); // 如果是播放界面启动,则跳转到当前列表界面 if(MyApplication.showList == true){ MyApplication.showList = false; musicAdapter.changeData(musics); vpContainer.setCurrentItem(VP_MUSICLIST,true); // 跳转到当前在播放的歌曲 if(MyApplication.getCurrentPosition() < musicAdapter.getCount()) this.listViewMusic.setSelection(MyApplication.getCurrentPosition()); } super.onResume(); } @Override protected void onPause() { // Log.i("info", "MainActivity--onPause()"); this.unregisterReceiver(reciever); super.onPause(); } @Override protected void onStop() { // Log.i("info", "MainActivity--onStop()"); super.onStop(); } @Override protected void onRestart() { // Log.i("info", "onRestart()"); // Log.i("info", "MainActivity--onRestart()--musics size:" musics.size()); super.onRestart(); } @Override protected void onDestroy() { if(netMusicAdapter != null) netMusicAdapter.quit(); Intent intent = new Intent(Constant.ACTION_DESTORY); MainActivity.this.sendBroadcast(intent); popMenu.dismiss(); MyApplication.musicPref.savePosition(MyApplication.currentPosition); MyApplication.musicPref.saveProgress(MyApplication.getMusicProgress()); MyApplication.musicPref.saveData(MyApplication.getMusicData()); MyApplication.musicPref.savePlayMode(MyApplication.playMode); MyApplication.getInstance().exit(); // Log.i("info", "保存进度"); super.onDestroy(); } private void showPopupMenu() { this.popMenu.dismiss(); this.popMenu.showAtLocation(listViewFolder, Gravity.BOTTOM,0, 0); } private Timer sleepTimer; private boolean isSleepOpened = false; private int sleepTime; private String[] playModeEntries = new String[4]; private class PopupBodyOnItemClickListenerCallback implements OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Log.i("info", "" position); // 0-3:设置、睡眠、换肤、退出 4-7:播放模式、更新列表、查找、关于 switch(position){ case 0: startActivity(new Intent(MainActivity.this,SettingScreen.class)); break; case 1: // 设置可以启动和关闭睡眠模式 if(!isSleepOpened){ final View sleepView = inflater.inflate(R.layout.sleep_dialog, null); final EditText et = (EditText)sleepView.findViewById(R.id.et_sleep_text); et.setText("" MyApplication.defaultPref.getInt("sleep_time", 15)); Dialog dialog = new AlertDialog.Builder(MainActivity.this).setTitle("请输入睡眠时间(分钟)") .setIcon(R.drawable.ic_menu_sleep_mode_default) .setCancelable(true) .setView(sleepView) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { sleepTime = Integer.parseInt(et.getText().toString().trim()); Editor edit = MyApplication.defaultPref.edit(); edit.putInt("sleep_time", sleepTime).commit(); // Log.i("info", "睡眠时间:" sleepTime); final long sleepTimeMillis = sleepTime*60*1000 System.currentTimeMillis(); sleepTimer = new Timer(); sleepTimer.schedule(new TimerTask() { public void run() { // Log.i("info", "一分钟过去了"); if(System.currentTimeMillis() > sleepTimeMillis){ // Log.i("info", "时间到,睡觉鸟!"); sendBroadcast(new Intent(Constant.ACTION_START_SLEEP)); MainActivity.this.finish(); sleepTimer.cancel(); } } }, 0, 60*1000); isSleepOpened = true; Toast.makeText(MainActivity.this, "亲,将在" sleepTime "分钟后启动睡眠模式!", Toast.LENGTH_SHORT).show(); } }).setNegativeButton("取消",null) .create(); dialog.show(); }else{ isSleepOpened = false; sleepTimer.cancel(); Toast.makeText(MainActivity.this, "睡眠模式已取消", Toast.LENGTH_LONG).show(); } break; case 2: startActivity(new Intent(MainActivity.this, SkinSetting.class)); break; case 3: MyApplication.timer.cancel(); MainActivity.this.sendBroadcast(new Intent(Constant.ACTION_START_SLEEP)); MainActivity.this.finish(); break; case 4: Dialog dialog = new AlertDialog.Builder(MainActivity.this) .setTitle("请选择播放模式") .setCancelable(true) .setNegativeButton("取消",null) .setSingleChoiceItems(playModeEntries, MyApplication.playMode - 1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { int playModeTemp = which 1; MyApplication.playMode = playModeTemp; MyApplication.musicPref.savePlayMode(playModeTemp); dialog.dismiss(); } }).create(); dialog.show(); break; case 5: // 刷新列表 Intent ii = new Intent(MainActivity.this, ScanMusicActivity.class); startActivity(ii); break; case 6: popupWindowSearch.showAtLocation(listViewMusic, Gravity.TOP,0, 35); break; case 7: // Intent i = new Intent(MainActivity.this, AboutActivity.class); // startActivity(i); Intent i = new Intent(MainActivity.this, AboutDialog.class); startActivity(i); break; } MainActivity.this.popMenu.dismiss(); } } private class MyReciever extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 收到更新进度条的信息 if(Constant.ACTION_MEDIAPLAYER_INFO.equals(intent.getAction())){ int currentTime = intent.getIntExtra("musicProgress", 0); if(!seeking){ musicProgressMain.setProgress(currentTime*1000/MyApplication.getMusicDuration()); } }else if(Constant.ACTION_MUSIC_CHANGED.equals(intent.getAction())){ controlPanelTitleMain.setText(MyApplication.getMusicTitle()); controlPanelArtistMain.setText(MyApplication.getMusicArtist()); musicAdapter.notifyDataSetChanged(); }else if(Constant.ACTION_STATUS_CHANGED.equals(intent.getAction())){ updateView(); }else if(Constant.ACTION_UPDATE_NETMUEIC_VIEW.equals(intent.getAction())){ downloadMusicName = intent.getStringExtra("name"); Toast.makeText(MainActivity.this, downloadMusicName "下载完成", Toast.LENGTH_LONG).show(); mainPref.saveDownload(DownloadMusicUtil.getDownloadMusicsCount()); Uri uri = Uri.parse("file://" Environment.getExternalStorageDirectory() .getAbsolutePath()); Intent i = new Intent(Intent.ACTION_MEDIA_MOUNTED, uri); sendBroadcast(i); if(netMusicAdapter != null) netMusicAdapter.notifyDataSetChanged(); }else if(Constant.ACTION_NET_MUSIC_BUFFERING.equals(intent.getAction())){ Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = stopAnim; handler.sendMessage(msg); }else if(Intent.ACTION_MEDIA_SCANNER_FINISHED.equals(intent.getAction())){ String _data = Constant.BASE_DOWNLOAD_PATH downloadMusicName; try{ Music music = musicBiz.getMusicByData(_data); musicDao.insertMusic(music); }catch(Exception e){} } } } private String downloadMusicName; private void updateView(){ controlPanelTitleMain.setText(MyApplication.getMusicTitle()); controlPanelArtistMain.setText(MyApplication.getMusicArtist()); musicProgressMain.setProgress(MyApplication.getMusicProgress()*1000/MyApplication.getMusicDuration()); // 更新播放按钮状态 if(MyApplication.status == Constant.STATUS_PLAYING) btnPlay.setImageResource(R.drawable.control_pause); else btnPlay.setImageResource(R.drawable.control_play); // 更新专辑图片 String str = AlbumPicUtil.getAlbumArt(MainActivity.this,"" MyApplication.getMusicAlbumId()); if(str == null) ivAlbum.setImageResource(R.drawable.album_default); else{ Bitmap bmp = BitmapService.getBitmap(str, 90, 90); if(bmp == null) ivAlbum.setImageResource(R.drawable.album_default); else ivAlbum.setImageBitmap(bmp); } Intent intent = new Intent(Constant.ACTION_ALBUM_PIC_CHANGED); intent.putExtra("album_pic_path", str); sendBroadcast(intent); } private void doPlay(){ Intent intent = new Intent(); intent.setAction(Constant.ACTION_PLAY); MainActivity.this.sendBroadcast(intent); // Log.i("info", "MusicPlayActivity 发送 ACTION_PLAY 广播..."); } private void doPlayPre(){ Intent intent = new Intent(); intent.setAction(Constant.ACTION_PREVIOUS); MainActivity.this.sendBroadcast(intent); // Log.i("info", "MusicPlayActivity 发送 ACTION_PREVIOUS 广播..."); } private void doPlayNext(){ Intent intent = new Intent(); intent.setAction(Constant.ACTION_NEXT); // Log.i("info", "MusicPlayActivity 发送 ACTION_NEXT 广播..."); MainActivity.this.sendBroadcast(intent); } private void setComps(int pageCount, int[] position){ if(pageCount == 3){ for(int i=0;i<pageCount;i ){ // Log.i("info", Thread.currentThread().getName()); // Log.i("info", "comps:" comps[i].toString()); if(position[i]==1) comps[i].setImageResource(R.drawable.p_day); else comps[i].setImageResource(R.drawable.p_night); } }else{ for(int i=0;i<pageCount;i ){ if(position[i]==1) comps[i].setImageResource(R.drawable.p_day); else comps[i].setImageResource(R.drawable.p_night); } } } // 更新在线歌曲界面 public void updateView(ArrayList<NetMusic> netMusics) { netMusicAdapter.changeData(netMusics); Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = stopAnim; handler.sendMessage(msg); } /* * 托管对话框 1、重写activity的两个方法: onCreateDialog(int id)、onPrepareDialog(int id,Dialog dialog) 2、在需要时调用: showDialog(int id) 、dismissDialog(int id) 、removeDialog(int id) * */ private static final int DIALOG_MUSIC = 1; private static final int DIALOG_MUEIC_DETAIL = 2; private static final int DIALOG_MUEIC_EDIT = 3; private static final int DIALOG_NET_MUSIC_CONFIRM = 4; private static final int DIALOG_NET_MUSIC_OP = 5; private Music selMusic; @Override protected Dialog onCreateDialog(int id) { switch(id){ // 本地歌曲操作 case DIALOG_MUSIC: View view = inflater.inflate(R.layout.music_dialog, null); // 设置按钮监听 view.findViewById(R.id.btn_music_detail).setOnClickListener(new OnClickListenerMusicDetail()); view.findViewById(R.id.btn_music_love).setOnClickListener(new OnClickListenerMusicLove()); view.findViewById(R.id.btn_music_remove).setOnClickListener(new OnClickListenerMusicRemove()); view.findViewById(R.id.btn_music_update).setOnClickListener(new OnClickListenerMusicUpdate()); view.findViewById(R.id.btn_music_cancel).setOnClickListener(new OnClickListenerMusicCancel()); // 创建对话框 Dialog dialog = new AlertDialog.Builder(MainActivity.this) .setTitle(selMusic.getTitle()) .setIcon(R.drawable.ic_menu_about_default) .setCancelable(true) .setView(view) .create(); return dialog; // 查看歌曲详情对话框 case DIALOG_MUEIC_DETAIL: View view1 = inflater.inflate(R.layout.music_dialog_detail, null); ((TextView)view1.findViewById(R.id.tv_music_detail_name)).setText("歌曲 : " selMusic.getTitle()); ((TextView)view1.findViewById(R.id.tv_music_detail_album)).setText("专辑 : " selMusic.getAlbum()); ((TextView)view1.findViewById(R.id.tv_music_detail_artist)).setText("歌手 : " selMusic.getArtist()); ((TextView)view1.findViewById(R.id.tv_music_detail_path)).setText("路径 : " selMusic.getData()); ((TextView)view1.findViewById(R.id.tv_music_detail_size)).setText("大小 : " TimeFormat.sizeFormat(selMusic.getSize())); ((TextView)view1.findViewById(R.id.tv_music_detail_duration)).setText("时长 : " TimeFormat.timeFormat(selMusic.getDuration())); // 编辑歌曲信息 view1.findViewById(R.id.btn_music_detail_edit).setOnClickListener(new OnClickListener() { public void onClick(View v) { showDialog(DIALOG_MUEIC_EDIT); dismissDialog(DIALOG_MUEIC_DETAIL); removeDialog(DIALOG_MUEIC_DETAIL); } }); view1.findViewById(R.id.btn_music_detail_cancel).setOnClickListener(new OnClickListener() { public void onClick(View v) { dismissDialog(DIALOG_MUEIC_DETAIL); removeDialog(DIALOG_MUEIC_DETAIL); } }); Dialog dialog1 = new AlertDialog.Builder(MainActivity.this) .setTitle(selMusic.getTitle()) .setIcon(R.drawable.ic_menu_about_default) .setCancelable(true) .setView(view1) .create(); return dialog1; // 编辑歌曲信息对话框 case DIALOG_MUEIC_EDIT: View view2 = inflater.inflate(R.layout.music_dialog_edit, null); final EditText etName = (EditText)view2.findViewById(R.id.et_music_detail_name); final EditText etAlbum = (EditText)view2.findViewById(R.id.et_music_detail_album); final EditText etArtist = (EditText)view2.findViewById(R.id.et_music_detail_artist); etName.setText(selMusic.getTitle()); etAlbum.setText(selMusic.getAlbum()); etArtist.setText(selMusic.getArtist()); // 保存修改后的信息 view2.findViewById(R.id.btn_save_music_info).setOnClickListener(new OnClickListener() { public void onClick(View v) { selMusic.setTitle(etName.getText().toString()); selMusic.setAlbum(etAlbum.getText().toString()); selMusic.setArtist(etArtist.getText().toString()); musicDao.updateMusic(selMusic); musicAdapter.notifyDataSetChanged(); dismissDialog(DIALOG_MUEIC_EDIT); removeDialog(DIALOG_MUEIC_EDIT); } }); view2.findViewById(R.id.btn_cancel_music_info).setOnClickListener(new OnClickListener() { public void onClick(View v) { dismissDialog(DIALOG_MUEIC_EDIT); removeDialog(DIALOG_MUEIC_EDIT); } }); Dialog dialog2 = new AlertDialog.Builder(MainActivity.this) .setCancelable(true) .setTitle(selMusic.getTitle()) .setIcon(R.drawable.ic_menu_about_default) .setView(view2) .create(); return dialog2; // 确认播放网络歌曲 case DIALOG_NET_MUSIC_CONFIRM: Dialog dialog3 = new Builder(MainActivity.this).setTitle("确认") .setIcon(android.R.drawable.ic_dialog_info) .setCancelable(true) .setMessage("确认播放网络歌曲吗?") .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dismissDialog(DIALOG_NET_MUSIC_CONFIRM); removeDialog(DIALOG_NET_MUSIC_CONFIRM); } }) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(Constant.ACTION_NET_PLAY); intent.putExtra("netMusic", currentNetMusic); sendBroadcast(intent); try{ Music music = new Music(); music.setAlbum(currentNetMusic.getAlbum()); music.setArtist(currentNetMusic.getSinger()); music.setDuration(TimeFormat.timeFormat(currentNetMusic.getDuration())); music.setTitle(currentNetMusic.getName()); MyApplication.currentMusic = music; }catch(Exception e){} Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = startAnim; handler.sendMessage(msg); Toast.makeText(MainActivity.this, "正在缓冲", Toast.LENGTH_LONG).show(); } }) .create(); return dialog3; // 对网络歌曲进行操作 case DIALOG_NET_MUSIC_OP: View view3 = inflater.inflate(R.layout.dialog_net_music_op, null); Button btnDetail = (Button)view3.findViewById(R.id.btn_net_music_detail); Button btnDownload = (Button)view3.findViewById(R.id.btn_net_music_download); btnDetail.setOnClickListener(new OnClickListener() { public void onClick(View v) { Dialog dialog5 = new AlertDialog.Builder(MainActivity.this).setIcon(android.R.drawable.ic_dialog_info) .setTitle("歌曲详情").setMessage(currentNetMusic.toString()) .setCancelable(true) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).create(); dialog5.show(); dismissDialog(DIALOG_NET_MUSIC_OP); removeDialog(DIALOG_NET_MUSIC_OP); } }); btnDownload.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(MainActivity.this, "开始下载", Toast.LENGTH_LONG).show(); String uri = HttpService.BASE_URL currentNetMusic.getMusicPath(); Intent intent = new Intent(MainActivity.this,MusicDownloadService.class); intent.putExtra("uri", uri); startService(intent); dismissDialog(DIALOG_NET_MUSIC_OP); removeDialog(DIALOG_NET_MUSIC_OP); } }); Dialog dialog4 = new Builder(MainActivity.this) .setIcon(android.R.drawable.ic_dialog_info) .setCancelable(true).setTitle("操作") .setView(view3) .setNegativeButton("返回", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dismissDialog(DIALOG_NET_MUSIC_OP); removeDialog(DIALOG_NET_MUSIC_OP); } }) .create(); return dialog4; } return super.onCreateDialog(id); } @Override protected void onPrepareDialog(int id, Dialog dialog) { super.onPrepareDialog(id, dialog); } /** * 网络歌曲搜索按钮事件监听 * @author ARIST */ private boolean searchThreadRunning = false; private ArrayList<BaiduMp3> baiduMp3Infos = new ArrayList<BaiduMp3>(); private class btnNetMusicSearchOnClickListener implements OnClickListener{ public void onClick(View v) { final String text = etNetMusicSearch.getText().toString(); if(text == null || "".equals(text.trim())) return ; // 正在搜索,不能重复 if(searchThreadRunning) return ; new Thread(){ public void run() { searchThreadRunning = true; Log.i("info", "run"); try { Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = startAnim; handler.sendMessage(msg); baiduMp3Infos = BaiduMp3Util.getBaiduMp3ByKeyWord(text); } catch (Exception e) { e.printStackTrace(); } // 发消息取消动画 Message msg = handler.obtainMessage(); msg.what = Constant.NET_MUSIC_LOADING; msg.arg1 = stopAnim; handler.sendMessage(msg); // 发消息开始更新界面 handler.sendMessage(handler.obtainMessage(Constant.NET_MUSIC_SEARCH)); searchThreadRunning = false; }; }.start(); } } }
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论