package me.wcy.music.fragment; import android.content.ContentUris; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.media.RingtoneManager; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.MediaStore; import android.provider.Settings; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import android.widget.TextView; import java.io.File; import me.wcy.music.R; import me.wcy.music.adapter.LocalMusicAdapter; import me.wcy.music.adapter.OnMoreClickListener; import me.wcy.music.application.AppCache; import me.wcy.music.model.Music; import me.wcy.music.utils.FileUtils; import me.wcy.music.utils.SystemUtils; import me.wcy.music.utils.ToastUtils; import me.wcy.music.utils.binding.Bind; /** * 本地音乐列表 * Created by wcy on 2015/11/26. */ public class LocalMusicFragment extends BaseFragment implements AdapterView.OnItemClickListener, OnMoreClickListener { private static final int REQUEST_WRITE_SETTINGS = 1; @Bind(R.id.lv_local_music) private ListView lvLocalMusic; @Bind(R.id.tv_empty) private TextView tvEmpty; private LocalMusicAdapter mAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_local_music, container, false); } @Override protected void init() { mAdapter = new LocalMusicAdapter(); mAdapter.setOnMoreClickListener(this); lvLocalMusic.setAdapter(mAdapter); if (getPlayService().getPlayingMusic() != null && getPlayService().getPlayingMusic().getType() == Music.Type.LOCAL) { lvLocalMusic.setSelection(getPlayService().getPlayingPosition()); } updateView(); } @Override protected void setListener() { lvLocalMusic.setOnItemClickListener(this); } private void updateView() { if (AppCache.getMusicList().isEmpty()) { tvEmpty.setVisibility(View.VISIBLE); } else { tvEmpty.setVisibility(View.GONE); } mAdapter.updatePlayingPosition(getPlayService()); mAdapter.notifyDataSetChanged(); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { getPlayService().play(position); } @Override public void onMoreClick(final int position) { final Music music = AppCache.getMusicList().get(position); AlertDialog.Builder dialog = new AlertDialog.Builder(getContext()); dialog.setTitle(music.getTitle()); int itemsId = (position == getPlayService().getPlayingPosition()) ? R.array.local_music_dialog_without_delete : R.array.local_music_dialog; dialog.setItems(itemsId, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0:// 分享 shareMusic(music); break; case 1:// 设为铃声 requestSetRingtone(music); break; case 2:// 查看歌曲信息 musicInfo(music); break; case 3:// 删除 deleteMusic(music); break; } } }); dialog.show(); } public void onItemPlay() { if (isAdded()) { updateView(); if (getPlayService().getPlayingMusic().getType() == Music.Type.LOCAL) { lvLocalMusic.smoothScrollToPosition(getPlayService().getPlayingPosition()); } } } public void onMusicListUpdate() { if (isAdded()) { updateView(); } } /** * 分享音乐 */ private void shareMusic(Music music) { File file = new File(music.getPath()); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("audio/*"); intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); startActivity(Intent.createChooser(intent, getString(R.string.share))); } private void requestSetRingtone(final Music music) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.System.canWrite(getContext())) { ToastUtils.show("没有权限,无法设置铃声,请授予权限"); Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getContext().getPackageName())); startActivityForResult(intent, REQUEST_WRITE_SETTINGS); } else { setRingtone(music); } } /** * 设置铃声 */ private void setRingtone(Music music) { Uri uri = MediaStore.Audio.Media.getContentUriForPath(music.getPath()); // 查询音乐文件在媒体库是否存在 Cursor cursor = getContext().getContentResolver().query(uri, null, MediaStore.MediaColumns.DATA + "=?", new String[]{music.getPath()}, null); if (cursor == null) { return; } if (cursor.moveToFirst() && cursor.getCount() > 0) { String _id = cursor.getString(0); ContentValues values = new ContentValues(); values.put(MediaStore.Audio.Media.IS_MUSIC, true); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_ALARM, false); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); values.put(MediaStore.Audio.Media.IS_PODCAST, false); getContext().getContentResolver().update(uri, values, MediaStore.MediaColumns.DATA + "=?", new String[]{music.getPath()}); Uri newUri = ContentUris.withAppendedId(uri, Long.valueOf(_id)); RingtoneManager.setActualDefaultRingtoneUri(getContext(), RingtoneManager.TYPE_RINGTONE, newUri); ToastUtils.show(R.string.setting_ringtone_success); } cursor.close(); } private void musicInfo(Music music) { AlertDialog.Builder dialog = new AlertDialog.Builder(getContext()); dialog.setTitle(music.getTitle()); StringBuilder sb = new StringBuilder(); sb.append("艺术家:") .append(music.getArtist()) .append("\n\n") .append("专辑:") .append(music.getAlbum()) .append("\n\n") .append("播放时长:") .append(SystemUtils.formatTime("mm:ss", music.getDuration())) .append("\n\n") .append("文件名称:") .append(music.getFileName()) .append("\n\n") .append("文件大小:") .append(FileUtils.b2mb((int) music.getFileSize())) .append("MB") .append("\n\n") .append("文件路径:") .append(new File(music.getPath()).getParent()); dialog.setMessage(sb.toString()); dialog.show(); } /** * 删除音乐 */ private void deleteMusic(final Music music) { AlertDialog.Builder dialog = new AlertDialog.Builder(getContext()); String title = music.getTitle(); String msg = getString(R.string.delete_music, title); dialog.setMessage(msg); dialog.setPositiveButton(R.string.delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { AppCache.getMusicList().remove(music); File file = new File(music.getPath()); if (file.delete()) { getPlayService().updatePlayingPosition(); updateView(); // 刷新媒体库 Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + music.getPath())); getContext().sendBroadcast(intent); } } }); dialog.setNegativeButton(R.string.cancel, null); dialog.show(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_WRITE_SETTINGS) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.System.canWrite(getContext())) { ToastUtils.show("授权成功,请在再次操作以设置铃声"); } } } }