您的位置:首页 > 其它

通过getContentResolver,ListView,Adapter获取系统多媒体信息

2015-05-08 00:39 507 查看
今天一整天都在摸索怎样扫描手机上的歌曲的信息并将其以列表的形式展示出来,接下来是列出来的是我遇到的一个个的问题,和后来的解决办法。

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: