blob: 44d644756eaa6c73f68d0ef998c2f2f87abfbcf2 [file] [log] [blame]
/*
* 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 java.util.ArrayList;
import java.util.List;
import java.util.Random;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;
/**
* 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, null, 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 and title of the song are
int titleColumn = cur.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = cur.getColumnIndex(android.provider.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(titleColumn)));
} 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 class Item {
long id;
String title;
public Item(long id, String title) {
this.id = id;
this.title = title;
}
public long getId() { return id; }
public String getTitle() { return title; }
public Uri getURI() {
return ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);
}
}
}