153 lines
5.0 KiB
Java
153 lines
5.0 KiB
Java
/*
|
|
* Copyright (C) 2011 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.example.android.musicplayer;
|
|
|
|
import android.content.ContentResolver;
|
|
import android.content.ContentUris;
|
|
import android.database.Cursor;
|
|
import android.net.Uri;
|
|
import android.provider.MediaStore;
|
|
import android.util.Log;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Random;
|
|
|
|
/**
|
|
* Retrieves and organizes media to play. Before being used, you must call {@link #prepare()},
|
|
* which will retrieve all of the music on the user's device (by performing a query on a content
|
|
* resolver). After that, it's ready to retrieve a random song, with its title and URI, upon
|
|
* request.
|
|
*/
|
|
public class MusicRetriever {
|
|
final String TAG = "MusicRetriever";
|
|
|
|
ContentResolver mContentResolver;
|
|
|
|
// the items (songs) we have queried
|
|
List<Item> mItems = new ArrayList<Item>();
|
|
|
|
Random mRandom = new Random();
|
|
|
|
public MusicRetriever(ContentResolver cr) {
|
|
mContentResolver = cr;
|
|
}
|
|
|
|
/**
|
|
* Loads music data. This method may take long, so be sure to call it asynchronously without
|
|
* blocking the main thread.
|
|
*/
|
|
public void prepare() {
|
|
Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
|
|
Log.i(TAG, "Querying media...");
|
|
Log.i(TAG, "URI: " + uri.toString());
|
|
|
|
// Perform a query on the content resolver. The URI we're passing specifies that we
|
|
// want to query for all audio media on external storage (e.g. SD card)
|
|
Cursor cur = mContentResolver.query(uri, null,
|
|
MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);
|
|
Log.i(TAG, "Query finished. " + (cur == null ? "Returned NULL." : "Returned a cursor."));
|
|
|
|
if (cur == null) {
|
|
// Query failed...
|
|
Log.e(TAG, "Failed to retrieve music: cursor is null :-(");
|
|
return;
|
|
}
|
|
if (!cur.moveToFirst()) {
|
|
// Nothing to query. There is no music on the device. How boring.
|
|
Log.e(TAG, "Failed to move cursor to first row (no query results).");
|
|
return;
|
|
}
|
|
|
|
Log.i(TAG, "Listing...");
|
|
|
|
// retrieve the indices of the columns where the ID, title, etc. of the song are
|
|
int artistColumn = cur.getColumnIndex(MediaStore.Audio.Media.ARTIST);
|
|
int titleColumn = cur.getColumnIndex(MediaStore.Audio.Media.TITLE);
|
|
int albumColumn = cur.getColumnIndex(MediaStore.Audio.Media.ALBUM);
|
|
int durationColumn = cur.getColumnIndex(MediaStore.Audio.Media.DURATION);
|
|
int idColumn = cur.getColumnIndex(MediaStore.Audio.Media._ID);
|
|
|
|
Log.i(TAG, "Title column index: " + String.valueOf(titleColumn));
|
|
Log.i(TAG, "ID column index: " + String.valueOf(titleColumn));
|
|
|
|
// add each song to mItems
|
|
do {
|
|
Log.i(TAG, "ID: " + cur.getString(idColumn) + " Title: " + cur.getString(titleColumn));
|
|
mItems.add(new Item(
|
|
cur.getLong(idColumn),
|
|
cur.getString(artistColumn),
|
|
cur.getString(titleColumn),
|
|
cur.getString(albumColumn),
|
|
cur.getLong(durationColumn)));
|
|
} while (cur.moveToNext());
|
|
|
|
Log.i(TAG, "Done querying media. MusicRetriever is ready.");
|
|
}
|
|
|
|
public ContentResolver getContentResolver() {
|
|
return mContentResolver;
|
|
}
|
|
|
|
/** Returns a random Item. If there are no items available, returns null. */
|
|
public Item getRandomItem() {
|
|
if (mItems.size() <= 0) return null;
|
|
return mItems.get(mRandom.nextInt(mItems.size()));
|
|
}
|
|
|
|
public static class Item {
|
|
long id;
|
|
String artist;
|
|
String title;
|
|
String album;
|
|
long duration;
|
|
|
|
public Item(long id, String artist, String title, String album, long duration) {
|
|
this.id = id;
|
|
this.artist = artist;
|
|
this.title = title;
|
|
this.album = album;
|
|
this.duration = duration;
|
|
}
|
|
|
|
public long getId() {
|
|
return id;
|
|
}
|
|
|
|
public String getArtist() {
|
|
return artist;
|
|
}
|
|
|
|
public String getTitle() {
|
|
return title;
|
|
}
|
|
|
|
public String getAlbum() {
|
|
return album;
|
|
}
|
|
|
|
public long getDuration() {
|
|
return duration;
|
|
}
|
|
|
|
public Uri getURI() {
|
|
return ContentUris.withAppendedId(
|
|
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
|
|
}
|
|
}
|
|
}
|