نیاز به کدی برای خواندن آهنگ ها از حافظه داخلی و اس دی کارت(حل شد)
سلام
احتیاج به کدی دارم که آهنگ ها رو از حافظه داخلی و اس دی کارت تشخیص بده و در یک لیست ویو نمایش بده.
در stackoverflow کدهای زیادی هست ولی کدومشو و چجوری باید استفاده کرد. در ضمن کدی باید باشه که روی همه گوشی ها جواب بده. ینی نیاز به دادن مسیر نباشه.
لطفا یکی از دوستان یک کد خوب بهم بده و راهنمایی کنه. ممنون
خب! چون هیچ کسی کمکی نکرد و شاید هم بلد نبود من با کمک یکی از دوستانم یه چیزی پیدا کردم.
اینجا با بقیه دوستان به اشتراک میزارم انشالله که کمک کنه .
ابتدا کلاسی نیاز هست با نام MusicLoadAdapter به این صورت:
public class MusicLoadAdapter extends BaseAdapter implements OnClickListener{
private static StringBuilder sFormatBuilder = new StringBuilder();
private static Formatter sFormatter = new Formatter(sFormatBuilder, Locale.getDefault());
private static final Object[] sTimeArgs = new Object[5];
public static String makeTimeString(Context context, long secs) {
String durationformat = context.getString(secs < 3600 ? R.string.durationformatshort
: R.string.durationformatlong);
/*
* Provide multiple arguments so the format can be changed easily by
* modifying the xml.
*/
sFormatBuilder.setLength(0);
final Object[] timeArgs = sTimeArgs;
timeArgs[0] = secs / 3600;
timeArgs[1] = secs / 60;
timeArgs[2] = (secs / 60) % 60;
timeArgs[3] = secs;
timeArgs[4] = secs % 60;
return sFormatter.format(durationformat, timeArgs).toString();
}
private Activity activity;
private String[] data;
private String[] artistNames;
private long[] durations;
private static LayoutInflater inflater=null;
//public ImageLoader imageLoader;
public MusicLoadAdapter(Activity a, String[] d,String[] artNames,long[] durs) {
activity = a;
data=d;
artistNames=artNames;
durations=durs;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Create ImageLoader object to download and show image in list
// Call ImageLoader constructor to initialize FileCache
//imageLoader = new ImageLoader(activity.getApplicationContext());
}
@Override
public int getCount() {
return data.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
/********* Create a holder Class to contain inflated xml file elements *********/
public static class ViewHolder{
TextView track_name;
TextView artist_name;
TextView track_duration;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi=convertView;
ViewHolder holder;
if(convertView==null){
/****** Inflate tabitem.xml file for each row ( Defined below ) *******/
vi = inflater.inflate(R.layout.musicitem, null);
/****** View Holder Object to contain tabitem.xml file elements ******/
holder = new ViewHolder();
holder.track_name = (TextView) vi.findViewById(R.id.MusicName1);
holder.artist_name = (TextView) vi.findViewById(R.id.summary);
holder.track_duration = (TextView) vi.findViewById(R.id.duration);
//holder.text1=(TextView)vi.findViewById(R.id.text1);
// holder.image=(ImageView)vi.findViewById(R.id.image);
/************ Set holder with LayoutInflater ************/
vi.setTag( holder );
}
else
holder=(ViewHolder)vi.getTag();
long secs = durations[position] / 1000;
if (secs <= 0) {
holder.track_duration.setText("");
} else {
holder.track_duration.setText(makeTimeString(activity.getApplicationContext(), secs));
}
holder.artist_name.setText(artistNames[position]);
//holder.artist_name.setTextColor(Color.WHITE);
holder.track_name.setText(data[position]);
//holder.track_name.setTextColor(Color.WHITE);
/******** Set Item Click Listner for LayoutInflater for each row ***********/
vi.setOnClickListener(new OnItemClickListener(position));
return vi;
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
/********* Called when Item click in ListView ************/
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
MusicActivity sct = (MusicActivity)activity;
sct.onItemClick(mPosition);
}
}
بعد از اون به کلاس یا اکتیویتی MusicActivity نیاز داریم به این صورت:
public class MusicActivity extends Activity {
ListView musiclist;
MusicLoadAdapter adapter;
public String[] mStrings;
public String[] mStringspath;
public String[] artistNames;
public long[] durations;
Cursor musiccursor;
int music_column_index;
int count;
//MediaPlayer mMediaPlayer;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.musiclist);
System.gc();
String[] proj = { MediaStore.Audio.Media._ID,MediaStore.Audio.Media.DATA,MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Video.Media.DURATION,MediaStore.Video.Media.ARTIST };
musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,proj, null, null, null);
count = musiccursor.getCount();
mStrings=new String[count];
mStringspath=new String[count];
artistNames=new String[count];
durations=new long[count];
//Log.d("columnNames",
for(int k=0;k<count;k++){
musiccursor.moveToPosition(k);
music_column_index = musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME);//DATA);
String filename = musiccursor.getString(music_column_index);
mStrings[k]=filename;
int durid= musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION);
try{
durations[k]=musiccursor.getLong(durid);
}catch(Exception tyt){
durations[k]=0;
}
//Log.d("durations",String.valueOf(musiccursor.getLong(durid)));
int artid= musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST);
try{
artistNames[k]=musiccursor.getString(artid);
}catch(Exception tyt){
artistNames[k]="";
}
int path= musiccursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
mStringspath[k]= musiccursor.getString(path);
//Log.d("columnNames",filename);//+"- "+String.valueOf(columnNames.length));
}
//String[] columnNames=musiccursor.getColumnNames();
//Log.d("columnNames",String.valueOf(columnNames.length));
//init_phone_music_grid();
musiclist=(ListView)findViewById(R.id.PhoneMusicList);
adapter=new MusicLoadAdapter(this, mStrings,artistNames,durations);
musiclist.setAdapter(adapter);
}
@Override
public void onDestroy()
{
// Remove adapter refference from list
musiclist.setAdapter(null);
super.onDestroy();
}
public OnClickListener listener=new OnClickListener(){
@Override
public void onClick(View arg0) {
//Refresh cache directory downloaded images
//adapter.imageLoader.clearCache();
adapter.notifyDataSetChanged();
}
};
public void onItemClick(int mPosition)
{
String tempValues = mStringspath[mPosition];
try {
Log.d("url",tempValues);
Intent ii = new Intent( MusicActivity.this,MainActivity.class);
ii.putExtra("url", tempValues);
finish();
startActivityForResult(ii, 0);
} catch (Exception e) {
}
}
}
بعد از اینها نوبت xml ها میرسه که یک xml داریم که یک listview توش هست و آیدیش رو از اکتیویتی بالا بهش میدید
و یک xml دیگه داریم که باز هم با استفاده از بالا باید adapter نمونه رو بسازید و بهش کد رو نسبت بدید.
و در نهایت در داخل res/values فایل string.xml باید به شکل زیر باشه:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="durationformatshort" translatable="false"><xliff:g id="format">%2$d:%5$02d</xliff:g></string>
<string name="durationformatlong" translatable="false"><xliff:g id="format">%1$d:%3$02d:%5$02d</xliff:g></string>
<string name="app_name">Disco Lightning</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
</resources>
والسلام!
برید حالشو ببرید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .