Android内容提供器实现导入手机中的全部歌曲
来源:互联网 发布:淘宝买家vip等级 编辑:程序博客网 时间:2024/04/28 02:32
Android想要获取不同手机内存卡中的内容,要使用内容提供器。
下面介绍我所做的一个可以播放音乐,并且可以导入手机中所有音频的demo。
首先讲一下思路:
活动中开启线程,实例化内容提供器对象ContentResolver,实例化cusor对象,扫描sdcard,踢除相应的图片文件信息,获取音频的路径,音频的名称等信息,储存到早已封装好的音乐对象类:MusicFile当中,并存入容器当中以便备用,当整个扫描完成后,将信息告诉handler,让其处理UI线程中的变化。
这里使用了一个封装音乐信息的MusicFile类,和一个可以筛选图片文件的util类,最后一个实现主要功能的Activity,
public class MainActivity extends AppCompatActivity { private final static int MUSIC_SCARCH_FINISH = 1;//音乐扫描完成 private List<MusicFile> musicFiles=new ArrayList<MusicFile>(); private Button play; private Button pause; private Button reset,OK; private TextView music; private EditText id; public static MediaPlayer player=new MediaPlayer(); ContentResolver contentResolver; public static int ID; private Handler mHandler=new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case MUSIC_SCARCH_FINISH://音乐扫描完成 //这里进行UI操作 for(int i=0;i<musicFiles.size();i++){ music.append(musicFiles.get(i).getID()+" "+musicFiles.get(i).getName()+"\n"); } break; } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar actionBar=getSupportActionBar(); actionBar.setTitle("MyPlayer"); play=(Button)findViewById(R.id.play); pause=(Button)findViewById(R.id.pause); reset=(Button)findViewById(R.id.reset); OK=(Button)findViewById(R.id.OK); music=(TextView)findViewById(R.id.music); id=(EditText)findViewById(R.id.id); getMusicFloder(); OK.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ID=(int)Integer.parseInt(id.getText().toString()); player.reset(); try { player.setDataSource(musicFiles.get(ID).getDir()); player.prepare(); } catch (IOException e) { e.printStackTrace(); } player.start(); } }); contentResolver=getContentResolver(); int i=0; play.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!player.isPlaying()){ player.start(); } } }); pause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(player.isPlaying())player.pause(); } }); reset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { player.reset(); try { player.setDataSource(musicFiles.get(ID).getDir()); player.prepare(); } catch (IOException e) { e.printStackTrace(); } ;//这里一定要先进行reset再进行重置 } }); } private void getMusicFloder() { if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { Toast.makeText(this, "没有sdcard", Toast.LENGTH_LONG).show(); return; } new Thread(new Runnable() { @Override public void run() { //查询音乐 Uri mImageUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; ContentResolver mContentResolver = MainActivity.this.getContentResolver(); String selection= MediaStore.Audio.Media.MIME_TYPE + "=? "; String[] selectionArgs=new String[]{"audio/mpeg"}; Cursor mCursor = mContentResolver.query(mImageUri,null,selection,selectionArgs, MediaStore.Audio.Media.DATE_MODIFIED); int i=0; while (mCursor.moveToNext()) { String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.DATA)); int duration= mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); MusicFile musicFile=new MusicFile(); musicFile.setDir(path); musicFile.setId(i); i++; musicFile.setMusicDuration(duration); musicFiles.add(musicFile); } mCursor.close(); // 通知Handler扫描图片完成 mHandler.sendEmptyMessage(MUSIC_SCARCH_FINISH); } }).start(); }}public class MusicFile{ private int id; private String dir;//音乐绝对路径 private String name;//音乐名称 private int musicDuration;//音乐时长 public String getDir() { return dir; } public void setDir(String dir) { this.dir = dir; int lastIndexOf = this.dir.lastIndexOf("/"); this.name = this.dir.substring(lastIndexOf); } public String getName() { return name; } public int getMusicDuration() { return musicDuration; }如此已经实现了导入手机中的全部歌曲并使用MediaPlayer进行播放。public class Utils { public static boolean isImage(String fileName){ if (fileName.endsWith(".jpg")|| fileName.endsWith(".JPG")|| fileName.endsWith(".png")|| fileName.endsWith(".PNG") || fileName.endsWith(".jpeg")|| fileName.endsWith(".JPEG")|| fileName.endsWith(".gif")|| fileName.endsWith(".GIF")) return true; return false; } public static String getStringByResId(Context context, int resId){ return context.getString(resId); } public static String getMusicDuration(int duration){ SimpleDateFormat sdf=new SimpleDateFormat("mm:ss"); return sdf.format(duration); }}
public void setMusicDuration(int musicDuration) { this.musicDuration = musicDuration; } public void setId(int id){ this.id=id; } public int getID(){ return id; }}
0 0
- Android内容提供器实现导入手机中的全部歌曲
- Android 内容提供器---创建内容提供器(实现内容提供器权限)
- Android 内容提供器---创建内容提供器(实现内容提供器权限)
- android内容提供器
- Android内容提供器
- Android 内容提供器---创建内容提供器(实现ContentProvider类)
- Android 内容提供器---创建内容提供器(实现ContentProvider的MIME类型)
- Android 内容提供器---创建内容提供器(实现合约类)
- Android 内容提供器---创建内容提供器(实现ContentProvider类)
- Android 内容提供器---创建内容提供器(实现ContentProvider的MIME类型)
- Android 内容提供器---创建内容提供器(实现合约类)
- Android 内容提供器---简介
- Android 内容提供器---简介 .
- android 内容提供器api
- Android之内容提供器
- Android 内容提供器 ContentProvider
- Android 内容提供器小结
- Android创建内容提供器
- Android 关于MVP的一些思考与总结
- caffe:blob、layer和net源码学习
- 如何看CentOS系统是32位还是64位的?
- 【OM】SoftEtherVPN搭建教程(1)
- Python自动化拉取Mysql数据并装载到Hive
- Android内容提供器实现导入手机中的全部歌曲
- SQL Server 无法打开物理文件拒绝访问解决方法
- 自定义标题栏
- 41.screen
- 爬虫入门到精通-headers的详细讲解(模拟登录知乎)
- Quartz.NET开源作业调度框架系列(二):CronTrigger
- JS底层实现canvas在线画板
- ArcGIS API for JavaScript 4.x中的3D部分(3)
- Java流程控制的陷阱——for循环和foreach循环的陷阱