通过getContentResolver,ListView,Adapter获取系统多媒体信息
2015-05-08 00:39
507 查看
今天一整天都在摸索怎样扫描手机上的歌曲的信息并将其以列表的形式展示出来,接下来是列出来的是我遇到的一个个的问题,和后来的解决办法。
1、一开始的时候是卡在了通过什么方法获得歌曲信息上,看了书和视频,满满地知道了 可以通过contentResolver的query()方法信息。通过getContentResolver()实例化一个对象,然后调用该对象的query方法
2、然而事情并没有因此进展地很顺利,query方法中的五个参数又弄晕我了。
3、从系统读取到了 信息后,要用ListView将信息展示出来,但有遇到问题了,ListView中的Simpledapter和List<Map<String,Object>>又难倒了我,好吧,一个一个地解决。
Simpledapter(Context context,List<Map<String,Object>> listItem,from,to),第一个参数是上下文,用this做参数。第二个参数是一个存储了Map集合的List集合,即List以Map作为元素。第三个参数是存键(key)的数组。第四个参数是存对应值(value)的数组。
List<Map<String,Object>> listItem是个比较陌生的东西 ,要有泛型,Map,List集合的知识储备,于是我又回去翻书,了解这些知识。详细的就不多说了 。
4、本以为弄完这些就大功告成了,结果,还是错了,弄了好久才发现问题
5、找了好久才发现自己的ListView没有findviewById。
6、后来在模拟机的sd卡上多加了几首歌,但模拟机还是只是显示原来的歌曲条目,本来以为是自己程序的错了,琢磨了好久,重启了虚拟机,刚刚添加的歌曲都在里面了,原来要重启虚拟机才能更新添加进去的内容。之前一直在想,BroadcastReceiver有什么用,原来可以在这里用上了,用BroadcastReceiver告知程序系统添加了音频文件,要刷新ListView。
总结:遇到困难真的不要轻言放弃,坚持总会攻克它的。当你深深地钻研一样东西很久,解决了这个问题,你会特别有成就感。加油,程序员们。
以下是我打的代码
1、一开始的时候是卡在了通过什么方法获得歌曲信息上,看了书和视频,满满地知道了 可以通过contentResolver的query()方法信息。通过getContentResolver()实例化一个对象,然后调用该对象的query方法
2、然而事情并没有因此进展地很顺利,query方法中的五个参数又弄晕我了。
<span style="font-size:18px;">query(Uri uri,String[] projection,String where,String selectionArgs,String sortOrder);</span>然后打开书本,开始复习了contentProvider的相关知识,终于搞明白了uri是ContentResolver处理对应数据的标识,只有对应的uri才能访问到系统的音频文件。MediaStore.Audio.Media.EXTERNAL_CONTENT_URI是储存爱SD卡上的音频的uri,MediaStore.Audio.Media.INTERNAL_CONTENT_URI是储存爱手机上的音频的uri。
3、从系统读取到了 信息后,要用ListView将信息展示出来,但有遇到问题了,ListView中的Simpledapter和List<Map<String,Object>>又难倒了我,好吧,一个一个地解决。
Simpledapter(Context context,List<Map<String,Object>> listItem,from,to),第一个参数是上下文,用this做参数。第二个参数是一个存储了Map集合的List集合,即List以Map作为元素。第三个参数是存键(key)的数组。第四个参数是存对应值(value)的数组。
List<Map<String,Object>> listItem是个比较陌生的东西 ,要有泛型,Map,List集合的知识储备,于是我又回去翻书,了解这些知识。详细的就不多说了 。
4、本以为弄完这些就大功告成了,结果,还是错了,弄了好久才发现问题
<span style="font-size:18px;">mapItem.put("text", fileName);//一定要传入<span style="font-family: Arial, Helvetica, sans-serif; font-size: 18px;">SimpleAdapter的 参数对应</span><span style="font-family: Arial, Helvetica, sans-serif;">类型的,不然会报错</span></span>
5、找了好久才发现自己的ListView没有findviewById。
6、后来在模拟机的sd卡上多加了几首歌,但模拟机还是只是显示原来的歌曲条目,本来以为是自己程序的错了,琢磨了好久,重启了虚拟机,刚刚添加的歌曲都在里面了,原来要重启虚拟机才能更新添加进去的内容。之前一直在想,BroadcastReceiver有什么用,原来可以在这里用上了,用BroadcastReceiver告知程序系统添加了音频文件,要刷新ListView。
总结:遇到困难真的不要轻言放弃,坚持总会攻克它的。当你深深地钻研一样东西很久,解决了这个问题,你会特别有成就感。加油,程序员们。
以下是我打的代码
<span style="font-size:18px;"><span style="font-size:18px;">package com.example.query; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.database.Cursor; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.SimpleAdapter; import android.os.Build; import android.provider.MediaStore; import android.provider.MediaStore.Audio.Media; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv=(ListView) findViewById(R.id.listView1);//一定要记得赋予id; List<Map<String,Object>> listItem=new ArrayList<Map<String,Object>>(); Cursor c=getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); while(c.moveToNext()){ Map<String,Object> mapItem=new HashMap<String,Object>(); String fileName=c.getString(c.getColumnIndex(Media.DISPLAY_NAME)); mapItem.put("pic",R.drawable.ic_launcher); mapItem.put("text", fileName);//一定要传入String类型的,不然会报错 listItem.add(mapItem); } SimpleAdapter sp=new SimpleAdapter(this,listItem,R.layout.list,new String[]{"pic","text"},new int[]{R.id.imageView1,R.id.textView1}); lv.setAdapter(sp); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new PlaceholderFragment()).commit(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /** * A placeholder fragment containing a simple view. */ public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } } } </span></span>
相关文章推荐
- android, 删除SD卡音乐文件。通过getContentResolver读取音乐文件,可以获取到一个完整的路径,直接new File(这括号写获取的路径).delete();
- 本地音乐播放器MediaPlayer获取所有歌曲信息,getContentResolver()
- 通过java的Runtime.getRuntime()和System.getProperties()来获取系统的信息
- 通过系统定位获取位置信息
- 通过系统表获取SQL,Access,Oracle数据库的元数据信息
- 通过Python 获取Linux系统用户的登录信息
- 获取系统联系人信息,并显示在ListView上 推荐
- 通过WMI获取系统信息
- java 通过System.getProperties()获取系统参数
- WinAPI: GetSystemPowerStatus - 获取系统电源状态的信息
- 使用android-rss库实现从网络中获取rss信息,并通过ListView显示
- Android通过Adapter获取ListView中的多选内容
- 通过android代码获取android系统的imei、手机型号、手机品牌、android系统的版本号、sdk版本号等信息
- C++ 中通过GetAdaptersInfo获取网卡配置和Ip地址信息
- java 通过System.getProperties()获取系统参数
- Android多媒体分析-通过MediaStore获取Audio信息
- 通过System.getProperties()获取系统参数
- Delphi通过WMI获取系统信息
- java 通过System.getProperties()获取系统参数
- 解决从相册获取图片路径cursor = getContentResolver().query(uri, proj, null, null, null)报空的问题