mp3播放器(五)(TabActivity的分页显示效果+读取sdcard里的mp3文件)
需要有三个activity
同时在manifest里面注册
一个大的MainActivity管理两个分页面,分别是Mp3ListActivity和LocalListActivity
MainActivity.java
1 package com.example.mp3player00; 2 3 4 import android.app.TabActivity; 5 import android.content.Intent; 6 import android.os.Bundle; 7 import android.widget.TabHost; 8 9 public class MainActivity extends TabActivity { 10 11 @Override 12 protected void onCreate(Bundle savedInstanceState) { 13 // TODO Auto-generated method stub 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.main); 16 //得到TabHost对象,对TabActivity的操作通常由这个操作 17 TabHost tabHost=getTabHost(); 18 //启动一个intent对象,将Mp3ListActivity传入 19 Intent Mp3ListActivityIntent=new Intent(); 20 Mp3ListActivityIntent.setClass(this,Mp3ListActivity.class ); 21 //内部类 TabSpec代表一个标签 22 TabHost.TabSpec spec=tabHost.newTabSpec("remote"); 23 //设置图标,参数一:字。 参数二:图标。 24 spec.setIndicator("remote",getResources().getDrawable(android.R.drawable.stat_sys_download)); 25 //设置内容 26 spec.setContent(Mp3ListActivityIntent); 27 //将标签放入host中 28 tabHost.addTab(spec); 29 30 //设置第二个页面 31 Intent LocalListIntent=new Intent(); 32 LocalListIntent.setClass(this,LocalListActivity.class ); 33 //内部类 TabSpec代表一个标签 34 TabHost.TabSpec spec2=tabHost.newTabSpec("local"); 35 //设置图标,参数一:字。 参数二:图标。 36 spec2.setIndicator("local",getResources().getDrawable(android.R.drawable.stat_sys_upload)); 37 //设置内容 38 spec2.setContent(LocalListIntent); 39 //将标签放入host中 40 tabHost.addTab(spec2); 41 } 42 43 44 }
LocalActvity.java
1 package com.example.mp3player00; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.Iterator; 6 import java.util.List; 7 8 import model.Mp3Info; 9 10 import utils.FileUtils; 11 import android.app.ListActivity; 12 import android.os.Bundle; 13 import android.widget.SimpleAdapter; 14 15 public class LocalListActivity extends ListActivity{ 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 20 super.onCreate(savedInstanceState); 21 22 } 23 // 为什么不放入在onCrreate里面呢,是因为onCreate是打开这个程序时才执行,并不是及时性的,如果下载一个新的不能及时更新 24 @Override 25 protected void onResume() { 26 setContentView(R.layout.local_mp3_list); 27 //得到 28 FileUtils fileUtils=new FileUtils(); 29 List<Mp3Info> mp3Infos=fileUtils.getMp3Files("mp3/"); 30 31 List<HashMap<String,String>> list= new ArrayList<HashMap<String,String>>(); 32 //将Mp3Info迭代出来 33 for (Iterator iterator = mp3Infos.iterator(); iterator.hasNext();) { 34 Mp3Info mp3Info = (Mp3Info) iterator.next(); 35 System.out.println("local---->"+mp3Info); 36 HashMap map=new HashMap<String,String>(); 37 map.put("mp3_name", mp3Info.getMp3Name()); 38 map.put("mp3_size", mp3Info.getMp3Size()); 39 list.add(map);//将每一行添加到list中 40 41 } 42 //创建adapter 43 SimpleAdapter simpleAdapter= 44 new SimpleAdapter
(this, list, R.layout.mp3info_item, new String[]{"mp3_name","mp3_size"}, new int[]{R.id.mp3_name,R.id.mp3_size}); 45 setListAdapter(simpleAdapter); 46 super.onResume(); 47 } 48 49 }
FileUtils.java
1 package utils; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import model.Mp3Info; 12 13 import android.os.Environment; 14 15 public class FileUtils { 16 private String SDPATH; 17 18 public String getSDPATH() { 19 return SDPATH; 20 } 21 public FileUtils() { 22 //得到当前外部存储设备的目录 23 // /SDCARD 24 SDPATH = Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator; 25 System.out.println("判断SDCard是否存在,是否有可读权限:" 26 + Environment.MEDIA_MOUNTED.endsWith(Environment.getExternalStorageState())); 27 } 28 /** 29 * 在SD卡上创建文件 30 * 31 * @throws IOException 32 * 在哪个目录上生成这个文件,文件的名字 33 */ 34 public File creatSDFile(String fileName,String dir) throws IOException { 35 File file = new File(SDPATH+dir + fileName); 36 System.out.println("file--->"+file); 37 file.createNewFile(); 38 return file; 39 } 40 41 /** 42 * 在SD卡上创建目录 43 * 44 * @param dirName 45 */ 46 public File creatSDDir(String dir) { 47 File dirFile = new File(SDPATH + dir+File.separator); 48 System.out.println("creatSDDir?---->"+dirFile.mkdirs()); 49 return dirFile; 50 } 51 52 /** 53 * 判断SD卡上的文件夹是否存在 54 */ 55 public boolean isFileExist(String fileName,String path){ 56 File file = new File(SDPATH + path+File.separator+fileName); 57 return file.exists(); 58 } 59 60 /** 61 * 将一个InputStream里面的数据写入到SD卡中 62 */ 63 public File write2SDFromInput(String path,String fileName,InputStream input){ 64 File file = null; 65 OutputStream output = null; 66 try{ 67 creatSDDir(path); 68 file = creatSDFile( fileName,path ); 69 output = new FileOutputStream(file); 70 byte buffer [] = new byte[4 * 1024]; 71 int temp; 72 while((temp=input.read(buffer))!= -1){ 73 output.write(buffer,0,temp); 74 } 75 output.flush(); 76 } 77 catch(Exception e){ 78 e.printStackTrace(); 79 } 80 finally{ 81 try{ 82 output.close(); 83 } 84 catch(Exception e){ 85 e.printStackTrace(); 86 } 87 } 88 return file; 89 } 90 //读取指定文件中mp3的名字和大小 91 public List<Mp3Info> getMp3Files(String path){ 92 List<Mp3Info> mp3Infos=new ArrayList<Mp3Info>(); 93 //得到File对象 94 File file=new File(SDPATH+File.separator+path); 95 //返回当前文件夹中所有的文件,每个文件都是一个File对象,以数组的形式表示 96 File [] files=file.listFiles(); 97 //for循环将file都取出来 98 for (int i = 0; i < files.length; i++) { 99 //首先要判断文件夹里的是mp3文件,即以MP3结尾的文件 100 if(files[i].getName().endsWith("mp3")){ 101 //每一个file都对应一个Mp3Info对象 102 Mp3Info mp3Info=new Mp3Info(); 103 mp3Info.setMp3Name(files[i].getName()); 104 mp3Info.setMp3Size(files[i].length()+"");//length是string而size是字符窜+“”自动变成字符窜 105 mp3Infos.add(mp3Info);//得到Mp3Info 106 } 107 108 } 109 return mp3Infos; 110 111 } 112 113 114 }
main.xml
1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@android:id/tabhost" android:layout_width="fill_parent" 3 android:layout_height="fill_parent"> 4 <LinearLayout android:orientation="vertical" 5 android:layout_width="fill_parent" android:layout_height="fill_parent"> 6 7 <TabWidget android:id="@android:id/tabs" 8 android:layout_width="fill_parent" android:layout_height="wrap_content" /> 9 10 <FrameLayout android:id="@android:id/tabcontent" 11 android:layout_width="fill_parent" android:layout_height="fill_parent"> 12 </FrameLayout> 13 </LinearLayout> 14 </TabHost>
注意manifest中主要启动的是MainActivity是有启动顺序的
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.example.mp3player00" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="4" 9 android:targetSdkVersion="4" /> 10 11 <application 12 android:allowBackup="true" 13 android:icon="@drawable/ic_launcher" 14 android:label="@string/app_name" 15 android:theme="@style/AppTheme" > 16 <activity 17 android:name="com.example.mp3player00.MainActivity" 18 android:label="@string/app_name" > 19 <intent-filter> 20 <action android:name="android.intent.action.MAIN" /> 21 22 <category android:name="android.intent.category.LAUNCHER" /> 23 </intent-filter> 24 </activity> 25 <activity android:name="com.example.mp3player00.LocalListActivity" 26 android:label="@string/app_name" /> 27 <activity android:name="com.example.mp3player00.Mp3ListActivity" 28 android:label="@string/app_name" /> 29 <service android:name="service.DownloadService"></service> 30 </application> 31 <uses-permission android:name="android.permission.INTERNET" /> 32 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 33 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission> 34 </manifest>
自信与努力 用心坚持