2021/5/7团队
1.今日收获内容
大致地完成了本地音乐播放功能,在真机上测试了一下,可以获取本地的音乐并进行播放
public class LocalMusicFragment extends BaseFragment implements AdapterView.OnItemClickListener, OnMoreClickListener { @Bind(R.id.lv_local_music) private ListView lvLocalMusic; @Bind(R.id.v_searching) private TextView vSearching; private Loader<Cursor> loader; private PlaylistAdapter adapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_local_music, container, false); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); adapter = new PlaylistAdapter(AppCache.get().getLocalMusicList()); adapter.setOnMoreClickListener(this); lvLocalMusic.setAdapter(adapter); loadMusic(); } private void loadMusic() { lvLocalMusic.setVisibility(View.GONE); vSearching.setVisibility(View.VISIBLE); PermissionReq.with(this) .permissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE) .result(new PermissionReq.Result() { @Override public void onGranted() { initLoader(); } @Override public void onDenied() { ToastUtils.show(R.string.no_permission_storage); lvLocalMusic.setVisibility(View.VISIBLE); vSearching.setVisibility(View.GONE); } }) .request(); } private void initLoader() { loader = getActivity().getLoaderManager().initLoader(0, null, new MusicLoaderCallback(getContext(), value -> { AppCache.get().getLocalMusicList().clear(); AppCache.get().getLocalMusicList().addAll(value); lvLocalMusic.setVisibility(View.VISIBLE); vSearching.setVisibility(View.GONE); adapter.notifyDataSetChanged(); })); } @Subscribe(tags = { @Tag(RxBusTags.SCAN_MUSIC) }) public void scanMusic(Object object) { if (loader != null) { loader.forceLoad(); } } @Override protected void setListener() { lvLocalMusic.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Music music = AppCache.get().getLocalMusicList().get(position); AudioPlayer.get().addAndPlay(music); ToastUtils.show("已添加到播放列表"); } @Override public void onMoreClick(final int position) { Music music = AppCache.get().getLocalMusicList().get(position); AlertDialog.Builder dialog = new AlertDialog.Builder(getContext()); dialog.setTitle(music.getTitle()); dialog.setItems(R.array.local_music_dialog, (dialog1, which) -> { switch (which) { case 0:// 分享 shareMusic(music); break; case 1:// 设为铃声 requestSetRingtone(music); break; case 2:// 查看歌曲信息 MusicInfoActivity.start(getContext(), music); break; case 3:// 删除 deleteMusic(music); break; } }); dialog.show(); } /** * 分享音乐 */ 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(R.string.no_permission_setting); Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); intent.setData(Uri.parse("package:" + getContext().getPackageName())); startActivityForResult(intent, RequestCode.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 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, (dialog1, which) -> { File file = new File(music.getPath()); if (file.delete()) { // 刷新媒体库 Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://".concat(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 == RequestCode.REQUEST_WRITE_SETTINGS) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.System.canWrite(getContext())) { ToastUtils.show(R.string.grant_permission_setting); } } } @Override public void onSaveInstanceState(Bundle outState) { int position = lvLocalMusic.getFirstVisiblePosition(); int offset = (lvLocalMusic.getChildAt(0) == null) ? 0 : lvLocalMusic.getChildAt(0).getTop(); outState.putInt(Keys.LOCAL_MUSIC_POSITION, position); outState.putInt(Keys.LOCAL_MUSIC_OFFSET, offset); } public void onRestoreInstanceState(final Bundle savedInstanceState) { lvLocalMusic.post(() -> { int position = savedInstanceState.getInt(Keys.LOCAL_MUSIC_POSITION); int offset = savedInstanceState.getInt(Keys.LOCAL_MUSIC_OFFSET); lvLocalMusic.setSelectionFromTop(position, offset); }); } }
可以播放本地音乐
2.遇到的问题
音乐代码
3.明天目标