zoukankan      html  css  js  c++  java
  • 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.明天目标

  • 相关阅读:
    mysql max_allowed_packet设置及问题
    mybatis之foreach用法
    uniapp编译小程序分包配置
    鼠标点击页面显示文字
    element ui el-date-picker 判断所选时间是否交叉
    前端处理跨域的几种方式
    uniapp的ajax封装请求
    js获取两个时间差
    vue文件下载功能
    nextTick使用
  • 原文地址:https://www.cnblogs.com/qiangini/p/14909144.html
Copyright © 2011-2022 走看看