Android內容提供器實現導入手機中的全部歌曲

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;
    }
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; }} 如此已經實現了導入手機中的全部歌曲並使用MediaPlayer進行播放。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章