📄 musicutils.java
字号:
/* * Copyright (C) 2008 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.android.imusic;import java.io.File;import java.io.FileDescriptor;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Arrays;import java.util.Formatter;import java.util.HashMap;import java.util.Locale;import android.app.Activity;import android.app.ExpandableListActivity;import android.content.ComponentName;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.content.res.Resources;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.ColorFilter;import android.graphics.PixelFormat;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.media.MediaFile;//import android.media.MediaScanner;import android.net.Uri;import android.os.RemoteException;import android.os.Environment;import android.os.ParcelFileDescriptor;import android.provider.MediaStore;import android.provider.Settings;import android.util.Log;import android.view.SubMenu;import android.view.Window;import android.widget.TextView;import android.widget.Toast;public class MusicUtils { private static final String TAG = "MusicUtils"; public interface Defs { public final static int OPEN_URL = 0; public final static int ADD_TO_PLAYLIST = 1; public final static int USE_AS_RINGTONE = 2; public final static int PLAYLIST_SELECTED = 3; public final static int NEW_PLAYLIST = 4; public final static int PLAY_SELECTION = 5; public final static int GOTO_START = 6; public final static int GOTO_PLAYBACK = 7; public final static int PARTY_SHUFFLE = 8; public final static int SHUFFLE_ALL = 9; public final static int DELETE_ITEM = 10; public final static int SCAN_DONE = 11; public final static int CHILD_MENU_BASE = 12; public final static int QUEUE = 13; } public static String makeAlbumsSongsLabel(Context context, int numalbums, int numsongs, boolean isUnknown) { // There are several formats for the albums/songs information: // "1 Song" - used if there is only 1 song // "N Songs" - used for the "unknown artist" item // "1 Album"/"N Songs" // "N Album"/"M Songs" // Depending on locale, these may need to be further subdivided StringBuilder songs_albums = new StringBuilder(); if (numsongs == 1) { songs_albums.append(context.getString(R.string.onesong)); } else { Resources r = context.getResources(); if (! isUnknown) { String f = r.getQuantityText(R.plurals.Nalbums, numalbums).toString(); sFormatBuilder.setLength(0); sFormatter.format(f, Integer.valueOf(numalbums)); songs_albums.append(sFormatBuilder); songs_albums.append(context.getString(R.string.albumsongseparator)); } String f = r.getQuantityText(R.plurals.Nsongs, numsongs).toString(); sFormatBuilder.setLength(0); sFormatter.format(f, Integer.valueOf(numsongs)); songs_albums.append(sFormatBuilder); } return songs_albums.toString(); } public static IMediaPlaybackService sService = null; private static HashMap<Context, ServiceBinder> sConnectionMap = new HashMap<Context, ServiceBinder>(); public static boolean bindToService(Context context) { return bindToService(context, null); } public static boolean bindToService(Context context, ServiceConnection callback) { context.startService(new Intent(context, MediaPlaybackService.class)); ServiceBinder sb = new ServiceBinder(callback); sConnectionMap.put(context, sb); return context.bindService((new Intent()).setClass(context, MediaPlaybackService.class), sb, 0); } public static void unbindFromService(Context context) { ServiceBinder sb = (ServiceBinder) sConnectionMap.remove(context); if (sb == null) { Log.e("MusicUtils", "Trying to unbind for unknown Context"); return; } context.unbindService(sb); } private static class ServiceBinder implements ServiceConnection { ServiceConnection mCallback; ServiceBinder(ServiceConnection callback) { mCallback = callback; } public void onServiceConnected(ComponentName className, android.os.IBinder service) { sService = IMediaPlaybackService.Stub.asInterface(service); initAlbumArtCache(); if (mCallback != null) { mCallback.onServiceConnected(className, service); } } public void onServiceDisconnected(ComponentName className) { if (mCallback != null) { mCallback.onServiceDisconnected(className); } sService = null; } } public static int getCurrentAlbumId() { if (sService != null) { try { return sService.getAlbumId(); } catch (RemoteException ex) { } } return -1; } public static int getCurrentArtistId() { if (MusicUtils.sService != null) { try { return sService.getArtistId(); } catch (RemoteException ex) { } } return -1; } public static int getCurrentAudioId() { if (MusicUtils.sService != null) { try { return sService.getAudioId(); } catch (RemoteException ex) { } } return -1; } public static int getCurrentShuffleMode() { int mode = MediaPlaybackService.SHUFFLE_NONE; if (sService != null) { try { mode = sService.getShuffleMode(); } catch (RemoteException ex) { } } return mode; } /* * Returns true if a file is currently opened for playback (regardless * of whether it's playing or paused). */ public static boolean isMusicLoaded() { if (MusicUtils.sService != null) { try { return sService.getPath() != null; } catch (RemoteException ex) { } } return false; } private final static int [] sEmptyList = new int[0]; public static int [] getSongListForCursor(Cursor cursor) { if (cursor == null) { return sEmptyList; } int len = cursor.getCount(); int [] list = new int[len]; cursor.moveToFirst(); int colidx = cursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID); if (colidx < 0) { colidx = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID); } for (int i = 0; i < len; i++) { list[i] = cursor.getInt(colidx); cursor.moveToNext(); } return list; } public static int [] getSongListForArtist(Context context, int id) { final String[] ccols = new String[] { MediaStore.Audio.Media._ID }; String where = MediaStore.Audio.Media.ARTIST_ID + "=" + id + " AND " + MediaStore.Audio.Media.IS_MUSIC + "=1"; Cursor cursor = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ccols, where, null, MediaStore.Audio.Media.ALBUM_KEY + "," + MediaStore.Audio.Media.TRACK); if (cursor != null) { int [] list = getSongListForCursor(cursor); cursor.close(); return list; } return sEmptyList; } public static int [] getSongListForAlbum(Context context, int id) { final String[] ccols = new String[] { MediaStore.Audio.Media._ID }; String where = MediaStore.Audio.Media.ALBUM_ID + "=" + id + " AND " + MediaStore.Audio.Media.IS_MUSIC + "=1"; Cursor cursor = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, ccols, where, null, MediaStore.Audio.Media.TRACK); if (cursor != null) { int [] list = getSongListForCursor(cursor); cursor.close(); return list; } return sEmptyList; } public static int [] getSongListForPlaylist(Context context, long plid) { final String[] ccols = new String[] { MediaStore.Audio.Playlists.Members.AUDIO_ID }; Cursor cursor = query(context, MediaStore.Audio.Playlists.Members.getContentUri("external", plid), ccols, null, null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER); if (cursor != null) { int [] list = getSongListForCursor(cursor); cursor.close(); return list; } return sEmptyList; } public static void playPlaylist(Context context, long plid) { int [] list = getSongListForPlaylist(context, plid); if (list != null) { playAll(context, list, -1, false); } } public static int [] getAllSongs(Context context) { Cursor c = query(context, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Audio.Media._ID}, MediaStore.Audio.Media.IS_MUSIC + "=1", null, null); try { if (c == null || c.getCount() == 0) { return null; } int len = c.getCount(); int[] list = new int[len]; for (int i = 0; i < len; i++) { c.moveToNext(); list[i] = c.getInt(0); } return list; } finally { if (c != null) { c.close(); } } } /** * Fills out the given submenu with items for "new playlist" and * any existing playlists. When the user selects an item, the * application will receive PLAYLIST_SELECTED with the Uri of * the selected playlist, NEW_PLAYLIST if a new playlist * should be created, and QUEUE if the "current playlist" was * selected. * @param context The context to use for creating the menu items * @param sub The submenu to add the items to. */ public static void makePlaylistMenu(Context context, SubMenu sub) { String[] cols = new String[] { MediaStore.Audio.Playlists._ID, MediaStore.Audio.Playlists.NAME }; ContentResolver resolver = context.getContentResolver(); if (resolver == null) { System.out.println("resolver = null"); } else { String whereclause = MediaStore.Audio.Playlists.NAME + " != ''"; Cursor cur = resolver.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, cols, whereclause, null, MediaStore.Audio.Playlists.NAME); sub.clear(); sub.add(1, Defs.QUEUE, 0, R.string.queue); sub.add(1, Defs.NEW_PLAYLIST, 0, R.string.new_playlist); if (cur != null && cur.getCount() > 0) { //sub.addSeparator(1, 0); cur.moveToFirst(); while (! cur.isAfterLast()) { Intent intent = new Intent(); intent.putExtra("playlist", cur.getInt(0));// if (cur.getInt(0) == mLastPlaylistSelected) {// sub.add(0, MusicBaseActivity.PLAYLIST_SELECTED, cur.getString(1)).setIntent(intent);// } else { sub.add(1, Defs.PLAYLIST_SELECTED, 0, cur.getString(1)).setIntent(intent);// } cur.moveToNext(); } } if (cur != null) { cur.close(); } } } public static void clearPlaylist(Context context, int plid) { final String[] ccols = new String[] { MediaStore.Audio.Playlists.Members._ID }; Cursor cursor = query(context, MediaStore.Audio.Playlists.Members.getContentUri("external", plid), ccols, null, null, MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER); if (cursor == null) { return; } cursor.moveToFirst();// while (!cursor.isAfterLast()) {// cursor.deleteRow();// }// cursor.commitUpdates(); cursor.close(); return; } public static void deleteTracks(Context context, int [] list) { String [] cols = new String [] { MediaStore.Audio.Media._ID,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -